tracdap-runtime 0.7.0rc1__py3-none-any.whl → 0.8.0__py3-none-any.whl

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 (88) hide show
  1. tracdap/rt/_impl/core/__init__.py +14 -0
  2. tracdap/rt/_impl/{config_parser.py → core/config_parser.py} +61 -36
  3. tracdap/rt/_impl/{data.py → core/data.py} +136 -32
  4. tracdap/rt/_impl/core/logging.py +195 -0
  5. tracdap/rt/_impl/{models.py → core/models.py} +15 -12
  6. tracdap/rt/_impl/{repos.py → core/repos.py} +12 -3
  7. tracdap/rt/_impl/{schemas.py → core/schemas.py} +5 -5
  8. tracdap/rt/_impl/{shim.py → core/shim.py} +5 -4
  9. tracdap/rt/_impl/{storage.py → core/storage.py} +21 -10
  10. tracdap/rt/_impl/core/struct.py +547 -0
  11. tracdap/rt/_impl/{type_system.py → core/type_system.py} +73 -33
  12. tracdap/rt/_impl/{util.py → core/util.py} +1 -111
  13. tracdap/rt/_impl/{validation.py → core/validation.py} +99 -31
  14. tracdap/rt/_impl/exec/__init__.py +14 -0
  15. tracdap/rt/{_exec → _impl/exec}/actors.py +12 -14
  16. tracdap/rt/{_exec → _impl/exec}/context.py +228 -82
  17. tracdap/rt/{_exec → _impl/exec}/dev_mode.py +176 -89
  18. tracdap/rt/{_exec → _impl/exec}/engine.py +230 -105
  19. tracdap/rt/{_exec → _impl/exec}/functions.py +191 -100
  20. tracdap/rt/{_exec → _impl/exec}/graph.py +24 -36
  21. tracdap/rt/{_exec → _impl/exec}/graph_builder.py +252 -115
  22. tracdap/rt/_impl/grpc/codec.py +1 -1
  23. tracdap/rt/{_exec → _impl/grpc}/server.py +7 -6
  24. tracdap/rt/_impl/grpc/tracdap/api/internal/runtime_pb2.py +3 -3
  25. tracdap/rt/_impl/grpc/tracdap/api/internal/runtime_pb2_grpc.py +1 -1
  26. tracdap/rt/_impl/grpc/tracdap/metadata/common_pb2.py +1 -1
  27. tracdap/rt/_impl/grpc/tracdap/metadata/config_pb2.py +40 -0
  28. tracdap/rt/_impl/grpc/tracdap/metadata/config_pb2.pyi +62 -0
  29. tracdap/rt/_impl/grpc/tracdap/metadata/custom_pb2.py +1 -1
  30. tracdap/rt/_impl/grpc/tracdap/metadata/data_pb2.py +32 -20
  31. tracdap/rt/_impl/grpc/tracdap/metadata/data_pb2.pyi +48 -2
  32. tracdap/rt/_impl/grpc/tracdap/metadata/file_pb2.py +4 -2
  33. tracdap/rt/_impl/grpc/tracdap/metadata/file_pb2.pyi +8 -0
  34. tracdap/rt/_impl/grpc/tracdap/metadata/flow_pb2.py +1 -1
  35. tracdap/rt/_impl/grpc/tracdap/metadata/job_pb2.py +65 -63
  36. tracdap/rt/_impl/grpc/tracdap/metadata/job_pb2.pyi +16 -2
  37. tracdap/rt/_impl/grpc/tracdap/metadata/model_pb2.py +28 -26
  38. tracdap/rt/_impl/grpc/tracdap/metadata/model_pb2.pyi +14 -4
  39. tracdap/rt/_impl/grpc/tracdap/metadata/object_id_pb2.py +4 -4
  40. tracdap/rt/_impl/grpc/tracdap/metadata/object_id_pb2.pyi +6 -0
  41. tracdap/rt/_impl/grpc/tracdap/metadata/object_pb2.py +9 -7
  42. tracdap/rt/_impl/grpc/tracdap/metadata/object_pb2.pyi +12 -4
  43. tracdap/rt/_impl/grpc/tracdap/metadata/resource_pb2.py +18 -5
  44. tracdap/rt/_impl/grpc/tracdap/metadata/resource_pb2.pyi +42 -2
  45. tracdap/rt/_impl/grpc/tracdap/metadata/search_pb2.py +1 -1
  46. tracdap/rt/_impl/grpc/tracdap/metadata/{stoarge_pb2.py → storage_pb2.py} +4 -4
  47. tracdap/rt/_impl/grpc/tracdap/metadata/tag_pb2.py +1 -1
  48. tracdap/rt/_impl/grpc/tracdap/metadata/tag_update_pb2.py +1 -1
  49. tracdap/rt/_impl/grpc/tracdap/metadata/type_pb2.py +1 -1
  50. tracdap/rt/{_exec → _impl}/runtime.py +32 -18
  51. tracdap/rt/_impl/static_api.py +66 -38
  52. tracdap/rt/_plugins/format_csv.py +1 -1
  53. tracdap/rt/_plugins/repo_git.py +56 -11
  54. tracdap/rt/_plugins/storage_sql.py +13 -6
  55. tracdap/rt/_version.py +1 -1
  56. tracdap/rt/api/__init__.py +5 -24
  57. tracdap/rt/api/constants.py +57 -0
  58. tracdap/rt/api/experimental.py +32 -0
  59. tracdap/rt/api/hook.py +26 -7
  60. tracdap/rt/api/model_api.py +16 -0
  61. tracdap/rt/api/static_api.py +265 -127
  62. tracdap/rt/config/__init__.py +11 -11
  63. tracdap/rt/config/common.py +2 -26
  64. tracdap/rt/config/dynamic.py +28 -0
  65. tracdap/rt/config/platform.py +17 -31
  66. tracdap/rt/config/runtime.py +2 -0
  67. tracdap/rt/ext/embed.py +2 -2
  68. tracdap/rt/ext/plugins.py +3 -3
  69. tracdap/rt/launch/launch.py +12 -14
  70. tracdap/rt/metadata/__init__.py +31 -21
  71. tracdap/rt/metadata/config.py +95 -0
  72. tracdap/rt/metadata/data.py +40 -0
  73. tracdap/rt/metadata/file.py +10 -0
  74. tracdap/rt/metadata/job.py +16 -0
  75. tracdap/rt/metadata/model.py +12 -2
  76. tracdap/rt/metadata/object.py +9 -1
  77. tracdap/rt/metadata/object_id.py +6 -0
  78. tracdap/rt/metadata/resource.py +41 -1
  79. {tracdap_runtime-0.7.0rc1.dist-info → tracdap_runtime-0.8.0.dist-info}/METADATA +33 -27
  80. tracdap_runtime-0.8.0.dist-info/RECORD +129 -0
  81. {tracdap_runtime-0.7.0rc1.dist-info → tracdap_runtime-0.8.0.dist-info}/WHEEL +1 -1
  82. tracdap/rt/_exec/__init__.py +0 -0
  83. tracdap_runtime-0.7.0rc1.dist-info/RECORD +0 -121
  84. /tracdap/rt/_impl/{guard_rails.py → core/guard_rails.py} +0 -0
  85. /tracdap/rt/_impl/grpc/tracdap/metadata/{stoarge_pb2.pyi → storage_pb2.pyi} +0 -0
  86. /tracdap/rt/metadata/{stoarge.py → storage.py} +0 -0
  87. {tracdap_runtime-0.7.0rc1.dist-info → tracdap_runtime-0.8.0.dist-info/licenses}/LICENSE +0 -0
  88. {tracdap_runtime-0.7.0rc1.dist-info → tracdap_runtime-0.8.0.dist-info}/top_level.txt +0 -0
