tracdap-runtime 0.6.0rc3__tar.gz → 0.6.1.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {tracdap_runtime-0.6.0rc3/tracdap_runtime.egg-info → tracdap_runtime-0.6.1.dev2}/PKG-INFO +3 -3
  2. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/README.md +1 -1
  3. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/setup.cfg +2 -2
  4. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/models.py +12 -7
  5. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/storage.py +4 -0
  6. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/util.py +20 -12
  7. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/_helpers.py +11 -0
  8. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/repo_git.py +7 -1
  9. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/repo_pypi.py +2 -1
  10. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/storage_local.py +13 -8
  11. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_version.py +1 -1
  12. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/platform.py +2 -0
  13. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/platform_pb2.py +17 -17
  14. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2/tracdap_runtime.egg-info}/PKG-INFO +3 -3
  15. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/tracdap_runtime.egg-info/requires.txt +1 -1
  16. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/LICENSE +0 -0
  17. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/pyproject.toml +0 -0
  18. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/__init__.py +0 -0
  19. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/__init__.py +0 -0
  20. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/actors.py +0 -0
  21. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/context.py +0 -0
  22. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/dev_mode.py +0 -0
  23. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/engine.py +0 -0
  24. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/functions.py +0 -0
  25. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/graph.py +0 -0
  26. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/graph_builder.py +0 -0
  27. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_exec/runtime.py +0 -0
  28. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/__init__.py +0 -0
  29. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/config_parser.py +0 -0
  30. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/data.py +0 -0
  31. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/guard_rails.py +0 -0
  32. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/repos.py +0 -0
  33. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/schemas.py +0 -0
  34. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/shim.py +0 -0
  35. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/static_api.py +0 -0
  36. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/type_system.py +0 -0
  37. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_impl/validation.py +0 -0
  38. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/__init__.py +0 -0
  39. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/format_arrow.py +0 -0
  40. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/format_csv.py +0 -0
  41. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/format_parquet.py +0 -0
  42. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/repo_local.py +0 -0
  43. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/storage_aws.py +0 -0
  44. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/storage_azure.py +0 -0
  45. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/_plugins/storage_gcp.py +0 -0
  46. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/api/__init__.py +0 -0
  47. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/api/hook.py +0 -0
  48. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/api/model_api.py +0 -0
  49. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/api/static_api.py +0 -0
  50. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/__init__.py +3 -3
  51. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/common.py +0 -0
  52. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/common_pb2.py +0 -0
  53. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/job.py +0 -0
  54. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/job_pb2.py +0 -0
  55. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/result.py +0 -0
  56. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/result_pb2.py +0 -0
  57. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/runtime.py +0 -0
  58. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/config/runtime_pb2.py +0 -0
  59. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/exceptions.py +0 -0
  60. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/__init__.py +0 -0
  61. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/_guard.py +0 -0
  62. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/embed.py +0 -0
  63. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/plugins.py +0 -0
  64. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/repos.py +0 -0
  65. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/ext/storage.py +0 -0
  66. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/launch/__init__.py +0 -0
  67. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/launch/__main__.py +0 -0
  68. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/launch/cli.py +0 -0
  69. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/launch/launch.py +0 -0
  70. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/__init__.py +20 -20
  71. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/common.py +0 -0
  72. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/common_pb2.py +0 -0
  73. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/custom.py +0 -0
  74. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/custom_pb2.py +0 -0
  75. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/data.py +0 -0
  76. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/data_pb2.py +0 -0
  77. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/file.py +0 -0
  78. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/file_pb2.py +0 -0
  79. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/flow.py +0 -0
  80. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/flow_pb2.py +0 -0
  81. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/job.py +0 -0
  82. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/job_pb2.py +0 -0
  83. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/model.py +0 -0
  84. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/model_pb2.py +0 -0
  85. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/object.py +0 -0
  86. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/object_id.py +0 -0
  87. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/object_id_pb2.py +0 -0
  88. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/object_pb2.py +0 -0
  89. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/search.py +0 -0
  90. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/search_pb2.py +0 -0
  91. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/stoarge.py +0 -0
  92. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/stoarge_pb2.py +0 -0
  93. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/tag.py +0 -0
  94. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/tag_pb2.py +0 -0
  95. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/tag_update.py +0 -0
  96. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/tag_update_pb2.py +0 -0
  97. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/type.py +0 -0
  98. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/src/tracdap/rt/metadata/type_pb2.py +0 -0
  99. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/tracdap_runtime.egg-info/SOURCES.txt +0 -0
  100. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/tracdap_runtime.egg-info/dependency_links.txt +0 -0
  101. {tracdap_runtime-0.6.0rc3 → tracdap_runtime-0.6.1.dev2}/tracdap_runtime.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tracdap-runtime
