tracdap-runtime 0.6.5__py3-none-any.whl → 0.7.0rc1__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.
- tracdap/rt/__init__.py +6 -5
- tracdap/rt/_exec/actors.py +6 -5
- tracdap/rt/_exec/context.py +278 -110
- tracdap/rt/_exec/dev_mode.py +237 -143
- tracdap/rt/_exec/engine.py +223 -64
- tracdap/rt/_exec/functions.py +31 -6
- tracdap/rt/_exec/graph.py +15 -5
- tracdap/rt/_exec/graph_builder.py +301 -203
- tracdap/rt/_exec/runtime.py +13 -10
- tracdap/rt/_exec/server.py +6 -5
- tracdap/rt/_impl/__init__.py +6 -5
- tracdap/rt/_impl/config_parser.py +17 -9
- tracdap/rt/_impl/data.py +284 -172
- tracdap/rt/_impl/ext/__init__.py +14 -0
- tracdap/rt/_impl/ext/sql.py +117 -0
- tracdap/rt/_impl/ext/storage.py +58 -0
- tracdap/rt/_impl/grpc/__init__.py +6 -5
- tracdap/rt/_impl/grpc/codec.py +6 -5
- tracdap/rt/_impl/grpc/tracdap/metadata/job_pb2.py +62 -54
- tracdap/rt/_impl/grpc/tracdap/metadata/job_pb2.pyi +37 -2
- tracdap/rt/_impl/guard_rails.py +6 -5
- tracdap/rt/_impl/models.py +6 -5
- tracdap/rt/_impl/repos.py +6 -5
- tracdap/rt/_impl/schemas.py +6 -5
- tracdap/rt/_impl/shim.py +6 -5
- tracdap/rt/_impl/static_api.py +30 -16
- tracdap/rt/_impl/storage.py +8 -7
- tracdap/rt/_impl/type_system.py +6 -5
- tracdap/rt/_impl/util.py +16 -5
- tracdap/rt/_impl/validation.py +72 -18
- tracdap/rt/_plugins/__init__.py +6 -5
- tracdap/rt/_plugins/_helpers.py +6 -5
- tracdap/rt/_plugins/config_local.py +6 -5
- tracdap/rt/_plugins/format_arrow.py +6 -5
- tracdap/rt/_plugins/format_csv.py +6 -5
- tracdap/rt/_plugins/format_parquet.py +6 -5
- tracdap/rt/_plugins/repo_git.py +6 -5
- tracdap/rt/_plugins/repo_local.py +6 -5
- tracdap/rt/_plugins/repo_pypi.py +6 -5
- tracdap/rt/_plugins/storage_aws.py +6 -5
- tracdap/rt/_plugins/storage_azure.py +6 -5
- tracdap/rt/_plugins/storage_gcp.py +6 -5
- tracdap/rt/_plugins/storage_local.py +6 -5
- tracdap/rt/_plugins/storage_sql.py +418 -0
- tracdap/rt/_plugins/storage_sql_dialects.py +118 -0
- tracdap/rt/_version.py +7 -6
- tracdap/rt/api/__init__.py +23 -5
- tracdap/rt/api/experimental.py +85 -37
- tracdap/rt/api/hook.py +16 -5
- tracdap/rt/api/model_api.py +110 -90
- tracdap/rt/api/static_api.py +142 -100
- tracdap/rt/config/common.py +26 -27
- tracdap/rt/config/job.py +5 -6
- tracdap/rt/config/platform.py +41 -42
- tracdap/rt/config/result.py +5 -6
- tracdap/rt/config/runtime.py +6 -7
- tracdap/rt/exceptions.py +13 -7
- tracdap/rt/ext/__init__.py +6 -5
- tracdap/rt/ext/config.py +6 -5
- tracdap/rt/ext/embed.py +6 -5
- tracdap/rt/ext/plugins.py +6 -5
- tracdap/rt/ext/repos.py +6 -5
- tracdap/rt/ext/storage.py +6 -5
- tracdap/rt/launch/__init__.py +10 -5
- tracdap/rt/launch/__main__.py +6 -5
- tracdap/rt/launch/cli.py +6 -5
- tracdap/rt/launch/launch.py +38 -15
- tracdap/rt/metadata/__init__.py +4 -0
- tracdap/rt/metadata/common.py +2 -3
- tracdap/rt/metadata/custom.py +3 -4
- tracdap/rt/metadata/data.py +30 -31
- tracdap/rt/metadata/file.py +6 -7
- tracdap/rt/metadata/flow.py +22 -23
- tracdap/rt/metadata/job.py +89 -45
- tracdap/rt/metadata/model.py +26 -27
- tracdap/rt/metadata/object.py +11 -12
- tracdap/rt/metadata/object_id.py +23 -24
- tracdap/rt/metadata/resource.py +0 -1
- tracdap/rt/metadata/search.py +15 -16
- tracdap/rt/metadata/stoarge.py +22 -23
- tracdap/rt/metadata/tag.py +8 -9
- tracdap/rt/metadata/tag_update.py +11 -12
- tracdap/rt/metadata/type.py +38 -38
- {tracdap_runtime-0.6.5.dist-info → tracdap_runtime-0.7.0rc1.dist-info}/LICENSE +1 -1
- {tracdap_runtime-0.6.5.dist-info → tracdap_runtime-0.7.0rc1.dist-info}/METADATA +4 -2
- tracdap_runtime-0.7.0rc1.dist-info/RECORD +121 -0
- {tracdap_runtime-0.6.5.dist-info → tracdap_runtime-0.7.0rc1.dist-info}/WHEEL +1 -1
- tracdap_runtime-0.6.5.dist-info/RECORD +0 -116
- {tracdap_runtime-0.6.5.dist-info → tracdap_runtime-0.7.0rc1.dist-info}/top_level.txt +0 -0
tracdap/rt/_impl/type_system.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
tracdap/rt/_impl/util.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -262,6 +263,16 @@ def get_args(metaclass: type):
|
|
262
263
|
return None
|
263
264
|
|
264
265
|
|
266
|
+
def get_constraints(metaclass: tp.TypeVar):
|
267
|
+
|
268
|
+
return metaclass.__constraints__ or None
|
269
|
+
|
270
|
+
|
271
|
+
def get_bound(metaclass: tp.TypeVar):
|
272
|
+
|
273
|
+
return metaclass.__bound__ or None
|
274
|
+
|
275
|
+
|
265
276
|
def try_clean_dir(dir_path: pathlib.Path, remove: bool = False) -> bool:
|
266
277
|
|
267
278
|
normalized_path = windows_unc_path(dir_path)
|
tracdap/rt/_impl/validation.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -44,10 +45,25 @@ def check_type(expected_type: tp.Type, value: tp.Any) -> bool:
|
|
44
45
|
return _TypeValidator.check_type(expected_type, value)
|
45
46
|
|
46
47
|
|
48
|
+
def type_name(type_: tp.Type, qualified: bool) -> str:
|
49
|
+
return _TypeValidator._type_name(type_, qualified) # noqa
|
50
|
+
|
51
|
+
|
47
52
|
def quick_validate_model_def(model_def: meta.ModelDefinition):
|
48
53
|
StaticValidator.quick_validate_model_def(model_def)
|
49
54
|
|
50
55
|
|
56
|
+
def is_primitive_type(basic_type: meta.BasicType) -> bool:
|
57
|
+
return StaticValidator.is_primitive_type(basic_type)
|
58
|
+
|
59
|
+
|
60
|
+
T_SKIP_VAL = tp.TypeVar("T_SKIP_VAL")
|
61
|
+
|
62
|
+
class SkipValidation(tp.Generic[T_SKIP_VAL]):
|
63
|
+
def __init__(self, skip_type: tp.Type[T_SKIP_VAL]):
|
64
|
+
self.skip_type = skip_type
|
65
|
+
|
66
|
+
|
51
67
|
class _TypeValidator:
|
52
68
|
|
53
69
|
# The metaclass for generic types varies between versions of the typing library
|
@@ -56,28 +72,28 @@ class _TypeValidator:
|
|
56
72
|
|
57
73
|
# Cache method signatures to avoid inspection on every call
|
58
74
|
# Inspecting a function signature can take ~ half a second in Python 3.7
|
59
|
-
__method_cache: tp.Dict[str, inspect.Signature] = dict()
|
75
|
+
__method_cache: tp.Dict[str, tp.Tuple[inspect.Signature, tp.Any]] = dict()
|
60
76
|
|
61
77
|
_log: logging.Logger = util.logger_for_namespace(__name__)
|
62
78
|
|
63
79
|
@classmethod
|
64
80
|
def validate_signature(cls, method: tp.Callable, *args, **kwargs):
|
65
81
|
|
66
|
-
if method.
|
67
|
-
signature = cls.__method_cache[method.
|
82
|
+
if method.__qualname__ in cls.__method_cache:
|
83
|
+
signature, hints = cls.__method_cache[method.__qualname__]
|
68
84
|
else:
|
69
85
|
signature = inspect.signature(method)
|
70
|
-
|
71
|
-
|
72
|
-
hints = tp.get_type_hints(method)
|
86
|
+
hints = tp.get_type_hints(method)
|
87
|
+
cls.__method_cache[method.__qualname__] = signature, hints
|
73
88
|
|
89
|
+
named_params = list(signature.parameters.keys())
|
74
90
|
positional_index = 0
|
75
91
|
|
76
92
|
for param_name, param in signature.parameters.items():
|
77
93
|
|
78
94
|
param_type = hints.get(param_name)
|
79
95
|
|
80
|
-
values = cls._select_arg(method.__name__, param, positional_index, *args, **kwargs)
|
96
|
+
values = cls._select_arg(method.__name__, param, positional_index, named_params, *args, **kwargs)
|
81
97
|
positional_index += len(values)
|
82
98
|
|
83
99
|
for value in values:
|
@@ -86,11 +102,12 @@ class _TypeValidator:
|
|
86
102
|
@classmethod
|
87
103
|
def validate_return_type(cls, method: tp.Callable, value: tp.Any):
|
88
104
|
|
89
|
-
if method.
|
90
|
-
signature = cls.__method_cache[method.
|
105
|
+
if method.__qualname__ in cls.__method_cache:
|
106
|
+
signature, hints = cls.__method_cache[method.__qualname__]
|
91
107
|
else:
|
92
108
|
signature = inspect.signature(method)
|
93
|
-
|
109
|
+
hints = tp.get_type_hints(method)
|
110
|
+
cls.__method_cache[method.__qualname__] = signature, hints
|
94
111
|
|
95
112
|
correct_type = cls._validate_type(signature.return_annotation, value)
|
96
113
|
|
@@ -107,7 +124,7 @@ class _TypeValidator:
|
|
107
124
|
|
108
125
|
@classmethod
|
109
126
|
def _select_arg(
|
110
|
-
cls, method_name: str, parameter: inspect.Parameter, positional_index,
|
127
|
+
cls, method_name: str, parameter: inspect.Parameter, positional_index, named_params,
|
111
128
|
*args, **kwargs) -> tp.List[tp.Any]:
|
112
129
|
|
113
130
|
if parameter.kind == inspect.Parameter.POSITIONAL_ONLY:
|
@@ -152,7 +169,7 @@ class _TypeValidator:
|
|
152
169
|
|
153
170
|
if parameter.kind == inspect.Parameter.VAR_KEYWORD:
|
154
171
|
|
155
|
-
|
172
|
+
return [arg for kw, arg in kwargs.items() if kw not in named_params]
|
156
173
|
|
157
174
|
raise ex.EUnexpected("Invalid method signature in runtime API (this is a bug)")
|
158
175
|
|
@@ -180,6 +197,12 @@ class _TypeValidator:
|
|
180
197
|
if expected_type == tp.Any:
|
181
198
|
return True
|
182
199
|
|
200
|
+
# Sometimes we need to validate a partial set of arguments
|
201
|
+
# Explicitly passing a SkipValidation value allows for this
|
202
|
+
if isinstance(value, SkipValidation):
|
203
|
+
if value.skip_type == expected_type:
|
204
|
+
return True
|
205
|
+
|
183
206
|
if isinstance(expected_type, cls.__generic_metaclass):
|
184
207
|
|
185
208
|
origin = util.get_origin(expected_type)
|
@@ -216,8 +239,31 @@ class _TypeValidator:
|
|
216
239
|
all(map(lambda k: cls._validate_type(key_type, k), value.keys())) and \
|
217
240
|
all(map(lambda v: cls._validate_type(value_type, v), value.values()))
|
218
241
|
|
242
|
+
if origin.__module__.startswith("tracdap.rt.api."):
|
243
|
+
return isinstance(value, origin)
|
244
|
+
|
219
245
|
raise ex.ETracInternal(f"Validation of [{origin.__name__}] generic parameters is not supported yet")
|
220
246
|
|
247
|
+
# Support for generic type variables
|
248
|
+
if isinstance(expected_type, tp.TypeVar):
|
249
|
+
|
250
|
+
# If there are any constraints or a bound, those must be honoured
|
251
|
+
|
252
|
+
constraints = util.get_constraints(expected_type)
|
253
|
+
bound = util.get_bound(expected_type)
|
254
|
+
|
255
|
+
if constraints:
|
256
|
+
if not any(map(lambda c: type(value) == c, constraints)):
|
257
|
+
return False
|
258
|
+
|
259
|
+
if bound:
|
260
|
+
if not isinstance(value, bound):
|
261
|
+
return False
|
262
|
+
|
263
|
+
# So long as constraints / bound are ok, any type matches a generic type var
|
264
|
+
return True
|
265
|
+
|
266
|
+
|
221
267
|
# Validate everything else as a concrete type
|
222
268
|
|
223
269
|
# TODO: Recursive validation of types for class members using field annotations
|
@@ -237,7 +283,10 @@ class _TypeValidator:
|
|
237
283
|
return f"Named[{named_type}]"
|
238
284
|
|
239
285
|
if origin is tp.Union:
|
240
|
-
|
286
|
+
if len(args) == 2 and args[1] == type(None):
|
287
|
+
return f"Optional[{cls._type_name(args[0])}]"
|
288
|
+
else:
|
289
|
+
return "|".join(map(cls._type_name, args))
|
241
290
|
|
242
291
|
if origin is list:
|
243
292
|
list_type = cls._type_name(args[0])
|
@@ -274,6 +323,11 @@ class StaticValidator:
|
|
274
323
|
|
275
324
|
_log: logging.Logger = util.logger_for_namespace(__name__)
|
276
325
|
|
326
|
+
@classmethod
|
327
|
+
def is_primitive_type(cls, basic_type: meta.BasicType) -> bool:
|
328
|
+
|
329
|
+
return basic_type in cls.__PRIMITIVE_TYPES
|
330
|
+
|
277
331
|
@classmethod
|
278
332
|
def quick_validate_model_def(cls, model_def: meta.ModelDefinition):
|
279
333
|
|
tracdap/rt/_plugins/__init__.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
tracdap/rt/_plugins/_helpers.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
tracdap/rt/_plugins/repo_git.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
tracdap/rt/_plugins/repo_pypi.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
1
|
+
# Licensed to the Fintech Open Source Foundation (FINOS) under one or
|
2
|
+
# more contributor license agreements. See the NOTICE file distributed
|
3
|
+
# with this work for additional information regarding copyright ownership.
|
4
|
+
# FINOS licenses this file to you under the Apache License, Version 2.0
|
5
|
+
# (the "License"); you may not use this file except in compliance with the
|
6
|
+
# License. You may obtain a copy of the License at
|
6
7
|
#
|
7
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
9
|
#
|