tracdap/rt/ext/plugins.py CHANGED
@@ -14,13 +14,13 @@
14
14
  # limitations under the License.
15
15
 
16
16
  import typing as _tp
17
- import logging as _log
18
17
  import pkgutil as _pkg
19
18
  import importlib as _il
20
19
 
21
20
  import tracdap.rt.config as _cfg
22
21
  import tracdap.rt.exceptions as _ex
23
- import tracdap.rt._impl.guard_rails as _guard # noqa
22
+ import tracdap.rt._impl.core.guard_rails as _guard # noqa
23
+ import tracdap.rt._impl.core.logging as _logging # noqa
24
24
  from tracdap.rt.exceptions import EStartup
25
25
 
26
26
 
@@ -28,7 +28,7 @@ class PluginManager:
28
28
 
29
29
  T_SERVICE = _tp.TypeVar("T_SERVICE")
30
30
 
31
- __log = _log.getLogger(f"{__name__}.PluginManager")
31
+ __log = _logging.getLogger(f"{__name__}.PluginManager")
32
32
 
33
33
  __core_registered = False
34
34
  __3rd_party_registered = list()
@@ -20,9 +20,9 @@ import pathlib as _pathlib
20
20
  import typing as _tp
21
21
 
22
22
  import tracdap.rt.api as _api