3
- Version: 0.6.0rc3
3
+ Version: 0.6.1.dev2
4
4
  Summary: Runtime package for building models on the TRAC Data & Analytics Platform
5
5
  Home-page: https://tracdap.finos.org/
6
6
  Author: Martin Traverse
@@ -21,7 +21,7 @@ Requires-Dist: pyarrow==16.0.0
21
21
  Requires-Dist: pyyaml==6.0.1
22
22
  Requires-Dist: dulwich==0.22.1
23
23
  Requires-Dist: requests==2.32.3
24
- Requires-Dist: pandas<2.2.0,>=1.2.0
24
+ Requires-Dist: pandas<2.3.0,>=1.2.0
25
25
  Requires-Dist: numpy<2.0.0
26
26
  Provides-Extra: spark
27
27
  Requires-Dist: pyspark<3.6.0,>=3.0.0; extra == "spark"
@@ -58,7 +58,7 @@ Documentation for the TRAC platform is available on our website at
58
58
  The TRAC runtime for Python has these requirements:
59
59
 
60
60
  * Python: 3.8 up to 3.12
61
- * Pandas: 1.2 up to 2.1
61
+ * Pandas: 1.2 up to 2.2
62
62
  * PySpark 3.0 up to 3.5 (optional)
63
63
 
64
64
  3rd party libraries may impose additional constraints on supported versions of Python, Pandas or PySpark.
@@ -17,7 +17,7 @@ Documentation for the TRAC platform is available on our website at
17
17
  The TRAC runtime for Python has these requirements:
18
18
 
19
19
  * Python: 3.8 up to 3.12
20
- * Pandas: 1.2 up to 2.1
20
+ * Pandas: 1.2 up to 2.2
21
21
  * PySpark 3.0 up to 3.5 (optional)
22
22
 
23
23
  3rd party libraries may impose additional constraints on supported versions of Python, Pandas or PySpark.
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = tracdap-runtime
3
- version = 0.6.0rc3
3
+ version = 0.6.1.dev2
4
4
  description = Runtime package for building models on the TRAC Data & Analytics Platform
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -40,7 +40,7 @@ install_requires =
40
40
  dulwich == 0.22.1
41
41
  requests == 2.32.3
42
42
 
43
- pandas >= 1.2.0, < 2.2.0
43
+ pandas >= 1.2.0, < 2.3.0
44
44
  numpy < 2.0.0
45
45
 
46
46
  [options.extras_require]
@@ -44,21 +44,24 @@ class ModelLoader:
44
44
  self.__log = _util.logger_for_object(self)
45
45
 
46
46
  self.__scratch_dir = scratch_dir.joinpath("models")
47
- self.__scratch_dir.mkdir(exist_ok=True, parents=False, mode=0o750)
48
-
49
47
  self.__repos = _repos.RepositoryManager(sys_config)
50
48
  self.__scopes: tp.Dict[str, ModelLoader._ScopeState] = dict()
51
49
 
50
+ safe_scratch_dir = _util.windows_unc_path(self.__scratch_dir)
51
+ safe_scratch_dir.mkdir(exist_ok=True, parents=False, mode=0o750)
52
+
52
53
  def create_scope(self, scope: str):
53
54
 
54
55
  try:
55
56
 
56
57
  self.__log.info(f"Creating model scope [{scope}]")
57
58
 
58
- scope_scratch_dir = self.__scratch_dir.joinpath(scope)
59
- scope_scratch_dir.mkdir(exist_ok=False, parents=False, mode=0o750)
59
+ scope_dir = self.__scratch_dir.joinpath(scope)
60
60
 
61
- scope_state = ModelLoader._ScopeState(scope_scratch_dir)
61
+ safe_scope_dir = _util.windows_unc_path(scope_dir)
62
+ safe_scope_dir.mkdir(exist_ok=False, parents=False, mode=0o750)
63
+
64
+ scope_state = ModelLoader._ScopeState(scope_dir)
62
65
  self.__scopes[scope] = scope_state
63
66
 
64
67
  except FileExistsError as e:
@@ -152,7 +155,9 @@ class ModelLoader:
152
155
  # What gets cached is the checkout, which may contain multiple packages depending on the repo type
153
156
 
154
157
  else:
155
- checkout_dir.mkdir(mode=0o750, parents=True, exist_ok=False)
158
+ safe_checkout_dir = _util.windows_unc_path(checkout_dir)
159
+ safe_checkout_dir.mkdir(mode=0o750, parents=True, exist_ok=False)
160
+
156
161
  package_dir = repo.do_checkout(model_def, checkout_dir)
157
162
 
158
163
  scope_state.code_cache[code_cache_key] = checkout_dir
