tracdap-runtime 0.6.0rc2__tar.gz → 0.6.1__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 (107) hide show
  1. {tracdap-runtime-0.6.0rc2/tracdap_runtime.egg-info → tracdap_runtime-0.6.1}/PKG-INFO +24 -23
  2. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/README.md +4 -4
  3. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/setup.cfg +20 -19
  4. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/data.py +53 -16
  5. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/models.py +12 -7
  6. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/storage.py +4 -0
  7. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/util.py +20 -12
  8. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/_helpers.py +11 -0
  9. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/repo_git.py +7 -1
  10. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/repo_pypi.py +2 -1
  11. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/storage_local.py +13 -8
  12. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_version.py +1 -1
  13. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/__init__.py +11 -16
  14. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/common.py +10 -0
  15. tracdap_runtime-0.6.1/src/tracdap/rt/config/common_pb2.py +55 -0
  16. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/job_pb2.py +21 -20
  17. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/platform.py +62 -25
  18. tracdap_runtime-0.6.1/src/tracdap/rt/config/platform_pb2.py +71 -0
  19. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/result_pb2.py +15 -14
  20. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/runtime.py +0 -1
  21. tracdap_runtime-0.6.1/src/tracdap/rt/config/runtime_pb2.py +42 -0
  22. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/common_pb2.py +15 -14
  23. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/custom_pb2.py +9 -8
  24. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/data_pb2.py +31 -30
  25. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/file_pb2.py +9 -8
  26. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/flow_pb2.py +33 -32
  27. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/job_pb2.py +55 -54
  28. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/model_pb2.py +31 -30
  29. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/object_id_pb2.py +13 -12
  30. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/object_pb2.py +9 -8
  31. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/search_pb2.py +19 -18
  32. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/stoarge_pb2.py +31 -30
  33. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/tag_pb2.py +13 -12
  34. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/tag_update_pb2.py +11 -10
  35. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/type_pb2.py +29 -28
  36. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1/tracdap_runtime.egg-info}/PKG-INFO +24 -23
  37. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/tracdap_runtime.egg-info/SOURCES.txt +0 -2
  38. tracdap_runtime-0.6.1/tracdap_runtime.egg-info/requires.txt +26 -0
  39. tracdap-runtime-0.6.0rc2/src/tracdap/rt/config/common_pb2.py +0 -48
  40. tracdap-runtime-0.6.0rc2/src/tracdap/rt/config/gateway.py +0 -104
  41. tracdap-runtime-0.6.0rc2/src/tracdap/rt/config/gateway_pb2.py +0 -45
  42. tracdap-runtime-0.6.0rc2/src/tracdap/rt/config/platform_pb2.py +0 -64
  43. tracdap-runtime-0.6.0rc2/src/tracdap/rt/config/runtime_pb2.py +0 -42
  44. tracdap-runtime-0.6.0rc2/tracdap_runtime.egg-info/requires.txt +0 -25
  45. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/LICENSE +0 -0
  46. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/pyproject.toml +0 -0
  47. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/__init__.py +0 -0
  48. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/__init__.py +0 -0
  49. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/actors.py +0 -0
  50. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/context.py +0 -0
  51. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/dev_mode.py +0 -0
  52. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/engine.py +0 -0
  53. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/functions.py +0 -0
  54. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/graph.py +0 -0
  55. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/graph_builder.py +0 -0
  56. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_exec/runtime.py +0 -0
  57. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/__init__.py +0 -0
  58. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/config_parser.py +0 -0
  59. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/guard_rails.py +0 -0
  60. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/repos.py +0 -0
  61. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/schemas.py +0 -0
  62. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/shim.py +0 -0
  63. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/static_api.py +0 -0
  64. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/type_system.py +0 -0
  65. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_impl/validation.py +0 -0
  66. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/__init__.py +0 -0
  67. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/format_arrow.py +0 -0
  68. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/format_csv.py +0 -0
  69. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/format_parquet.py +0 -0
  70. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/repo_local.py +0 -0
  71. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/storage_aws.py +0 -0
  72. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/storage_azure.py +0 -0
  73. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/_plugins/storage_gcp.py +0 -0
  74. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/api/__init__.py +0 -0
  75. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/api/hook.py +0 -0
  76. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/api/model_api.py +0 -0
  77. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/api/static_api.py +0 -0
  78. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/job.py +0 -0
  79. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/config/result.py +0 -0
  80. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/exceptions.py +0 -0
  81. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/__init__.py +0 -0
  82. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/_guard.py +0 -0
  83. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/embed.py +0 -0
  84. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/plugins.py +0 -0
  85. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/repos.py +0 -0
  86. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/ext/storage.py +0 -0
  87. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/launch/__init__.py +0 -0
  88. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/launch/__main__.py +0 -0
  89. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/launch/cli.py +0 -0
  90. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/launch/launch.py +0 -0
  91. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/__init__.py +18 -18
  92. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/common.py +0 -0
  93. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/custom.py +0 -0
  94. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/data.py +0 -0
  95. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/file.py +0 -0
  96. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/flow.py +0 -0
  97. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/job.py +0 -0
  98. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/model.py +0 -0
  99. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/object.py +0 -0
  100. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/object_id.py +0 -0
  101. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/search.py +0 -0
  102. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/stoarge.py +0 -0
  103. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/tag.py +0 -0
  104. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/tag_update.py +0 -0
  105. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/src/tracdap/rt/metadata/type.py +0 -0
  106. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/tracdap_runtime.egg-info/dependency_links.txt +0 -0
  107. {tracdap-runtime-0.6.0rc2 → tracdap_runtime-0.6.1}/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.0rc2
