ts_utils.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import os
  2. import errno
  3. from build.plugins.lib.nots.package_manager.base import PackageJson
  4. from build.plugins.lib.nots.package_manager.base.utils import build_pj_path
  5. from build.plugins.lib.nots.typescript import TsConfig, DEFAULT_TS_CONFIG_FILE
  6. def link_test_data(build_root, source_root, test_for_path, dirs, dirs_rename):
  7. if not len(dirs):
  8. return
  9. dirs_rename_map = build_dirs_rename_map(dirs_rename) if dirs_rename else []
  10. rel_test_for_path = os.path.relpath(test_for_path, build_root)
  11. rel_dirs = [os.path.join(os.path.relpath(dir, rel_test_for_path), "") for dir in dirs]
  12. renamed_build_dirs = rel_dirs
  13. def rename_dir(dir):
  14. renamed_dir = dir
  15. for kv in dirs_rename_map:
  16. rename_from, rename_to = kv
  17. if not dir.startswith(rename_from):
  18. continue
  19. renamed_dir = renamed_dir.replace(rename_from, rename_to, 1)
  20. break
  21. return renamed_dir
  22. if len(dirs_rename_map):
  23. renamed_build_dirs = map(rename_dir, renamed_build_dirs)
  24. dirs_map = {renamed_build_dirs[i]: rel_dirs[i] for i in range(len(rel_dirs))}
  25. symlink_build_dirs = get_top_level_dirs(renamed_build_dirs)
  26. for build_dir in symlink_build_dirs:
  27. src_dir = dirs_map[build_dir]
  28. abs_dir_source_path = os.path.join(source_root, rel_test_for_path, src_dir.rstrip(os.sep))
  29. abs_dir_build_path = os.path.join(build_root, rel_test_for_path, build_dir.rstrip(os.sep))
  30. try:
  31. os.makedirs(os.path.dirname(abs_dir_build_path))
  32. except OSError:
  33. pass
  34. try:
  35. os.symlink(abs_dir_source_path, abs_dir_build_path)
  36. except OSError as e:
  37. if e.errno == errno.EEXIST:
  38. msg = (
  39. "Unable to create symlink to test data from \"{}\" to \"{}\". Directory in bindir is already created. "
  40. "Try to save test data in a separate folder".format(abs_dir_source_path, abs_dir_build_path)
  41. )
  42. raise ValueError(msg)
  43. raise
  44. def build_dirs_rename_map(dirs_rename):
  45. dirs_rename_map = []
  46. for from_to in filter(None, dirs_rename.split(";")):
  47. rename_from, rename_to = [
  48. os.path.join(v.replace("\\", os.sep).replace("/", os.sep), "") for v in from_to.split(":")
  49. ]
  50. dirs_rename_map.append([rename_from, rename_to])
  51. return dirs_rename_map
  52. def get_top_level_dirs(dirs):
  53. sorted_dirs = sorted(dirs, key=len)
  54. top_level_dirs = set()
  55. for idx, dir in enumerate(sorted_dirs):
  56. if idx == 0:
  57. top_level_dirs.add(dir)
  58. continue
  59. if not any(dir.startswith(tld) for tld in top_level_dirs):
  60. top_level_dirs.add(dir)
  61. return top_level_dirs
  62. def create_bin_tsconfig(module_arc_path, source_root, bin_root):
  63. """
  64. Creating a tsconfig.json config file inlining the required base files if any
  65. """
  66. source_path = os.path.join(source_root, module_arc_path)
  67. bin_path = os.path.join(bin_root, module_arc_path)
  68. ts_config = TsConfig.load(os.path.join(source_path, DEFAULT_TS_CONFIG_FILE))
  69. pj = PackageJson.load(build_pj_path(source_path))
  70. ts_config.inline_extend(pj.get_dep_paths_by_names())
  71. bin_ts_config_path = os.path.join(bin_path, DEFAULT_TS_CONFIG_FILE)
  72. ts_config.write(bin_ts_config_path, indent=4)
  73. return bin_ts_config_path