@@ -189,7 +194,7 @@ class ModelLoader:
189
194
 
190
195
  try:
191
196
 
192
- model: _api.TracModel = object.__new__(model_class)
197
+ model: _api.TracModel = _api.TracModel.__new__(model_class)
193
198
  model_class.__init__(model)
194
199
 
195
200
  attributes = model.define_attributes()
@@ -214,6 +214,10 @@ class CommonFileStorage(IFileStorage):
214
214
  fs_impl = "arrow"
215
215
  fs_root = fs.base_path
216
216
 
217
+ # On Windows, sanitise UNC root paths for logging
218
+ if _util.is_windows() and fs_root.startswith("//?/"):
219
+ fs_root = fs_root[4:]
220
+
217
221
  # If this is an FSSpec implementation, take the protocol from FSSpec as the FS type
218
222
  base_fs = fs.base_fs
219
223
  if isinstance(base_fs, pa_fs.PyFileSystem):
@@ -264,27 +264,25 @@ def get_args(metaclass: type):
264
264
 
265
265
  def try_clean_dir(dir_path: pathlib.Path, remove: bool = False) -> bool:
266
266
 
267
+ normalized_path = windows_unc_path(dir_path)
268
+
269
+ return __try_clean_dir(normalized_path, remove)
270
+
271
+
272
+ def __try_clean_dir(normalized_path, remove):
273
+
267
274
  clean_ok = True
268
- normalized_path = dir_path.resolve()
269
275
 
270
276
  for item in normalized_path.iterdir():
271
277
 
272
278
  if item.is_dir():
273
- clean_ok &= try_clean_dir(item, remove=True)
279
+ clean_ok &= __try_clean_dir(item, remove=True)
274
280
 
275
281
  else:
276
282
  try:
277
- # Windows MAX_PATH = 260 characters, including the drive letter and terminating nul character
278
- # In Python the path string does not include a nul, so we need to limit to 259 characters
279
- if is_windows() and len(str(item)) >= 259 and not str(item).startswith("\\\\?\\"):
280
- unc_item = pathlib.Path("\\\\?\\" + str(item))
281
- unc_item.unlink()
282
- return True
283
- else:
284
- item.unlink()
285
- return True
283
+ item.unlink()
286
284
  except Exception as e: # noqa
287
- return False
285
+ clean_ok = False
288
286
 
289
287
  if remove:
290
288
  try:
@@ -294,6 +292,16 @@ def try_clean_dir(dir_path: pathlib.Path, remove: bool = False) -> bool:
294
292
  return False
295
293
 
296
294
 
295
+ def windows_unc_path(path: pathlib.Path) -> pathlib.Path:
296
+
297
+ # Convert a path to its UNC form on Windows
298
+
299
+ if is_windows() and not str(path).startswith("\\\\?\\"):
300
+ return pathlib.Path("\\\\?\\" + str(path.resolve()))
301
+ else:
302
+ return path
303
+
304
+
297
305
  def error_details_from_trace(trace: tb.StackSummary):
298
306
  last_frame = trace[len(trace) - 1]
299
307
  filename = pathlib.PurePath(last_frame.filename).name
@@ -18,6 +18,7 @@
18
18
  # And we don't want to put them .ext, those are public APIs that need to be maintained
19
19
 
20
20
  import logging
21
+ import pathlib
21
22
  import platform
22
23
  import urllib.parse
23
24
  import typing as tp
@@ -180,6 +181,16 @@ def is_windows():
180
181
  return __IS_WINDOWS
181
182
 
182
183
 
184
+ def windows_unc_path(path: pathlib.Path) -> pathlib.Path:
185
+
186
+ # Convert a path to its UNC form on Windows
187
+
188
+ if is_windows() and not str(path).startswith("\\\\?\\"):
189
+ return pathlib.Path("\\\\?\\" + str(path.resolve()))
190
+ else:
191
+ return path
192
+
193
+
183
194
  def logger_for_object(obj: object) -> logging.Logger:
184
195
  return logger_for_class(obj.__class__)
185
196
 
@@ -93,6 +93,11 @@ class GitRepository(IModelRepository):
93
93
 
94
94
  self._log.info(f"Checkout mechanism: [native]")
95
95
 
96
+ # Using windows_safe_path() to create UNC paths does not always work with Windows native Git
97
+ # So, use the regular checkout_dir, and set core.longpaths = true once the repo is created
98
+ # This will fail if the path for the repo config file exceeds the Windows MAX_PATH length
99
+ # I.e. checkout_dir/.git/config
100
+
96
101
  git_cli = ["git", "-C", str(checkout_dir)]
97
102
 