3
+ Version: 0.6.1
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
@@ -13,30 +13,31 @@ Platform: any
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: License :: OSI Approved :: Apache Software License
15
15
  Classifier: Operating System :: OS Independent
16
- Requires-Python: <3.12,>=3.8
16
+ Requires-Python: <3.13,>=3.8
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
- Requires-Dist: protobuf==4.23.2
20
- Requires-Dist: pyarrow==13.0.0
21
- Requires-Dist: pyyaml==6.0.0
22
- Requires-Dist: dulwich==0.21.5
23
- Requires-Dist: requests==2.31.0
24
- Requires-Dist: pandas<1.6.0,>=1.2.0
19
+ Requires-Dist: protobuf==4.25.3
20
+ Requires-Dist: pyarrow==16.0.0
21
+ Requires-Dist: pyyaml==6.0.1
22
+ Requires-Dist: dulwich==0.22.1
23
+ Requires-Dist: requests==2.32.3
24
+ Requires-Dist: pandas<2.3.0,>=1.2.0
25
+ Requires-Dist: numpy<2.0.0
25
26
  Provides-Extra: spark
26
- Requires-Dist: pyspark<3.5.0,>=3.0.0; extra == "spark"
27
+ Requires-Dist: pyspark<3.6.0,>=3.0.0; extra == "spark"
27
28
  Provides-Extra: aws
28
- Requires-Dist: botocore==1.29.156; extra == "aws"
29
- Requires-Dist: boto3==1.26.156; extra == "aws"
29
+ Requires-Dist: botocore==1.34.93; extra == "aws"
30
+ Requires-Dist: boto3==1.34.93; extra == "aws"
30
31
  Provides-Extra: gcp
31
- Requires-Dist: google-auth==2.20.0; extra == "gcp"
32
- Requires-Dist: google-cloud-core==2.3.2; extra == "gcp"
33
- Requires-Dist: google-cloud-storage==2.9.0; extra == "gcp"
34
- Requires-Dist: gcsfs==2023.6.0; extra == "gcp"
32
+ Requires-Dist: google-auth==2.29.0; extra == "gcp"
33
+ Requires-Dist: google-cloud-core==2.4.1; extra == "gcp"
34
+ Requires-Dist: google-cloud-storage==2.16.0; extra == "gcp"
35
+ Requires-Dist: gcsfs==2024.3.1; extra == "gcp"
35
36
  Provides-Extra: azure