23
- import tracdap.rt._impl.config_parser as _cparse # noqa
24
- import tracdap.rt._impl.util as _util # noqa
25
- import tracdap.rt._exec.runtime as _runtime # noqa
23
+ import tracdap.rt._impl.core.config_parser as _cparse # noqa
24
+ import tracdap.rt._impl.core.util as _util # noqa
25
+ import tracdap.rt._impl.runtime as _runtime # noqa
26
26
 
27
27
  from .cli import _cli_args
28
28
 
@@ -112,9 +112,10 @@ def launch_model(
112
112
  runtime_instance = _runtime.TracRuntime(_sys_config, dev_mode=True, plugin_packages=plugin_packages)
113
113
  runtime_instance.pre_start()
114
114
 
115
- job = runtime_instance.load_job_config(_job_config, model_class=model_class)
116
-
117
115
  with runtime_instance as rt:
116
+
117
+ job = rt.load_job_config(_job_config, model_class=model_class)
118
+
118
119
  rt.submit_job(job)
119
120
  rt.wait_for_job(job.jobId)
120
121
 
@@ -160,9 +161,10 @@ def launch_job(
160
161
  runtime_instance = _runtime.TracRuntime(_sys_config, dev_mode=dev_mode, plugin_packages=plugin_packages)
161
162
  runtime_instance.pre_start()
162
163
 
163
- job = runtime_instance.load_job_config(_job_config)
164
-
165
164
  with runtime_instance as rt:
165
+
166
+ job = rt.load_job_config(_job_config)
167
+
166
168
  rt.submit_job(job)
167
169
  rt.wait_for_job(job.jobId)
168
170
 
@@ -184,6 +186,7 @@ def launch_cli(programmatic_args: _tp.Optional[_tp.List[str]] = None):
184
186
  launch_args = _cli_args()
185
187
 
186
188
  _sys_config = _resolve_config_file(launch_args.sys_config, None)
189
+ _job_config = _resolve_config_file(launch_args.job_config, None) if launch_args.job_config else None
187
190
 
188
191
  runtime_instance = _runtime.TracRuntime(
189
192
  _sys_config,
@@ -196,15 +199,10 @@ def launch_cli(programmatic_args: _tp.Optional[_tp.List[str]] = None):
196
199
 
197
200
  runtime_instance.pre_start()
198
201
 
199
- if launch_args.job_config is not None:
200
- _job_config = _resolve_config_file(launch_args.job_config, None)
201
- job = runtime_instance.load_job_config(_job_config)
202
- else:
203
- job = None
204
-
205
202
  with runtime_instance as rt:
206
203
 
207
- if job is not None:
204
+ if _job_config is not None:
205
+ job = rt.load_job_config(_job_config)
208
206
  rt.submit_job(job)
209
207
 
210
208
  if rt.is_oneshot():
@@ -13,27 +13,32 @@ from .object_id import ObjectType
13
13
  from .object_id import TagHeader
14
14
  from .object_id import TagSelector
15
15
 
16
+ from .search import SearchOperator
17
+ from .search import LogicalOperator
18
+ from .search import SearchTerm
19
+ from .search import LogicalExpression
20
+ from .search import SearchExpression
21
+ from .search import SearchParameters
22
+
16
23
  from .data import SchemaType
17
24
  from .data import PartType
18
25
  from .data import FieldSchema
19
26
  from .data import TableSchema
27
+ from .data import StructField
28
+ from .data import StructSchema
20
29
  from .data import SchemaDefinition
21
30
  from .data import PartKey
22
31
  from .data import DataDefinition
23
32
 
33
+ from .file import FileDefinition
34
+ from .file import FileType
35
+
24
36
  from .model import ModelType
25
37
  from .model import ModelParameter
26
38
  from .model import ModelInputSchema
27
39
  from .model import ModelOutputSchema
28
40
  from .model import ModelDefinition
29
41
 
30
- from .search import SearchOperator
31
- from .search import LogicalOperator
32
- from .search import SearchTerm
33
- from .search import LogicalExpression
34
- from .search import SearchExpression
35
- from .search import SearchParameters
36
-
37
42
  from .tag_update import TagOperation
38
43
  from .tag_update import TagUpdate
39
44
 
@@ -43,10 +48,16 @@ from .flow import FlowSocket
43
48
  from .flow import FlowEdge
44
49
  from .flow import FlowDefinition
45
50
 
51
+ from .custom import CustomDefinition
52
+
53
+ from .resource import ResourceType
54
+ from .resource import ResourceDefinition
55
+
46
56
  from .job import JobType
47
57
  from .job import JobStatusCode
48
58
  from .job import JobGroupType
49
59
  from .job import JobDefinition
60
+ from .job import ResultDefinition
50
61
  from .job import RunModelJob
51
62
  from .job import RunFlowJob
52
63
  from .job import ImportModelJob
@@ -56,23 +67,22 @@ from .job import JobGroup
56
67
  from .job import SequentialJobGroup
57
68
  from .job import ParallelJobGroup
58
69
 
59
- from .file import FileDefinition
70
+ from .common import MetadataFormat
71
+ from .common import MetadataVersion
72
+ from .common import TenantInfo
60
73
 
61
- from .custom import CustomDefinition
74
+ from .config import ConfigType
75
+ from .config import ConfigEntry
76
+ from .config import ConfigDetails
77
+ from .config import ConfigDefinition
62
78
 
63
- from .stoarge import CopyStatus
64
- from .stoarge import IncarnationStatus
65
- from .stoarge import StorageCopy
66
- from .stoarge import StorageIncarnation
67
- from .stoarge import StorageItem
68
- from .stoarge import StorageDefinition
79
+ from .storage import CopyStatus
80
+ from .storage import IncarnationStatus
81
+ from .storage import StorageCopy
82
+ from .storage import StorageIncarnation
83
+ from .storage import StorageItem
84
+ from .storage import StorageDefinition
69
85
 
70
86
  from .object import ObjectDefinition
71
87
 
72
- from .resource import ResourceType
73
-
74
- from .common import MetadataFormat
75
- from .common import MetadataVersion
76
- from .common import TenantInfo
77
-
78
88
  from .tag import Tag
@@ -0,0 +1,95 @@
1
+ # Code generated by TRAC
2
+
3
+ import typing as _tp # noqa
4
+ import dataclasses as _dc # noqa
5
+ import enum as _enum # noqa
6
+
7
+ from .type import * # noqa
8
+ from .object_id import * # noqa
9
+ from .resource import * # noqa
10
+
11
+
12
+ class ConfigType(_enum.Enum):
13
+
14
+ """Enumeration of available config types"""
15
+
16
+ CONFIG_TYPE_NOT_SET = 0
17
+
18
+ PROPERTIES = 1
19
+
20
+ """A key-value properties map, follows the convention used for .properties files"""
21
+
22
+
23
+ @_dc.dataclass
24
+ class ConfigEntry:
25
+
26
+ """Represents the mapping of a config key to a config object."""
27
+
28
+ configClass: "str" = ""
29
+
30
+ """Config class for this config entry."""
31
+
32
+ configKey: "str" = ""
33
+
34
+ """Config key for this config entry."""
35
+
36
+ configVersion: "int" = 0
37
+
38
+ """Version of the config entry."""
39
+
40
+ configTimestamp: "DatetimeValue" = _dc.field(default_factory=lambda: DatetimeValue())
41
+
42
+ """Timestamp for when this version of the config entry was created."""
43
+
44
+ isLatestConfig: "bool" = False
45
+
46
+ """Flag indicating whether this is the latest version of the config entry."""
47
+
48
+ configDeleted: "bool" = False
49
+
50
+ """Flag indicating whether this config entry has been deleted."""
51
+
52
+ details: "_tp.Optional[ConfigDetails]" = None
53
+
54
+ """Describes the content of this config entry, can be used for list / summary views (optional)."""
55
+
56
+
57
+ @_dc.dataclass
58
+ class ConfigDetails:
59
+
60
+ """
61
+ Summary content of a config entry.
62
+
63
+ .. seealso::
64
+ :py:obj:`ConfigEntry <ConfigEntry>`
65
+ """
66
+
67
+ objectSelector: "TagSelector" = _dc.field(default_factory=lambda: TagSelector())
68
+
69
+ """Selector for the metadata object holding the content of this config entry."""
70
+
71
+ objectType: "ObjectType" = ObjectType.OBJECT_TYPE_NOT_SET
72
+
73
+ """Type of the metadata object referred to by this config entry."""
74
+
75
+ configType: "_tp.Optional[ConfigType]" = None
76
+
77
+ """Indicate the config type (for CONFIG objects only)"""
78
+
79
+ resourceType: "_tp.Optional[ResourceType]" = None
80
+
81
+ """Indicate the resource type (for RESOURCE objects only)"""
82
+
83
+
84
+ @_dc.dataclass
85
+ class ConfigDefinition:
86
+
87
+ """Definition of an individual config entry"""
88
+
89
+ configType: "ConfigType" = ConfigType.CONFIG_TYPE_NOT_SET
90
+
91
+ """The type of this config entry"""
92
+
93
+ properties: "_tp.Dict[str, str]" = _dc.field(default_factory=dict)
94
+
95
+ """The map of config properties (only available for PROPERTIES config entries)"""
@@ -25,6 +25,10 @@ class SchemaType(_enum.Enum):
25
25
 
26
26
  """Tabular data"""
27
27
 
28
+ STRUCT = 2
29
+
30
+ """Structured objects"""
31
+
28
32
 
29
33
  class PartType(_enum.Enum):
30
34
 
@@ -80,6 +84,40 @@ class TableSchema:
80
84
  fields: "_tp.List[FieldSchema]" = _dc.field(default_factory=list)
81
85
 
82
86
 
87
+ @_dc.dataclass
88
+ class StructField:
89
+
90
+ """Schema for an individual field in a structured object dataset"""
91
+
92
+ fieldType: "TypeDescriptor" = _dc.field(default_factory=lambda: TypeDescriptor())
93
+
94
+ label: "str" = ""
95
+
96
+ businessKey: "bool" = False
97
+
98
+ categorical: "bool" = False
99
+
100
+ notNull: "_tp.Optional[bool]" = None
101
+
102
+ """This could become mandatory with the next metadata update"""
103
+
104
+ formatCode: "_tp.Optional[str]" = None
105
+
106
+ defaultValue: "Value" = _dc.field(default_factory=lambda: Value())
107
+
108
+ structType: "_tp.Optional[str]" = None
109
+
110
+
111
+ @_dc.dataclass
112
+ class StructSchema:
113
+
114
+ """Schema for a structured object dataset"""
115
+
116
+ fields: "_tp.Dict[str, StructField]" = _dc.field(default_factory=dict)
117
+
118
+ namedTypes: "_tp.Dict[str, StructSchema]" = _dc.field(default_factory=dict)
119
+
120
+
83
121
  @_dc.dataclass
84
122
  class SchemaDefinition:
85
123
 
@@ -103,6 +141,8 @@ class SchemaDefinition:
103
141
 
104
142
  table: "_tp.Optional[TableSchema]" = None
105
143
 
144
+ struct: "_tp.Optional[StructSchema]" = None
145
+
106
146
 
107
147
  @_dc.dataclass
108
148
  class PartKey:
@@ -24,3 +24,13 @@ class FileDefinition:
24
24
  storageId: "TagSelector" = _dc.field(default_factory=lambda: TagSelector())
25
25
 
26
26
  dataItem: "str" = ""
27
+
28
+
29
+ @_dc.dataclass
30
+ class FileType:
31
+
32
+ """Specify a file type that is produced or consumed by a model, flow or job"""
33
+
34
+ extension: "str" = ""
35
+
36
+ mimeType: "str" = ""
@@ -117,6 +117,22 @@ class JobDefinition:
117
117
 
118
118
  jobGroup: "_tp.Optional[JobGroup]" = None
119
119
 
120
+ resultId: "TagSelector" = _dc.field(default_factory=lambda: TagSelector())
121
+
122
+
123
+ @_dc.dataclass
124
+ class ResultDefinition:
125
+
126
+ """Define the result of a job after it has completed"""
127
+
128
+ jobId: "TagSelector" = _dc.field(default_factory=lambda: TagSelector())
129
+
130
+ statusCode: "JobStatusCode" = JobStatusCode.JOB_STATUS_CODE_NOT_SET
131
+
132
+ statusMessage: "str" = ""
133
+
134
+ logFileId: "TagSelector" = _dc.field(default_factory=lambda: TagSelector())
135
+
120
136
 
121
137
  @_dc.dataclass
122
138
  class RunModelJob:
@@ -5,7 +5,9 @@ import dataclasses as _dc # noqa
5
5
  import enum as _enum # noqa
6
6
 
7
7
  from .type import * # noqa
8
+ from .object_id import * # noqa
8
9
  from .data import * # noqa
10
+ from .file import * # noqa
9
11
 
10
12
 
11
13
  class ModelType(_enum.Enum):
@@ -54,7 +56,11 @@ class ModelInputSchema:
54
56
  other options may be required. These capabilities may be added in future releases.
55
57
  """
56
58
 
57
- schema: "SchemaDefinition" = _dc.field(default_factory=lambda: SchemaDefinition())
59
+ objectType: "ObjectType" = ObjectType.OBJECT_TYPE_NOT_SET
60
+
61
+ schema: "_tp.Optional[SchemaDefinition]" = None
62
+
63
+ fileType: "_tp.Optional[FileType]" = None
58
64
 
59
65
  label: "_tp.Optional[str]" = None
60
66
 
@@ -81,7 +87,11 @@ class ModelOutputSchema:
81
87
  added in future releases.
82
88
  """
83
89
 
84
- schema: "SchemaDefinition" = _dc.field(default_factory=lambda: SchemaDefinition())
90
+ objectType: "ObjectType" = ObjectType.OBJECT_TYPE_NOT_SET
91
+
92
+ schema: "_tp.Optional[SchemaDefinition]" = None
93
+
94
+ fileType: "_tp.Optional[FileType]" = None
85
95
 
86
96
  label: "_tp.Optional[str]" = None
87
97
 
@@ -12,7 +12,9 @@ from .flow import * # noqa
12
12
  from .job import * # noqa
13
13
  from .file import * # noqa
14
14
  from .custom import * # noqa
15
- from .stoarge import * # noqa
15
+ from .storage import * # noqa
16
+ from .config import * # noqa
17
+ from .resource import * # noqa
16
18
 
17
19
 
18
20
 
@@ -70,4 +72,10 @@ class ObjectDefinition:
70
72
 
71
73
  schema: "_tp.Optional[SchemaDefinition]" = None
72
74
 
75
+ result: "_tp.Optional[ResultDefinition]" = None
76
+
77
+ config: "_tp.Optional[ConfigDefinition]" = None
78
+
79
+ resource: "_tp.Optional[ResourceDefinition]" = None
80
+
73
81
  objectProps: "_tp.Dict[str, Value]" = _dc.field(default_factory=dict)
@@ -34,6 +34,12 @@ class ObjectType(_enum.Enum):
34
34
 
35
35
  SCHEMA = 8
36
36
 
37
+ RESULT = 9
38
+
39
+ CONFIG = 10
40
+
41
+ RESOURCE = 11
42
+
37
43
 
38
44
  @_dc.dataclass
39
45
  class TagHeader:
@@ -5,7 +5,6 @@ import dataclasses as _dc # noqa
5
5
  import enum as _enum # noqa
6
6
 
7
7
  from .object_id import * # noqa
8
- from .object import * # noqa
9
8
 
10
9
 
11
10
  class ResourceType(_enum.Enum):
@@ -21,3 +20,44 @@ class ResourceType(_enum.Enum):
21
20
  INTERNAL_STORAGE = 2
22
21
 
23
22
  """Storage location for data held internally by the TRAC platform"""
23
+
24
+ EXTERNAL_STORAGE = 3
25
+
26
+ """Storage location for upstream downstream integration points"""
27
+
28
+
29
+ @_dc.dataclass
30
+ class ResourceDefinition:
31
+
32
+ """Definition of a platform resource"""
33
+
34
+ resourceType: "ResourceType" = ResourceType.RESOURCE_TYPE_NOT_SET
35
+
36
+ """The type of this resource"""
37
+
38
+ protocol: "str" = ""
39
+
40
+ """The protocol used to communicate with this resource (usually corresponds to a TRAC plugin)"""
41
+
42
+ subProtocol: "_tp.Optional[str]" = None
43
+
44
+ """Optional sub-protocol, to further distinguish the behavior of resources within a protocol"""
45
+
46
+ publicProperties: "_tp.Dict[str, str]" = _dc.field(default_factory=dict)
47
+
48
+ """Configuration properties for this resource, made visible to client applications"""
49
+
50
+ properties: "_tp.Dict[str, str]" = _dc.field(default_factory=dict)
51
+
52
+ """Configuration properties for this resource, not visible to client applications"""
53
+
54
+ secrets: "_tp.Dict[str, str]" = _dc.field(default_factory=dict)
55
+
56
+ """
57
+ Configuration properties that are stored as secrets using TRAC's secret handling mechanism
58
+
59
+ Only the secret alias is stored in metadata, handling of secret storage is delegated to the
60
+ configured secrets plugin. Secret values may be sent by clients when resource definitions are
61
+ created / updated, in which case they will be written to the configured secret store and
62
+ metadata values will be replaced with an alias.
63
+ """
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: tracdap-runtime
3
- Version: 0.7.0rc1
3
+ Version: 0.8.0
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,38 +13,42 @@ 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.13,>=3.8
16
+ Requires-Python: <3.14,>=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
- Requires-Dist: protobuf==5.28.2
20
- Requires-Dist: pyarrow==16.1.0
19
+ Requires-Dist: protobuf==5.29.3
20
+ Requires-Dist: pyarrow==18.1.0
21
21
  Requires-Dist: pyyaml==6.0.2
22
- Requires-Dist: dulwich==0.22.1
22
+ Requires-Dist: dulwich==0.22.7
23
23
  Requires-Dist: requests==2.32.3
24
- Requires-Dist: pandas<2.3.0,>=1.2.0
25
- Requires-Dist: numpy<2.0.0
24
+ Requires-Dist: typing_extensions<4.13
25
+ Requires-Dist: urllib3<2.4.0
26
+ Provides-Extra: grpc
27
+ Requires-Dist: grpcio==1.70.0; extra == "grpc"
28
+ Requires-Dist: grpcio-status==1.70.0; extra == "grpc"
29
+ Provides-Extra: pandas
30
+ Requires-Dist: pandas<2.3.0,>=1.2.0; extra == "pandas"
31
+ Requires-Dist: numpy<2.3.0,>=1.20; extra == "pandas"
32
+ Provides-Extra: polars
33
+ Requires-Dist: polars<2.0.0,>=1.0.0; extra == "polars"
34
+ Provides-Extra: pyspark
35
+ Requires-Dist: pyspark<3.6.0,>=3.0.0; extra == "pyspark"
36
+ Provides-Extra: sql
37
+ Requires-Dist: sqlalchemy<2.1.0,>=2.0.0; extra == "sql"
26
38
  Provides-Extra: aws
27
39
  Requires-Dist: botocore==1.34.93; extra == "aws"
28
40
  Requires-Dist: boto3==1.34.93; extra == "aws"
29
- Provides-Extra: azure
30
- Requires-Dist: azure-core==1.30.1; extra == "azure"
31
- Requires-Dist: azure-identity==1.16.1; extra == "azure"
32
- Requires-Dist: azure-storage-blob==12.19.1; extra == "azure"
33
- Requires-Dist: adlfs==2024.4.1; extra == "azure"
34
41
  Provides-Extra: gcp
35
42
  Requires-Dist: google-auth==2.34.0; extra == "gcp"
36
43
  Requires-Dist: google-api-core==2.19.2; extra == "gcp"
37
44
  Requires-Dist: google-cloud-storage==2.18.2; extra == "gcp"
38
45
  Requires-Dist: gcsfs==2024.3.1; extra == "gcp"
39
- Provides-Extra: grpc
40
- Requires-Dist: grpcio==1.66.1; extra == "grpc"
41
- Requires-Dist: grpcio-status==1.66.1; extra == "grpc"
42
- Provides-Extra: polars
43
- Requires-Dist: polars<2.0.0,>=1.0.0; extra == "polars"
44
- Provides-Extra: spark
45
- Requires-Dist: pyspark<3.6.0,>=3.0.0; extra == "spark"
46
- Provides-Extra: sql
47
- Requires-Dist: sqlalchemy<2.1.0,>=2.0.0; extra == "sql"
46
+ Provides-Extra: azure
47
+ Requires-Dist: azure-core==1.30.1; extra == "azure"
48
+ Requires-Dist: azure-identity==1.16.1; extra == "azure"
49
+ Requires-Dist: azure-storage-blob==12.19.1; extra == "azure"
50
+ Requires-Dist: adlfs==2024.4.1; extra == "azure"
51
+ Dynamic: license-file
48
52
 
49
53
  # TRAC Model Runtime for Python
50
54
 
@@ -64,12 +68,14 @@ Documentation for the TRAC platform is available on our website at
64
68
 
65
69
  The TRAC runtime for Python has these requirements:
66
70
 
67
- * Python: 3.8 up to 3.12
68
- * Pandas: 1.2 up to 2.2
69
- * PySpark 3.0 up to 3.5 (optional)
71
+ * Python: 3.9 up to 3.13
72
+ * Pandas: 1.2 up to 2.2 (optional)
73
+ * NumPy: 1.2 up to 2.2 (optional, required by Pandas)
74
+ * Polars: 1.X (optional)
70
75
 
71
- 3rd party libraries may impose additional constraints on supported versions of Python, Pandas or PySpark.
72
- As of February 2024, the Python libraries for GCP do not yet support Python 3.12.
76
+ 3rd party libraries may impose additional constraints on supported versions of key libraries.
77
+ For example, Pandas 1.5 is not available for Python 3.12 or 3.13, while NumPy 2.0 is only
78
+ compatible with Pandas 2.1 and later.
73
79
 
74
80
  ## Installing the runtime
75
81