98
103
  git_cmds = [
@@ -169,7 +174,8 @@ class GitRepository(IModelRepository):
169
174
 
170
175
  self._log.info("=> git init")
171
176
 
172
- repo = git_repo.Repo.init(str(checkout_dir))
177
+ safe_checkout_dir = _helpers.windows_unc_path(checkout_dir)
178
+ repo = git_repo.Repo.init(str(safe_checkout_dir))
173
179
  self._apply_config_from_properties(repo)
174
180
 
175
181
  # Set up origin
@@ -98,8 +98,9 @@ class PyPiRepository(IModelRepository):
98
98
 
99
99
  self._log.info(f"Downloaded [{len(content) / 1024:.1f}] KB in [{elapsed.total_seconds():.1f}] seconds")
100
100
 
101
+ safe_checkout_dir = _helpers.windows_unc_path(checkout_dir)
101
102
  download_whl = zipfile.ZipFile(io.BytesIO(download_req.content))
102
- download_whl.extractall(checkout_dir)
103
+ download_whl.extractall(safe_checkout_dir)
103
104
 
104
105
  self._log.info(f"Unpacked [{len(download_whl.filelist)}] files")
105
106
  self._log.info(f"PyPI checkout succeeded for {model_def.package} {model_def.version}")
@@ -61,7 +61,9 @@ class LocalStorageProvider(IStorageProvider):
61
61
 
62
62
  def get_arrow_native(self) -> afs.SubTreeFileSystem:
63
63
  root_fs = afs.LocalFileSystem()
64
- return afs.SubTreeFileSystem(str(self._root_path), root_fs)
64
+ # Use a UNC root path on Windows to avoid max path length issues
65
+ sub_tree_path = _helpers.windows_unc_path(self._root_path)
66
+ return afs.SubTreeFileSystem(str(sub_tree_path), root_fs)
65
67
 
66
68
  def get_file_storage(self) -> IFileStorage:
67
69
 
@@ -140,10 +142,9 @@ class LocalFileStorage(IFileStorage):
140
142
  self._properties = config.properties
141
143
  self._options = options # Not used
142
144
 
143
- self._root_path = LocalStorageProvider.check_root_path(self._properties, self._log)
144
-
145
- def _get_root(self):
146
- return self._root_path
145
+ # Use a UNC root path on Windows to avoid max path length issues
146
+ self._raw_root_path = LocalStorageProvider.check_root_path(self._properties, self._log)
147
+ self._root_path = _helpers.windows_unc_path(self._raw_root_path)
147
148
 
148
149
  def exists(self, storage_path: str) -> bool:
149
150
 
@@ -358,8 +359,12 @@ class LocalFileStorage(IFileStorage):
358
359
  if relative_path.is_absolute():
359
360
  raise ex.EStorageValidation(f"Storage path is not relative: {operation_name} [{storage_path}]")
360
361
 
361
- root_path = self._root_path
362
- absolute_path = self._root_path.joinpath(relative_path).resolve(False)
362
+ # UNC paths on Windows have different behaviour for join / resolve
363
+ # Work on the raw path, then convert back to UNC afterward
364
+ # For other OSes, this is a no-op
365
+
366
+ root_path = self._raw_root_path
367
+ absolute_path = self._raw_root_path.joinpath(relative_path).resolve(False)
363
368
 
364
369
  # is_relative_to only supported in Python 3.9+, we need to support 3.7
365
370
  if absolute_path != root_path and root_path not in absolute_path.parents:
@@ -368,7 +373,7 @@ class LocalFileStorage(IFileStorage):
368
373
  if absolute_path == root_path and not allow_root_dir:
369
374
  raise ex.EStorageValidation(f"Illegal operation for storage root: {operation_name} [{storage_path}]")
370
375
 
371
- return absolute_path
376
+ return _helpers.windows_unc_path(absolute_path)
372
377
 
373
378
  except ValueError as e:
374
379
 
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- __version__ = "0.6.0rc3"
15
+ __version__ = "0.6.1.dev2"
@@ -116,6 +116,8 @@ class GatewayConfig:
116
116
 
117
117
  routes: _tp.List[RouteConfig] = _dc.field(default_factory=list)
118
118
 
119
+ redirects: _tp.List[WebServerRedirect] = _dc.field(default_factory=list)
120
+
119
121
 
120
122
  @_dc.dataclass
121
123
  class RouteConfig:
@@ -16,7 +16,7 @@ from tracdap.metadata import common_pb2 as tracdap_dot_metadata_dot_common__pb2
16
16
  from tracdap.config import common_pb2 as tracdap_dot_config_dot_common__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dtracdap/config/platform.proto\x12\x0etracdap.config\x1a\x1dtracdap/metadata/common.proto\x1a\x1btracdap/config/common.proto\"\xa4\x08\n\x0ePlatformConfig\x12:\n\x06\x63onfig\x18\x01 \x03(\x0b\x32*.tracdap.config.PlatformConfig.ConfigEntry\x12\x32\n\x0cplatformInfo\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.PlatformInfo\x12<\n\x0e\x61uthentication\x18\x05 \x01(\x0b\x32$.tracdap.config.AuthenticationConfig\x12\x30\n\x08metadata\x18\x06 \x01(\x0b\x32\x1e.tracdap.config.MetadataConfig\x12.\n\x07storage\x18\x07 \x01(\x0b\x32\x1d.tracdap.config.StorageConfig\x12\x46\n\x0crepositories\x18\x08 \x03(\x0b\x32\x30.tracdap.config.PlatformConfig.RepositoriesEntry\x12.\n\x08\x65xecutor\x18\t \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12.\n\x08jobCache\x18\x0c \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12<\n\x07tenants\x18\n \x03(\x0b\x32+.tracdap.config.PlatformConfig.TenantsEntry\x12\x37\n\twebServer\x18\x0b \x01(\x0b\x32\x1f.tracdap.config.WebServerConfigH\x00\x88\x01\x01\x12\x33\n\x07gateway\x18\r \x01(\x0b\x32\x1d.tracdap.config.GatewayConfigH\x01\x88\x01\x01\x12>\n\x08services\x18\x04 \x03(\x0b\x32,.tracdap.config.PlatformConfig.ServicesEntry\x12\x34\n\ndeployment\x18\x0e \x01(\x0b\x32 .tracdap.config.DeploymentConfig\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1aQ\n\x11RepositoriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig:\x02\x38\x01\x1aL\n\x0cTenantsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.TenantConfig:\x02\x38\x01\x1aN\n\rServicesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x1d.tracdap.config.ServiceConfig:\x02\x38\x01\x42\x0c\n\n_webServerB\n\n\x08_gateway\"r\n\x0eMetadataConfig\x12.\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12\x30\n\x06\x66ormat\x18\x02 \x01(\x0e\x32 .tracdap.metadata.MetadataFormat\"j\n\x0cTenantConfig\x12\x1a\n\rdefaultBucket\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rdefaultFormat\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x10\n\x0e_defaultBucketB\x10\n\x0e_defaultFormat\"\xc7\x01\n\x0fWebServerConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x31\n\x0b\x63ontentRoot\x18\x03 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12:\n\x0crewriteRules\x18\x04 \x03(\x0b\x32$.tracdap.config.WebServerRewriteRule\x12\x34\n\tredirects\x18\x05 \x03(\x0b\x32!.tracdap.config.WebServerRedirect\"6\n\x14WebServerRewriteRule\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\"C\n\x11WebServerRedirect\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\x05\"Q\n\rGatewayConfig\x12\x13\n\x0bidleTimeout\x18\x01 \x01(\r\x12+\n\x06routes\x18\x02 \x03(\x0b\x32\x1b.tracdap.config.RouteConfig\"\xe4\x01\n\x0bRouteConfig\x12\x11\n\trouteName\x18\x01 \x01(\t\x12\x32\n\trouteType\x18\x02 \x01(\x0e\x32\x1f.tracdap.config.RoutingProtocol\x12\x32\n\tprotocols\x18\x03 \x03(\x0e\x32\x1f.tracdap.config.RoutingProtocol\x12+\n\x05match\x18\x05 \x01(\x0b\x32\x1c.tracdap.config.RoutingMatch\x12-\n\x06target\x18\x06 \x01(\x0b\x32\x1d.tracdap.config.RoutingTarget\"*\n\x0cRoutingMatch\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"I\n\rRoutingTarget\x12\x0e\n\x06scheme\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\x12\x0c\n\x04path\x18\x04 \x01(\t\"N\n\rServiceConfig\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\rB\n\n\x08_enabled\"D\n\x10\x44\x65ploymentConfig\x12\x30\n\x06layout\x18\x01 \x01(\x0e\x32 .tracdap.config.DeploymentLayout*S\n\x0fRoutingProtocol\x12\x14\n\x10PROTOCOL_NOT_SET\x10\x00\x12\x08\n\x04HTTP\x10\x01\x12\x08\n\x04GRPC\x10\x02\x12\x0c\n\x08GRPC_WEB\x10\x03\x12\x08\n\x04REST\x10\x04*K\n\x10\x44\x65ploymentLayout\x12\x12\n\x0eLAYOUT_NOT_SET\x10\x00\x12\x0b\n\x07SANDBOX\x10\x01\x12\n\n\x06HOSTED\x10\x02\x12\n\n\x06\x43USTOM\x10\x03\x42\x1c\n\x18org.finos.tracdap.configP\x01\x62\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dtracdap/config/platform.proto\x12\x0etracdap.config\x1a\x1dtracdap/metadata/common.proto\x1a\x1btracdap/config/common.proto\"\xa4\x08\n\x0ePlatformConfig\x12:\n\x06\x63onfig\x18\x01 \x03(\x0b\x32*.tracdap.config.PlatformConfig.ConfigEntry\x12\x32\n\x0cplatformInfo\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.PlatformInfo\x12<\n\x0e\x61uthentication\x18\x05 \x01(\x0b\x32$.tracdap.config.AuthenticationConfig\x12\x30\n\x08metadata\x18\x06 \x01(\x0b\x32\x1e.tracdap.config.MetadataConfig\x12.\n\x07storage\x18\x07 \x01(\x0b\x32\x1d.tracdap.config.StorageConfig\x12\x46\n\x0crepositories\x18\x08 \x03(\x0b\x32\x30.tracdap.config.PlatformConfig.RepositoriesEntry\x12.\n\x08\x65xecutor\x18\t \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12.\n\x08jobCache\x18\x0c \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12<\n\x07tenants\x18\n \x03(\x0b\x32+.tracdap.config.PlatformConfig.TenantsEntry\x12\x37\n\twebServer\x18\x0b \x01(\x0b\x32\x1f.tracdap.config.WebServerConfigH\x00\x88\x01\x01\x12\x33\n\x07gateway\x18\r \x01(\x0b\x32\x1d.tracdap.config.GatewayConfigH\x01\x88\x01\x01\x12>\n\x08services\x18\x04 \x03(\x0b\x32,.tracdap.config.PlatformConfig.ServicesEntry\x12\x34\n\ndeployment\x18\x0e \x01(\x0b\x32 .tracdap.config.DeploymentConfig\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1aQ\n\x11RepositoriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig:\x02\x38\x01\x1aL\n\x0cTenantsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.TenantConfig:\x02\x38\x01\x1aN\n\rServicesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x1d.tracdap.config.ServiceConfig:\x02\x38\x01\x42\x0c\n\n_webServerB\n\n\x08_gateway\"r\n\x0eMetadataConfig\x12.\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12\x30\n\x06\x66ormat\x18\x02 \x01(\x0e\x32 .tracdap.metadata.MetadataFormat\"j\n\x0cTenantConfig\x12\x1a\n\rdefaultBucket\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rdefaultFormat\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x10\n\x0e_defaultBucketB\x10\n\x0e_defaultFormat\"\xc7\x01\n\x0fWebServerConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x31\n\x0b\x63ontentRoot\x18\x03 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig\x12:\n\x0crewriteRules\x18\x04 \x03(\x0b\x32$.tracdap.config.WebServerRewriteRule\x12\x34\n\tredirects\x18\x05 \x03(\x0b\x32!.tracdap.config.WebServerRedirect\"6\n\x14WebServerRewriteRule\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\"C\n\x11WebServerRedirect\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\x05\"\x87\x01\n\rGatewayConfig\x12\x13\n\x0bidleTimeout\x18\x01 \x01(\r\x12+\n\x06routes\x18\x02 \x03(\x0b\x32\x1b.tracdap.config.RouteConfig\x12\x34\n\tredirects\x18\x03 \x03(\x0b\x32!.tracdap.config.WebServerRedirect\"\xe4\x01\n\x0bRouteConfig\x12\x11\n\trouteName\x18\x01 \x01(\t\x12\x32\n\trouteType\x18\x02 \x01(\x0e\x32\x1f.tracdap.config.RoutingProtocol\x12\x32\n\tprotocols\x18\x03 \x03(\x0e\x32\x1f.tracdap.config.RoutingProtocol\x12+\n\x05match\x18\x05 \x01(\x0b\x32\x1c.tracdap.config.RoutingMatch\x12-\n\x06target\x18\x06 \x01(\x0b\x32\x1d.tracdap.config.RoutingTarget\"*\n\x0cRoutingMatch\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"I\n\rRoutingTarget\x12\x0e\n\x06scheme\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\x12\x0c\n\x04path\x18\x04 \x01(\t\"N\n\rServiceConfig\x12\x14\n\x07\x65nabled\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\r\n\x05\x61lias\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\rB\n\n\x08_enabled\"D\n\x10\x44\x65ploymentConfig\x12\x30\n\x06layout\x18\x01 \x01(\x0e\x32 .tracdap.config.DeploymentLayout*S\n\x0fRoutingProtocol\x12\x14\n\x10PROTOCOL_NOT_SET\x10\x00\x12\x08\n\x04HTTP\x10\x01\x12\x08\n\x04GRPC\x10\x02\x12\x0c\n\x08GRPC_WEB\x10\x03\x12\x08\n\x04REST\x10\x04*K\n\x10\x44\x65ploymentLayout\x12\x12\n\x0eLAYOUT_NOT_SET\x10\x00\x12\x0b\n\x07SANDBOX\x10\x01\x12\n\n\x06HOSTED\x10\x02\x12\n\n\x06\x43USTOM\x10\x03\x42\x1c\n\x18org.finos.tracdap.configP\x01\x62\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -32,10 +32,10 @@ if _descriptor._USE_C_DESCRIPTORS == False:
32
32
  _globals['_PLATFORMCONFIG_TENANTSENTRY']._serialized_options = b'8\001'
33
33
  _globals['_PLATFORMCONFIG_SERVICESENTRY']._options = None
34
34
  _globals['_PLATFORMCONFIG_SERVICESENTRY']._serialized_options = b'8\001'
35
- _globals['_ROUTINGPROTOCOL']._serialized_start=2306
36
- _globals['_ROUTINGPROTOCOL']._serialized_end=2389
37
- _globals['_DEPLOYMENTLAYOUT']._serialized_start=2391
38
- _globals['_DEPLOYMENTLAYOUT']._serialized_end=2466
35
+ _globals['_ROUTINGPROTOCOL']._serialized_start=2361
36
+ _globals['_ROUTINGPROTOCOL']._serialized_end=2444
37
+ _globals['_DEPLOYMENTLAYOUT']._serialized_start=2446
38
+ _globals['_DEPLOYMENTLAYOUT']._serialized_end=2521
39
39
  _globals['_PLATFORMCONFIG']._serialized_start=110
40
40
  _globals['_PLATFORMCONFIG']._serialized_end=1170
41
41
  _globals['_PLATFORMCONFIG_CONFIGENTRY']._serialized_start=858
@@ -56,16 +56,16 @@ if _descriptor._USE_C_DESCRIPTORS == False:
56
56
  _globals['_WEBSERVERREWRITERULE']._serialized_end=1652
57
57
  _globals['_WEBSERVERREDIRECT']._serialized_start=1654
58
58
  _globals['_WEBSERVERREDIRECT']._serialized_end=1721
59
- _globals['_GATEWAYCONFIG']._serialized_start=1723
60
- _globals['_GATEWAYCONFIG']._serialized_end=1804
61
- _globals['_ROUTECONFIG']._serialized_start=1807
62
- _globals['_ROUTECONFIG']._serialized_end=2035
63
- _globals['_ROUTINGMATCH']._serialized_start=2037
64
- _globals['_ROUTINGMATCH']._serialized_end=2079
65
- _globals['_ROUTINGTARGET']._serialized_start=2081
66
- _globals['_ROUTINGTARGET']._serialized_end=2154
67
- _globals['_SERVICECONFIG']._serialized_start=2156
68
- _globals['_SERVICECONFIG']._serialized_end=2234
69
- _globals['_DEPLOYMENTCONFIG']._serialized_start=2236
70
- _globals['_DEPLOYMENTCONFIG']._serialized_end=2304
59
+ _globals['_GATEWAYCONFIG']._serialized_start=1724
60
+ _globals['_GATEWAYCONFIG']._serialized_end=1859
61
+ _globals['_ROUTECONFIG']._serialized_start=1862
62
+ _globals['_ROUTECONFIG']._serialized_end=2090
63
+ _globals['_ROUTINGMATCH']._serialized_start=2092
64
+ _globals['_ROUTINGMATCH']._serialized_end=2134
65
+ _globals['_ROUTINGTARGET']._serialized_start=2136
66
+ _globals['_ROUTINGTARGET']._serialized_end=2209
67
+ _globals['_SERVICECONFIG']._serialized_start=2211
68
+ _globals['_SERVICECONFIG']._serialized_end=2289
69
+ _globals['_DEPLOYMENTCONFIG']._serialized_start=2291
70
+ _globals['_DEPLOYMENTCONFIG']._serialized_end=2359
71
71
  # @@protoc_insertion_point(module_scope)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tracdap-runtime
3
- Version: 0.6.0rc3
3
+ Version: 0.6.1.dev2
4
4
  Summary: Runtime package for building models on the TRAC Data & Analytics Platform
5
5
  Home-page: https://tracdap.finos.org/
6
6
  Author: Martin Traverse
@@ -21,7 +21,7 @@ Requires-Dist: pyarrow==16.0.0
21
21
  Requires-Dist: pyyaml==6.0.1
22
22
  Requires-Dist: dulwich==0.22.1
23
23
  Requires-Dist: requests==2.32.3
24
- Requires-Dist: pandas<2.2.0,>=1.2.0
24
+ Requires-Dist: pandas<2.3.0,>=1.2.0
25
25
  Requires-Dist: numpy<2.0.0
26
26
  Provides-Extra: spark
27
27
  Requires-Dist: pyspark<3.6.0,>=3.0.0; extra == "spark"
@@ -58,7 +58,7 @@ Documentation for the TRAC platform is available on our website at
58
58
  The TRAC runtime for Python has these requirements:
59
59
 
60
60
  * Python: 3.8 up to 3.12
61
- * Pandas: 1.2 up to 2.1
61
+ * Pandas: 1.2 up to 2.2
62
62
  * PySpark 3.0 up to 3.5 (optional)
63
63
 
64
64
  3rd party libraries may impose additional constraints on supported versions of Python, Pandas or PySpark.
@@ -3,7 +3,7 @@ pyarrow==16.0.0
3
3
  pyyaml==6.0.1
4
4
  dulwich==0.22.1
5
5
  requests==2.32.3
6
- pandas<2.2.0,>=1.2.0
6
+ pandas<2.3.0,>=1.2.0
7
7
  numpy<2.0.0
8
8
 
9
9
  [aws]
@@ -6,6 +6,9 @@ from .common import PlatformInfo
6
6
  from .common import AuthenticationConfig
7
7
  from .common import StorageConfig
8
8
 
9
+ from .runtime import RuntimeConfig
10
+ from .runtime import SparkSettings
11
+
9
12
  from .platform import RoutingProtocol
10
13
  from .platform import DeploymentLayout
11
14
  from .platform import PlatformConfig
@@ -24,7 +27,4 @@ from .platform import DeploymentConfig
24
27
  from .result import TagUpdateList
25
28
  from .result import JobResult
26
29
 
27
- from .runtime import RuntimeConfig
28
- from .runtime import SparkSettings
29
-
30
30
  from .job import JobConfig
@@ -1,5 +1,7 @@
1
1
  # Code generated by TRAC
2
2
 
3
+ from .custom import CustomDefinition
4
+
3
5
  from .common import MetadataFormat
4
6
  from .common import MetadataVersion
5
7
  from .common import TenantInfo
@@ -17,12 +19,10 @@ from .object_id import ObjectType
17
19
  from .object_id import TagHeader
18
20
  from .object_id import TagSelector
19
21
 
20
- from .search import SearchOperator
21
- from .search import LogicalOperator
22
- from .search import SearchTerm
23
- from .search import LogicalExpression
24
- from .search import SearchExpression
25
- from .search import SearchParameters
22
+ from .file import FileDefinition
23
+
24
+ from .tag_update import TagOperation
25
+ from .tag_update import TagUpdate
26
26
 
27
27
  from .data import SchemaType
28
28
  from .data import PartType
@@ -32,29 +32,31 @@ from .data import SchemaDefinition
32
32
  from .data import PartKey
33
33
  from .data import DataDefinition
34
34
 
35
- from .file import FileDefinition
36
-
37
- from .stoarge import CopyStatus
38
- from .stoarge import IncarnationStatus
39
- from .stoarge import StorageCopy
40
- from .stoarge import StorageIncarnation
41
- from .stoarge import StorageItem
42
- from .stoarge import StorageDefinition
43
-
44
- from .tag_update import TagOperation
45
- from .tag_update import TagUpdate
46
-
47
35
  from .model import ModelParameter
48
36
  from .model import ModelInputSchema
49
37
  from .model import ModelOutputSchema
50
38
  from .model import ModelDefinition
51
39
 
40
+ from .search import SearchOperator
41
+ from .search import LogicalOperator
42
+ from .search import SearchTerm
43
+ from .search import LogicalExpression
44
+ from .search import SearchExpression
45
+ from .search import SearchParameters
46
+
52
47
  from .flow import FlowNodeType
53
48
  from .flow import FlowNode
54
49
  from .flow import FlowSocket
55
50
  from .flow import FlowEdge
56
51
  from .flow import FlowDefinition
57
52
 
53
+ from .stoarge import CopyStatus
54
+ from .stoarge import IncarnationStatus
55
+ from .stoarge import StorageCopy
56
+ from .stoarge import StorageIncarnation
57
+ from .stoarge import StorageItem
58
+ from .stoarge import StorageDefinition
59
+
58
60
  from .job import JobType
59
61
  from .job import JobStatusCode
60
62
  from .job import JobDefinition
@@ -62,8 +64,6 @@ from .job import RunModelJob
62
64
  from .job import RunFlowJob
63
65
  from .job import ImportModelJob
64
66
 
65
- from .custom import CustomDefinition
66
-
67
67
  from .object import ObjectDefinition
68
68
 
69
69
  from .tag import Tag