36
- Requires-Dist: azure-core==1.26.4; extra == "azure"
37
- Requires-Dist: azure-identity==1.13.0; extra == "azure"
38
- Requires-Dist: azure-storage-blob==12.16.0; extra == "azure"
39
- Requires-Dist: adlfs==2023.4.0; extra == "azure"
37
+ Requires-Dist: azure-core==1.30.1; extra == "azure"
38
+ Requires-Dist: azure-identity==1.16.1; extra == "azure"
39
+ Requires-Dist: azure-storage-blob==12.19.1; extra == "azure"
40
+ Requires-Dist: adlfs==2024.4.1; extra == "azure"
40
41
 
41
42
  # TRAC Model Runtime for Python
42
43
 
@@ -56,12 +57,12 @@ Documentation for the TRAC platform is available on our website at
56
57
 
57
58
  The TRAC runtime for Python has these requirements:
58
59
 
59
- * Python: 3.8 up to 3.11.x
60
- * Pandas: 1.2 up to 1.5.x
61
- * PySpark 3.0 up to 3.4.x (optional)
60
+ * Python: 3.8 up to 3.12
61
+ * Pandas: 1.2 up to 2.2
62
+ * PySpark 3.0 up to 3.5 (optional)
62
63
 
63
64
  3rd party libraries may impose additional constraints on supported versions of Python, Pandas or PySpark.
64
-
65
+ As of February 2024, the Python libraries for GCP do not yet support Python 3.12.
65
66
 
66
67
  ## Installing the runtime
67
68
 
@@ -16,12 +16,12 @@ Documentation for the TRAC platform is available on our website at
16
16
 
17
17
  The TRAC runtime for Python has these requirements:
18
18
 
19
- * Python: 3.8 up to 3.11.x
20
- * Pandas: 1.2 up to 1.5.x
21
- * PySpark 3.0 up to 3.4.x (optional)
19
+ * Python: 3.8 up to 3.12
20
+ * Pandas: 1.2 up to 2.2
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.
24
-
24
+ As of February 2024, the Python libraries for GCP do not yet support Python 3.12.
25
25
 
26
26
  ## Installing the runtime
27
27
 
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = tracdap-runtime
3
- version = 0.6.0rc2
3
+ version = 0.6.1
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
@@ -32,32 +32,33 @@ packages =
32
32
  package_dir =
33
33
  tracdap = src/tracdap
34
34
  tracdap.rt = src/tracdap/rt
35
- python_requires = >= 3.8, < 3.12
35
+ python_requires = >= 3.8, < 3.13
36
36
  install_requires =
37
- protobuf == 4.23.2
38
- pyarrow == 13.0.0
39
- pyyaml == 6.0.0
40
- dulwich == 0.21.5
41
- requests == 2.31.0
37
+ protobuf == 4.25.3
38
+ pyarrow == 16.0.0
39
+ pyyaml == 6.0.1
40
+ dulwich == 0.22.1
41
+ requests == 2.32.3
42
42
 
43
- pandas >= 1.2.0, < 1.6.0
43
+ pandas >= 1.2.0, < 2.3.0
44
+ numpy < 2.0.0
44
45
 
45
46
  [options.extras_require]
46
47
  spark =
47
- pyspark >= 3.0.0, < 3.5.0
48
+ pyspark >= 3.0.0, < 3.6.0
48
49
  aws =
49
- botocore == 1.29.156
50
- boto3 == 1.26.156
50
+ botocore == 1.34.93
51
+ boto3 == 1.34.93
51
52
  gcp =
52
- google-auth == 2.20.0
53
- google-cloud-core == 2.3.2
54
- google-cloud-storage == 2.9.0
55
- gcsfs == 2023.6.0
53
+ google-auth == 2.29.0
54
+ google-cloud-core == 2.4.1
55
+ google-cloud-storage == 2.16.0
56
+ gcsfs == 2024.3.1
56
57
  azure =
57
- azure-core == 1.26.4
58
- azure-identity == 1.13.0
59
- azure-storage-blob == 12.16.0
60
- adlfs == 2023.4.0
58
+ azure-core == 1.30.1
59
+ azure-identity == 1.16.1
60
+ azure-storage-blob == 12.19.1
61
+ adlfs == 2024.4.1
61
62
 
62
63
  [egg_info]
63
64
  tag_build =
@@ -74,11 +74,7 @@ class DataView:
74
74
 
75
75
 
76
76
  class _DataInternal:
77
-
78
- @staticmethod
79
- def float_dtype_check():
80
- if "Float64Dtype" not in pd.__dict__:
81
- raise _ex.EStartup("TRAC D.A.P. requires Pandas >= 1.2")
77
+ pass
82
78
 
83
79
 
84
80
  class DataMapping:
@@ -111,8 +107,40 @@ class DataMapping:
111
107
  }
112
108
 
113
109
  # Check the Pandas dtypes for handling floats are available before setting up the type mapping
114
- __PANDAS_FLOAT_DTYPE_CHECK = _DataInternal.float_dtype_check()
115
- __PANDAS_DATETIME_TYPE = pd.to_datetime([]).dtype
110
+ __PANDAS_VERSION_ELEMENTS = pd.__version__.split(".")
111
+ __PANDAS_MAJOR_VERSION = int(__PANDAS_VERSION_ELEMENTS[0])
112
+ __PANDAS_MINOR_VERSION = int(__PANDAS_VERSION_ELEMENTS[1])
113
+
114
+ if __PANDAS_MAJOR_VERSION == 2:
115
+
116
+ __PANDAS_DATE_TYPE = pd.to_datetime([dt.date(2000, 1, 1)]).as_unit(__TRAC_TIMESTAMP_UNIT).dtype
117
+ __PANDAS_DATETIME_TYPE = pd.to_datetime([dt.datetime(2000, 1, 1, 0, 0, 0)]).as_unit(__TRAC_TIMESTAMP_UNIT).dtype
118
+
119
+ @classmethod
120
+ def __pandas_datetime_type(cls, tz, unit):
121
+ if tz is None and unit is None:
122
+ return cls.__PANDAS_DATETIME_TYPE
123
+ _unit = unit if unit is not None else cls.__TRAC_TIMESTAMP_UNIT
124
+ if tz is None:
125
+ return pd.to_datetime([dt.datetime(2000, 1, 1, 0, 0, 0)]).as_unit(_unit).dtype
126
+ else:
127
+ return pd.DatetimeTZDtype(tz=tz, unit=_unit)
128
+
129
+ # Minimum supported version for Pandas is 1.2, when pd.Float64Dtype was introduced
130
+ elif __PANDAS_MAJOR_VERSION == 1 and __PANDAS_MINOR_VERSION >= 2:
131
+
132
+ __PANDAS_DATE_TYPE = pd.to_datetime([dt.date(2000, 1, 1)]).dtype
133
+ __PANDAS_DATETIME_TYPE = pd.to_datetime([dt.datetime(2000, 1, 1, 0, 0, 0)]).dtype
134
+
135
+ @classmethod
136
+ def __pandas_datetime_type(cls, tz, unit): # noqa
137
+ if tz is None:
138
+ return cls.__PANDAS_DATETIME_TYPE
139
+ else:
140
+ return pd.DatetimeTZDtype(tz=tz)
141
+
142
+ else:
143
+ raise _ex.EStartup(f"Pandas version not supported: [{pd.__version__}]")
116
144
 
117
145
  # Only partial mapping is possible, decimal and temporal dtypes cannot be mapped this way
118
146
  __ARROW_TO_PANDAS_TYPE_MAPPING = {
@@ -224,8 +252,12 @@ class DataMapping:
224
252
  cls.__TRAC_DECIMAL_SCALE)
225
253
 
226
254
  @classmethod
227
- def pandas_datetime_type(cls):
228
- return cls.__PANDAS_DATETIME_TYPE
255
+ def pandas_date_type(cls):
256
+ return cls.__PANDAS_DATE_TYPE
257
+
258
+ @classmethod
259
+ def pandas_datetime_type(cls, tz=None, unit=None):
260
+ return cls.__pandas_datetime_type(tz, unit)
229
261
 
230
262
  @classmethod
231
263
  def view_to_pandas(
@@ -297,6 +329,7 @@ class DataMapping:
297
329
  else:
298
330
  DataConformance.check_duplicate_fields(table.schema.names, False)
299
331
 
332
+ # Use Arrow's built-in function to convert to Pandas
300
333
  return table.to_pandas(
301
334
 
302
335
  # Mapping for arrow -> pandas types for core types
@@ -463,7 +496,7 @@ class DataConformance:
463
496
 
464
497
  table_column: pa.Array = table.column(table_index)
465
498
 
466
- pandas_type = pandas_types[table_index] \
499
+ pandas_type = pandas_types.iloc[table_index] \
467
500
  if pandas_types is not None \
468
501
  else None
469
502
 
@@ -691,16 +724,20 @@ class DataConformance:
691
724
  @classmethod
692
725
  def _coerce_date(cls, vector: pa.Array, field: pa.Field, pandas_type=None) -> pa.Array:
693
726
 
694
- # Allow casting date32 -> date64, both range and precision are greater so there is no data loss
727
+ # The bit-width restriction could be removed here
728
+ # For date types there is never loss of precision and pa.cast will raise an error on overflow
729
+ # Impact to client code is unlikely, still this change should happen with a TRAC minor version update
695
730
  if pa.types.is_date(vector.type):
696
731
  if field.type.bit_width >= vector.type.bit_width:
697
732
  return pc.cast(vector, field.type)
698
733
 
699
- # Special handling for Pandas/NumPy date values
700
- # These are encoded as np.datetime64[ns] in Pandas -> pa.timestamp64[ns] in Arrow
701
- # Only allow this conversion if the vector is coming from Pandas with datetime type
702
- if pandas_type == DataMapping.pandas_datetime_type():
703
- if pa.types.is_timestamp(vector.type) and vector.type.unit == "ns":
734
+ # Special handling for date values coming from Pandas/NumPy
735
+ # Only allow these conversions if the vector is supplied with Pandas type info
736
+ # For Pandas 1.x, dates are always encoded as np.datetime64[ns]
737
+ # For Pandas 2.x dates are still np.datetime64 but can be in s, ms, us or ns
738
+ # This conversion will not apply to dates held in Pandas using the Python date object types
739
+ if pandas_type is not None:
740
+ if pa.types.is_timestamp(vector.type) and pd.api.types.is_datetime64_any_dtype(pandas_type):
704
741
  return pc.cast(vector, field.type)
705
742
 
706
743
  error_message = cls._format_error(cls.__E_WRONG_DATA_TYPE, vector, field)
@@ -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.0rc2"
15
+ __version__ = "0.6.1"
@@ -4,32 +4,27 @@ from .common import _ConfigFile
4
4
  from .common import PluginConfig
5
5
  from .common import PlatformInfo
6
6
  from .common import AuthenticationConfig
7
+ from .common import StorageConfig
7
8
 
9
+ from .runtime import RuntimeConfig
10
+ from .runtime import SparkSettings
11
+
12
+ from .platform import RoutingProtocol
13
+ from .platform import DeploymentLayout
8
14
  from .platform import PlatformConfig
9
15
  from .platform import MetadataConfig
10
- from .platform import StorageConfig
11
16
  from .platform import TenantConfig
12
17
  from .platform import WebServerConfig
13
18
  from .platform import WebServerRewriteRule
14
19
  from .platform import WebServerRedirect
15
- from .platform import InstantMap
16
- from .platform import InstanceConfig
17
- from .platform import ServiceMap
20
+ from .platform import GatewayConfig
21
+ from .platform import RouteConfig
22
+ from .platform import RoutingMatch
23
+ from .platform import RoutingTarget
18
24
  from .platform import ServiceConfig
19
-
20
- from .runtime import RuntimeConfig
21
- from .runtime import SparkSettings
25
+ from .platform import DeploymentConfig
22
26
 
23
27
  from .result import TagUpdateList
24
28
  from .result import JobResult
25
29
 
26
30
  from .job import JobConfig
27
-
28
- from .gateway import GwProtocol
29
- from .gateway import GwRestMapping
30
- from .gateway import GatewayConfig
31
- from .gateway import GwRoute
32
- from .gateway import GwMatch
33
- from .gateway import GwTarget
34
- from .gateway import GwServiceMap
35
- from .gateway import GwService
@@ -56,3 +56,13 @@ class AuthenticationConfig:
56
56
  systemTicketDuration: int = None
57
57
 
58
58
  systemTicketRefresh: int = None
59
+
60
+
61
+ @_dc.dataclass
62
+ class StorageConfig:
63
+
64
+ buckets: _tp.Dict[str, PluginConfig] = _dc.field(default_factory=dict)
65
+
66
+ defaultBucket: str = None
67
+
68
+ defaultFormat: str = None
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: tracdap/config/common.proto
4
+ # Protobuf Python Version: 4.25.3
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1btracdap/config/common.proto\x12\x0etracdap.config\"u\n\x0b_ConfigFile\x12\x37\n\x06\x63onfig\x18\x01 \x03(\x0b\x32\'.tracdap.config._ConfigFile.ConfigEntry\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x81\x02\n\x0cPluginConfig\x12\x10\n\x08protocol\x18\x01 \x01(\t\x12@\n\nproperties\x18\x02 \x03(\x0b\x32,.tracdap.config.PluginConfig.PropertiesEntry\x12:\n\x07secrets\x18\x03 \x03(\x0b\x32).tracdap.config.PluginConfig.SecretsEntry\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a.\n\x0cSecretsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xb8\x01\n\x0cPlatformInfo\x12\x13\n\x0b\x65nvironment\x18\x01 \x01(\t\x12\x12\n\nproduction\x18\x02 \x01(\x08\x12H\n\x0e\x64\x65ploymentInfo\x18\x03 \x03(\x0b\x32\x30.tracdap.config.PlatformInfo.DeploymentInfoEntry\x1a\x35\n\x13\x44\x65ploymentInfoEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xba\x02\n\x14\x41uthenticationConfig\x12\x11\n\tjwtIssuer\x18\x01 \x01(\t\x12\x11\n\tjwtExpiry\x18\x02 \x01(\x11\x12\x10\n\x08jwtLimit\x18\x06 \x01(\x11\x12\x12\n\njwtRefresh\x18\x07 \x01(\x11\x12\x33\n\x08provider\x18\x03 \x01(\x0b\x32\x1c.tracdap.config.PluginConfigH\x00\x88\x01\x01\x12\x13\n\x0b\x64isableAuth\x18\x04 \x01(\x08\x12\x16\n\x0e\x64isableSigning\x18\x05 \x01(\x08\x12\x14\n\x0csystemUserId\x18\x08 \x01(\t\x12\x16\n\x0esystemUserName\x18\t \x01(\t\x12\x1c\n\x14systemTicketDuration\x18\n \x01(\x11\x12\x1b\n\x13systemTicketRefresh\x18\x0b \x01(\x11\x42\x0b\n\t_provider\"\xc8\x01\n\rStorageConfig\x12;\n\x07\x62uckets\x18\x01 \x03(\x0b\x32*.tracdap.config.StorageConfig.BucketsEntry\x12\x15\n\rdefaultBucket\x18\x02 \x01(\t\x12\x15\n\rdefaultFormat\x18\x03 \x01(\t\x1aL\n\x0c\x42ucketsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b\x32\x1c.tracdap.config.PluginConfig:\x02\x38\x01\x42\x1c\n\x18org.finos.tracdap.configP\x01\x62\x06proto3')
18
+
19
+ _globals = globals()
20
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
21
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tracdap.config.common_pb2', _globals)
22
+ if _descriptor._USE_C_DESCRIPTORS == False:
23
+ _globals['DESCRIPTOR']._options = None
24
+ _globals['DESCRIPTOR']._serialized_options = b'\n\030org.finos.tracdap.configP\001'
25
+ _globals['__CONFIGFILE_CONFIGENTRY']._options = None
26
+ _globals['__CONFIGFILE_CONFIGENTRY']._serialized_options = b'8\001'
27
+ _globals['_PLUGINCONFIG_PROPERTIESENTRY']._options = None
28
+ _globals['_PLUGINCONFIG_PROPERTIESENTRY']._serialized_options = b'8\001'
29
+ _globals['_PLUGINCONFIG_SECRETSENTRY']._options = None
30
+ _globals['_PLUGINCONFIG_SECRETSENTRY']._serialized_options = b'8\001'
31
+ _globals['_PLATFORMINFO_DEPLOYMENTINFOENTRY']._options = None
32
+ _globals['_PLATFORMINFO_DEPLOYMENTINFOENTRY']._serialized_options = b'8\001'
33
+ _globals['_STORAGECONFIG_BUCKETSENTRY']._options = None
34
+ _globals['_STORAGECONFIG_BUCKETSENTRY']._serialized_options = b'8\001'
35
+ _globals['__CONFIGFILE']._serialized_start=47
36
+ _globals['__CONFIGFILE']._serialized_end=164
37
+ _globals['__CONFIGFILE_CONFIGENTRY']._serialized_start=119
38
+ _globals['__CONFIGFILE_CONFIGENTRY']._serialized_end=164
39
+ _globals['_PLUGINCONFIG']._serialized_start=167
40
+ _globals['_PLUGINCONFIG']._serialized_end=424
41
+ _globals['_PLUGINCONFIG_PROPERTIESENTRY']._serialized_start=327
42
+ _globals['_PLUGINCONFIG_PROPERTIESENTRY']._serialized_end=376
43
+ _globals['_PLUGINCONFIG_SECRETSENTRY']._serialized_start=378
44
+ _globals['_PLUGINCONFIG_SECRETSENTRY']._serialized_end=424
45
+ _globals['_PLATFORMINFO']._serialized_start=427
46
+ _globals['_PLATFORMINFO']._serialized_end=611
47
+ _globals['_PLATFORMINFO_DEPLOYMENTINFOENTRY']._serialized_start=558
48
+ _globals['_PLATFORMINFO_DEPLOYMENTINFOENTRY']._serialized_end=611
49
+ _globals['_AUTHENTICATIONCONFIG']._serialized_start=614
50
+ _globals['_AUTHENTICATIONCONFIG']._serialized_end=928
51
+ _globals['_STORAGECONFIG']._serialized_start=931
52
+ _globals['_STORAGECONFIG']._serialized_end=1131
53
+ _globals['_STORAGECONFIG_BUCKETSENTRY']._serialized_start=1055
54
+ _globals['_STORAGECONFIG_BUCKETSENTRY']._serialized_end=1131
55
+ # @@protoc_insertion_point(module_scope)