vtlengine 1.0.3rc3__py3-none-any.whl → 1.1__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.
Potentially problematic release.
This version of vtlengine might be problematic. Click here for more details.
- vtlengine/API/_InternalApi.py +288 -61
- vtlengine/API/__init__.py +269 -71
- vtlengine/API/data/schema/json_schema_2.1.json +116 -0
- vtlengine/AST/ASTComment.py +56 -0
- vtlengine/AST/ASTConstructor.py +76 -22
- vtlengine/AST/ASTConstructorModules/Expr.py +238 -120
- vtlengine/AST/ASTConstructorModules/ExprComponents.py +126 -61
- vtlengine/AST/ASTConstructorModules/Terminals.py +97 -42
- vtlengine/AST/ASTConstructorModules/__init__.py +50 -0
- vtlengine/AST/ASTEncoders.py +5 -1
- vtlengine/AST/ASTString.py +608 -0
- vtlengine/AST/ASTTemplate.py +28 -2
- vtlengine/AST/DAG/__init__.py +10 -4
- vtlengine/AST/Grammar/lexer.py +0 -1
- vtlengine/AST/Grammar/parser.py +185 -440
- vtlengine/AST/VtlVisitor.py +0 -1
- vtlengine/AST/__init__.py +127 -14
- vtlengine/DataTypes/TimeHandling.py +50 -15
- vtlengine/DataTypes/__init__.py +79 -7
- vtlengine/Exceptions/__init__.py +3 -5
- vtlengine/Exceptions/messages.py +74 -105
- vtlengine/Interpreter/__init__.py +136 -46
- vtlengine/Model/__init__.py +14 -11
- vtlengine/Operators/Aggregation.py +17 -9
- vtlengine/Operators/Analytic.py +64 -20
- vtlengine/Operators/Assignment.py +0 -1
- vtlengine/Operators/CastOperator.py +44 -44
- vtlengine/Operators/Clause.py +16 -10
- vtlengine/Operators/Comparison.py +20 -12
- vtlengine/Operators/Conditional.py +47 -15
- vtlengine/Operators/General.py +9 -4
- vtlengine/Operators/HROperators.py +4 -14
- vtlengine/Operators/Join.py +15 -14
- vtlengine/Operators/Numeric.py +32 -26
- vtlengine/Operators/RoleSetter.py +6 -2
- vtlengine/Operators/Set.py +12 -8
- vtlengine/Operators/String.py +9 -9
- vtlengine/Operators/Time.py +145 -124
- vtlengine/Operators/Validation.py +10 -4
- vtlengine/Operators/__init__.py +56 -69
- vtlengine/Utils/__init__.py +55 -1
- vtlengine/__extras_check.py +17 -0
- vtlengine/__init__.py +2 -2
- vtlengine/files/output/__init__.py +2 -1
- vtlengine/files/output/_time_period_representation.py +2 -1
- vtlengine/files/parser/__init__.py +52 -46
- vtlengine/files/parser/_time_checking.py +4 -4
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/METADATA +21 -17
- vtlengine-1.1.dist-info/RECORD +61 -0
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/WHEEL +1 -1
- vtlengine/DataTypes/NumericTypesHandling.py +0 -38
- vtlengine-1.0.3rc3.dist-info/RECORD +0 -58
- {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/LICENSE.md +0 -0
|
@@ -17,10 +17,14 @@ from vtlengine.DataTypes import (
|
|
|
17
17
|
TimeInterval,
|
|
18
18
|
TimePeriod,
|
|
19
19
|
)
|
|
20
|
-
from vtlengine.DataTypes.TimeHandling import
|
|
20
|
+
from vtlengine.DataTypes.TimeHandling import PERIOD_IND_MAPPING
|
|
21
21
|
from vtlengine.Exceptions import InputValidationException, SemanticError
|
|
22
22
|
from vtlengine.files.parser._rfc_dialect import register_rfc
|
|
23
|
-
from vtlengine.files.parser._time_checking import
|
|
23
|
+
from vtlengine.files.parser._time_checking import (
|
|
24
|
+
check_date,
|
|
25
|
+
check_time,
|
|
26
|
+
check_time_period,
|
|
27
|
+
)
|
|
24
28
|
from vtlengine.Model import Component, Dataset, Role
|
|
25
29
|
|
|
26
30
|
TIME_CHECKS_MAPPING: Dict[Type[ScalarType], Any] = {
|
|
@@ -38,14 +42,9 @@ def _validate_csv_path(components: Dict[str, Component], csv_path: Path) -> None
|
|
|
38
42
|
raise Exception(f"Path {csv_path} is not a file.")
|
|
39
43
|
register_rfc()
|
|
40
44
|
try:
|
|
41
|
-
with open(csv_path, "r") as f:
|
|
45
|
+
with open(csv_path, "r", errors="replace", encoding="utf-8") as f:
|
|
42
46
|
reader = DictReader(f, dialect="rfc")
|
|
43
47
|
csv_columns = reader.fieldnames
|
|
44
|
-
|
|
45
|
-
except UnicodeDecodeError as error:
|
|
46
|
-
# https://coderwall.com/p/stzy9w/raising-unicodeencodeerror-and-unicodedecodeerror-
|
|
47
|
-
# manually-for-testing-purposes
|
|
48
|
-
raise InputValidationException("0-1-2-5", file=csv_path.name) from error
|
|
49
48
|
except InputValidationException as ie:
|
|
50
49
|
raise InputValidationException("{}".format(str(ie))) from None
|
|
51
50
|
except Exception as e:
|
|
@@ -73,8 +72,11 @@ def _sanitize_pandas_columns(
|
|
|
73
72
|
components: Dict[str, Component], csv_path: Union[str, Path], data: pd.DataFrame
|
|
74
73
|
) -> pd.DataFrame:
|
|
75
74
|
# Fast loading from SDMX-CSV
|
|
76
|
-
if (
|
|
77
|
-
|
|
75
|
+
if (
|
|
76
|
+
"DATAFLOW" in data.columns
|
|
77
|
+
and data.columns[0] == "DATAFLOW"
|
|
78
|
+
and "DATAFLOW" not in components
|
|
79
|
+
):
|
|
78
80
|
data.drop(columns=["DATAFLOW"], inplace=True)
|
|
79
81
|
if "STRUCTURE" in data.columns and data.columns[0] == "STRUCTURE":
|
|
80
82
|
if "STRUCTURE" not in components:
|
|
@@ -102,32 +104,18 @@ def _sanitize_pandas_columns(
|
|
|
102
104
|
return data
|
|
103
105
|
|
|
104
106
|
|
|
105
|
-
def _pandas_load_csv(components: Dict[str, Component], csv_path: Path) -> pd.DataFrame:
|
|
106
|
-
obj_dtypes = {comp_name:
|
|
107
|
-
|
|
108
|
-
try:
|
|
109
|
-
data = pd.read_csv(
|
|
110
|
-
csv_path, dtype=obj_dtypes, engine="c", keep_default_na=False, na_values=[""]
|
|
111
|
-
)
|
|
112
|
-
except UnicodeDecodeError:
|
|
113
|
-
raise InputValidationException(code="0-1-2-5", file=csv_path.name)
|
|
114
|
-
|
|
115
|
-
return _sanitize_pandas_columns(components, csv_path, data)
|
|
116
|
-
|
|
107
|
+
def _pandas_load_csv(components: Dict[str, Component], csv_path: Union[str, Path]) -> pd.DataFrame:
|
|
108
|
+
obj_dtypes = {comp_name: object for comp_name, comp in components.items()}
|
|
117
109
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
110
|
+
data = pd.read_csv(
|
|
111
|
+
csv_path,
|
|
112
|
+
dtype=obj_dtypes,
|
|
113
|
+
engine="c",
|
|
114
|
+
keep_default_na=False,
|
|
115
|
+
na_values=[""],
|
|
116
|
+
encoding_errors="replace",
|
|
117
|
+
)
|
|
126
118
|
|
|
127
|
-
except UnicodeDecodeError:
|
|
128
|
-
raise InputValidationException(code="0-1-2-5", file=csv_path)
|
|
129
|
-
except Exception as e:
|
|
130
|
-
raise InputValidationException(f"ERROR: {str(e)}, review file {str(csv_path)}")
|
|
131
119
|
return _sanitize_pandas_columns(components, csv_path, data)
|
|
132
120
|
|
|
133
121
|
|
|
@@ -165,7 +153,6 @@ def _validate_pandas(
|
|
|
165
153
|
comp_name = ""
|
|
166
154
|
comp = None
|
|
167
155
|
try:
|
|
168
|
-
|
|
169
156
|
for comp_name, comp in components.items():
|
|
170
157
|
if comp.data_type in (Date, TimePeriod, TimeInterval):
|
|
171
158
|
data[comp_name] = data[comp_name].map(
|
|
@@ -173,27 +160,45 @@ def _validate_pandas(
|
|
|
173
160
|
)
|
|
174
161
|
elif comp.data_type == Integer:
|
|
175
162
|
data[comp_name] = data[comp_name].map(
|
|
176
|
-
lambda x: Integer.cast(float(x)), na_action="ignore"
|
|
163
|
+
lambda x: Integer.cast(float(str(x))), na_action="ignore"
|
|
177
164
|
)
|
|
178
165
|
elif comp.data_type == Number:
|
|
179
|
-
data[comp_name] = data[comp_name].map(lambda x: float(x), na_action="ignore")
|
|
166
|
+
data[comp_name] = data[comp_name].map(lambda x: float((str(x))), na_action="ignore")
|
|
180
167
|
elif comp.data_type == Boolean:
|
|
181
168
|
data[comp_name] = data[comp_name].map(
|
|
182
|
-
lambda x: _parse_boolean(x), na_action="ignore"
|
|
169
|
+
lambda x: _parse_boolean(str(x)), na_action="ignore"
|
|
183
170
|
)
|
|
184
171
|
elif comp.data_type == Duration:
|
|
185
172
|
values_correct = (
|
|
186
173
|
data[comp_name]
|
|
187
|
-
.map(
|
|
174
|
+
.map(
|
|
175
|
+
lambda x: Duration.validate_duration(x),
|
|
176
|
+
na_action="ignore",
|
|
177
|
+
)
|
|
188
178
|
.all()
|
|
189
179
|
)
|
|
190
180
|
if not values_correct:
|
|
191
|
-
|
|
181
|
+
try:
|
|
182
|
+
values_correct = (
|
|
183
|
+
data[comp_name]
|
|
184
|
+
.map(
|
|
185
|
+
lambda x: x.replace(" ", "") in PERIOD_IND_MAPPING, # type: ignore[union-attr]
|
|
186
|
+
na_action="ignore",
|
|
187
|
+
)
|
|
188
|
+
.all()
|
|
189
|
+
)
|
|
190
|
+
if not values_correct:
|
|
191
|
+
raise ValueError(
|
|
192
|
+
f"Duration values are not correct in column {comp_name}"
|
|
193
|
+
)
|
|
194
|
+
except ValueError:
|
|
195
|
+
raise ValueError(f"Duration values are not correct in column {comp_name}")
|
|
192
196
|
else:
|
|
193
197
|
data[comp_name] = data[comp_name].map(
|
|
194
198
|
lambda x: str(x).replace('"', ""), na_action="ignore"
|
|
195
199
|
)
|
|
196
|
-
data[comp_name] = data[comp_name].astype(
|
|
200
|
+
data[comp_name] = data[comp_name].astype(object, errors="raise")
|
|
201
|
+
|
|
197
202
|
except ValueError:
|
|
198
203
|
str_comp = SCALAR_TYPES_CLASS_REVERSE[comp.data_type] if comp else "Null"
|
|
199
204
|
raise SemanticError("0-1-1-12", name=dataset_name, column=comp_name, type=str_comp)
|
|
@@ -202,14 +207,15 @@ def _validate_pandas(
|
|
|
202
207
|
|
|
203
208
|
|
|
204
209
|
def load_datapoints(
|
|
205
|
-
components: Dict[str, Component],
|
|
210
|
+
components: Dict[str, Component],
|
|
211
|
+
dataset_name: str,
|
|
212
|
+
csv_path: Optional[Union[Path, str]] = None,
|
|
206
213
|
) -> pd.DataFrame:
|
|
207
214
|
if csv_path is None or (isinstance(csv_path, Path) and not csv_path.exists()):
|
|
208
215
|
return pd.DataFrame(columns=list(components.keys()))
|
|
209
|
-
elif isinstance(csv_path, str):
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
_validate_csv_path(components, csv_path)
|
|
216
|
+
elif isinstance(csv_path, (str, Path)):
|
|
217
|
+
if isinstance(csv_path, Path):
|
|
218
|
+
_validate_csv_path(components, csv_path)
|
|
213
219
|
data = _pandas_load_csv(components, csv_path)
|
|
214
220
|
else:
|
|
215
221
|
raise Exception("Invalid csv_path type")
|
|
@@ -21,16 +21,16 @@ def check_date(value: str) -> str:
|
|
|
21
21
|
raise InputValidationException(f"Date {value} is out of range for the month.")
|
|
22
22
|
if "month must be in 1..12" in str(e):
|
|
23
23
|
raise InputValidationException(
|
|
24
|
-
f"Date {value} is invalid.
|
|
24
|
+
f"Date {value} is invalid. Month must be between 1 and 12."
|
|
25
25
|
)
|
|
26
26
|
raise InputValidationException(
|
|
27
|
-
f"Date {value} is not in the correct format.
|
|
27
|
+
f"Date {value} is not in the correct format. Use YYYY-MM-DD."
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
# Check date is between 1900 and 9999
|
|
31
31
|
if not 1800 <= date_value.year <= 9999:
|
|
32
32
|
raise InputValidationException(
|
|
33
|
-
f"Date {value} is invalid.
|
|
33
|
+
f"Date {value} is invalid. Year must be between 1900 and 9999."
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
return date_value.isoformat()
|
|
@@ -68,7 +68,7 @@ def check_time(value: str) -> str:
|
|
|
68
68
|
raise ValueError("Start date is greater than end date.")
|
|
69
69
|
return value
|
|
70
70
|
raise ValueError(
|
|
71
|
-
"Time is not in the correct format.
|
|
71
|
+
"Time is not in the correct format. Use YYYY-MM-DD/YYYY-MM-DD or YYYY or YYYY-MM."
|
|
72
72
|
)
|
|
73
73
|
|
|
74
74
|
|
|
@@ -1,31 +1,35 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: vtlengine
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1
|
|
4
4
|
Summary: Run and Validate VTL Scripts
|
|
5
5
|
License: AGPL-3.0
|
|
6
6
|
Keywords: vtl,sdmx,vtlengine,Validation and Transformation Language
|
|
7
7
|
Author: MeaningfulData
|
|
8
8
|
Author-email: info@meaningfuldata.eu
|
|
9
|
-
|
|
9
|
+
Maintainer: Francisco Javier Hernandez del Caño
|
|
10
|
+
Maintainer-email: javier.hernandez@meaningfuldata.eu
|
|
11
|
+
Requires-Python: >=3.9
|
|
10
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
13
|
Classifier: Intended Audience :: Developers
|
|
12
14
|
Classifier: Intended Audience :: Information Technology
|
|
13
15
|
Classifier: Intended Audience :: Science/Research
|
|
14
|
-
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
20
16
|
Classifier: Typing :: Typed
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
17
|
+
Provides-Extra: all
|
|
18
|
+
Provides-Extra: s3
|
|
19
|
+
Requires-Dist: antlr4-python3-runtime (>=4.9.2,<4.10)
|
|
20
|
+
Requires-Dist: duckdb (>=1.1,<1.2)
|
|
21
|
+
Requires-Dist: fsspec (>=2022.11.0,<2023.0) ; extra == "all"
|
|
22
|
+
Requires-Dist: fsspec (>=2022.11.0,<2023.0) ; extra == "s3"
|
|
23
|
+
Requires-Dist: jsonschema (>=3.2.0,<5.0)
|
|
24
|
+
Requires-Dist: networkx (>=2.8,<3.0)
|
|
25
|
+
Requires-Dist: numpy (>=1.23.2,<2) ; python_version < "3.13"
|
|
26
|
+
Requires-Dist: numpy (>=2.1.0) ; python_version >= "3.13"
|
|
27
|
+
Requires-Dist: pandas (>=2.1.4,<2.2) ; python_version < "3.13"
|
|
28
|
+
Requires-Dist: pandas (>=2.2,<3.0) ; python_version >= "3.13"
|
|
29
|
+
Requires-Dist: pysdmx[xml] (>=1.3.0,<2.0)
|
|
30
|
+
Requires-Dist: s3fs (>=2022.11.0,<2023.0) ; extra == "all"
|
|
31
|
+
Requires-Dist: s3fs (>=2022.11.0,<2023.0) ; extra == "s3"
|
|
32
|
+
Requires-Dist: sqlglot (>=22.2.0,<23.0)
|
|
29
33
|
Project-URL: Authors, https://github.com/Meaningful-Data/vtlengine/graphs/contributors
|
|
30
34
|
Project-URL: Documentation, https://docs.vtlengine.meaningfuldata.eu
|
|
31
35
|
Project-URL: IssueTracker, https://github.com/Meaningful-Data/vtlengine/issues
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
vtlengine/API/_InternalApi.py,sha256=uSPW-Lny_zSVrhHfkz6FbBEaxQXNySTGPI2LF8wKTHY,22761
|
|
2
|
+
vtlengine/API/__init__.py,sha256=IiJZWSlHpUWq73Qv1_V-Tirim-ZnpF3xexFtW1Psyx8,17866
|
|
3
|
+
vtlengine/API/data/schema/json_schema_2.1.json,sha256=v3-C0Xnq8qScJSPAtLgb3rjKMrd3nz-bIxgZdTSEUiU,4336
|
|
4
|
+
vtlengine/AST/ASTComment.py,sha256=bAJW7aaqBXU2LqMtRvL_XOttdl1AFZufa15vmQdvNlY,1667
|
|
5
|
+
vtlengine/AST/ASTConstructor.py,sha256=X55I98BKG1ItyGIDObF9ALVfCcWnU-0wwCWJsiPILkg,21488
|
|
6
|
+
vtlengine/AST/ASTConstructorModules/Expr.py,sha256=aCL3uuQF0BJIels6rTckL8FAAykzImYb3AESs7umFcY,70066
|
|
7
|
+
vtlengine/AST/ASTConstructorModules/ExprComponents.py,sha256=2Ft4e5w2NtbfaqSNW8I9qSpG9iUaPIfdug7yYWo2gqE,38553
|
|
8
|
+
vtlengine/AST/ASTConstructorModules/Terminals.py,sha256=7zWDx_SFcbnL35G7Y0qZwl-lLEsfqReyzBX0UxwTCOk,27054
|
|
9
|
+
vtlengine/AST/ASTConstructorModules/__init__.py,sha256=J6g6NhJD8j0Ek1YmpethxRiFdjhLxUTM0mc3NHRFLlM,1879
|
|
10
|
+
vtlengine/AST/ASTDataExchange.py,sha256=kPSz21DGbEv-2bZowObseqf2d2_iQj1VnrqWuD9ZwtA,140
|
|
11
|
+
vtlengine/AST/ASTEncoders.py,sha256=-Ar6a0GqMdJZK4CtZ1pUpIeGv57oSdN5qy3-aF0Zt9c,948
|
|
12
|
+
vtlengine/AST/ASTString.py,sha256=y_xWVm2OHgsFs9As1-0PjEnmftjaoRsZJHZNtsFcKXc,25297
|
|
13
|
+
vtlengine/AST/ASTTemplate.py,sha256=qUkz0AE1ay3gFrCidzhJAqxRnZR8nj98DOKAW2rXoso,12961
|
|
14
|
+
vtlengine/AST/ASTVisitor.py,sha256=3QQTudBpbR4pPQdH7y07EgwuzhoGzNQ59qox8R-E3fM,500
|
|
15
|
+
vtlengine/AST/DAG/__init__.py,sha256=ViL1vfLOCU28Yx8cOMt8aIvguSrzYYTb9qPhAwoExwY,15074
|
|
16
|
+
vtlengine/AST/DAG/_words.py,sha256=lEuBQ_w-KoKGna-x3gFGfbX1KP4Ez5EgdomH2LOeodk,170
|
|
17
|
+
vtlengine/AST/Grammar/Vtl.g4,sha256=86bBWjQLCHZSuB5iLIk0JZRgMyMg0n7xbU8qzot2cIE,26313
|
|
18
|
+
vtlengine/AST/Grammar/VtlTokens.g4,sha256=SwDR_59U25APqslczFcvTUiPoH7bC6kGaH2GkJ3kYzA,9972
|
|
19
|
+
vtlengine/AST/Grammar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
vtlengine/AST/Grammar/lexer.py,sha256=ncoPevKkUpGyYx5mVKcKjocVhFoKSdu-5NSQDPY2V3g,105742
|
|
21
|
+
vtlengine/AST/Grammar/parser.py,sha256=ISi5OWmPbLitMp-8fg-wa1-475TfKZWK98jXjyOLi-8,634355
|
|
22
|
+
vtlengine/AST/Grammar/tokens.py,sha256=YF7tO0nF2zYC-VaBAJLyc6VitM72CvYfFQpoPDGCMzo,3139
|
|
23
|
+
vtlengine/AST/VtlVisitor.py,sha256=NJfXJVP6wNmasJmPLlojFqm9R5VSamOAKg_w7BMrhac,35332
|
|
24
|
+
vtlengine/AST/__init__.py,sha256=JnPilognG2rT2gtpjD4OwKFX0O3ZqvV-ic8gJxRu7Xo,11672
|
|
25
|
+
vtlengine/DataTypes/TimeHandling.py,sha256=CYnC0sb1qbRjTnCSsA3wgez7QftOzrXHxbuZXlY3O3Q,20151
|
|
26
|
+
vtlengine/DataTypes/__init__.py,sha256=LYXrde68bYm7MLeMLmr4haeOTSE4Fnpq9G2Ewy7DiaU,23084
|
|
27
|
+
vtlengine/Exceptions/__init__.py,sha256=rSSskV_qCBFzg_W67Q1QBAL7Lnq88D7yi2BDYo1hytw,4727
|
|
28
|
+
vtlengine/Exceptions/messages.py,sha256=9Tzkm-Q4ZI7UFFmWfsiy2xI7hFKMrnPB-EmUfVgxuBo,19428
|
|
29
|
+
vtlengine/Interpreter/__init__.py,sha256=yFXLi3Mr7EnOmdynf-BvFwDHOBsWVjRXSkNgdmhfJVc,83533
|
|
30
|
+
vtlengine/Model/__init__.py,sha256=xWrwhdUOj8Y-5x38zP5XnmFPw8IkBVBBG2bPsUBGLA8,15869
|
|
31
|
+
vtlengine/Operators/Aggregation.py,sha256=43bqjaMqGG9zzFkcs6JLfShb1ISupmyQnXOQQ-HQo9E,11906
|
|
32
|
+
vtlengine/Operators/Analytic.py,sha256=GiVNwa02JNRaVcHEkqKlat9WSIgQ32OhpgOdYc9PlJo,12818
|
|
33
|
+
vtlengine/Operators/Assignment.py,sha256=xyJgGPoFYbq6mzX06gz7Q7L8jXJxpUkgzdY3Lrne2hw,793
|
|
34
|
+
vtlengine/Operators/Boolean.py,sha256=3U5lHkxW5d7QQdGDNxXeXqejlPfFrXKG8_TqknrC8Ls,2856
|
|
35
|
+
vtlengine/Operators/CastOperator.py,sha256=mvWfNhJ1pEEk_ZQp-3unLoYJvJShUjUu_BOYQ6ByySI,16951
|
|
36
|
+
vtlengine/Operators/Clause.py,sha256=_Sdt3qQUpphNRs4IQW5pSj9kagzwLluV9BRHMGNxqsI,15022
|
|
37
|
+
vtlengine/Operators/Comparison.py,sha256=7G2UK1BDCDJR4jTXa-txJlAJEvzXEeYaDSA_2oxjgKY,17286
|
|
38
|
+
vtlengine/Operators/Conditional.py,sha256=nxatC0tr8UvsOVcCMcBjK_U6hzjbd2uf3VG3YiCMUOo,19944
|
|
39
|
+
vtlengine/Operators/General.py,sha256=q1fpqP4IYEwURXi8Eo-_j5AUktK0dvNosL9SgSe7a8w,6711
|
|
40
|
+
vtlengine/Operators/HROperators.py,sha256=VVp5FcdbDXhU_VCfUA6t75bs51qx9fKJT4n15WM2vyM,8866
|
|
41
|
+
vtlengine/Operators/Join.py,sha256=df2XG2tKmha_WUhHEYhgZIVc_2L8Wr45o0ISm-HOReA,18108
|
|
42
|
+
vtlengine/Operators/Numeric.py,sha256=icYTWzEsw6VQFLYc5Wucgr8961d8ZwTFx_wfZ8Wp9Co,12083
|
|
43
|
+
vtlengine/Operators/RoleSetter.py,sha256=mHZIdcHC3wflj81ekLbioDG1f8yHZXYDQFymV-KnyXA,2274
|
|
44
|
+
vtlengine/Operators/Set.py,sha256=f1uLeY4XZF0cWEwpXRB_CczgbXr6s33DYPuFt39HlEg,7084
|
|
45
|
+
vtlengine/Operators/String.py,sha256=ghWtYl6oUEAAzynY1a9Hg4yqRA9Sa7uk2B6iF9uuSqQ,20230
|
|
46
|
+
vtlengine/Operators/Time.py,sha256=tpBZkuDldlcVnNWUNvrc8yhnG1knalZVFklGppbzw4k,42734
|
|
47
|
+
vtlengine/Operators/Validation.py,sha256=ev3HyU7e1XbeAtUQ1y6zY3fzBwMqetDPhG3NNveAGOE,9988
|
|
48
|
+
vtlengine/Operators/__init__.py,sha256=GN5eaAwmzfYKD7JJRIaRqdIJzflGc3UMvrOC9mlYNVo,37227
|
|
49
|
+
vtlengine/Utils/__init__.py,sha256=zhGPJA8MjHmtEEwMS4CxEFYL0tk2L5F0YPn7bitdRzM,8954
|
|
50
|
+
vtlengine/__extras_check.py,sha256=Wr-lxGZhXJZEacVV5cUkvKt7XM-mry0kYAe3VxNrVcY,614
|
|
51
|
+
vtlengine/__init__.py,sha256=E31A6eDHTZsPNI5Cq-zv9-O87D5n8du-oZtVB6u3dVk,165
|
|
52
|
+
vtlengine/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
vtlengine/files/output/__init__.py,sha256=4tmf-p1Y1u5Ohrwt3clQA-FMGaijKI3HC_iwn3H9J8c,1250
|
|
54
|
+
vtlengine/files/output/_time_period_representation.py,sha256=D5XCSXyEuX_aBzTvBV3sZxACcgwXz2Uu_YH3loMP8q0,1610
|
|
55
|
+
vtlengine/files/parser/__init__.py,sha256=JamEIWI0pFZxT0sKYE6Fii8H2JQcsFn4Nf3T0OLSm9g,8637
|
|
56
|
+
vtlengine/files/parser/_rfc_dialect.py,sha256=Y8kAYBxH_t9AieN_tYg7QRh5A4DgvabKarx9Ko3QeCQ,462
|
|
57
|
+
vtlengine/files/parser/_time_checking.py,sha256=UAC_Pv-eQJKrhgTguWb--xfqMMs6quyMeiAkGBt_vgI,4725
|
|
58
|
+
vtlengine-1.1.dist-info/LICENSE.md,sha256=2xqHuoHohba7gpcZZKtOICRjzeKsQANXG8WoV9V35KM,33893
|
|
59
|
+
vtlengine-1.1.dist-info/METADATA,sha256=0F0SO41WyyQfA4zhfkYmIaM0-6eSlShGKoDE7i2uebI,8971
|
|
60
|
+
vtlengine-1.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
61
|
+
vtlengine-1.1.dist-info/RECORD,,
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import operator
|
|
2
|
-
from decimal import Decimal
|
|
3
|
-
from typing import Union
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def decimal_add(a: Union[float, int], b: Union[float, int]) -> float:
|
|
7
|
-
"""
|
|
8
|
-
Adds two numbers, if they are floats, converts them to Decimal and then to float
|
|
9
|
-
:param a: first number
|
|
10
|
-
:param b: second number
|
|
11
|
-
:return: the sum of the two numbers
|
|
12
|
-
"""
|
|
13
|
-
if isinstance(a, float) and isinstance(b, float):
|
|
14
|
-
decimal_value = Decimal(a) + Decimal(b)
|
|
15
|
-
return float(decimal_value)
|
|
16
|
-
|
|
17
|
-
return operator.add(a, b)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def decimal_sub(a: Union[float, int], b: Union[float, int]) -> float:
|
|
21
|
-
if isinstance(a, float) and isinstance(b, float):
|
|
22
|
-
decimal_value = Decimal(a) - Decimal(b)
|
|
23
|
-
return float(decimal_value)
|
|
24
|
-
return operator.sub(a, b)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def decimal_mul(a: Union[float, int], b: Union[float, int]) -> float:
|
|
28
|
-
if isinstance(a, float) and isinstance(b, float):
|
|
29
|
-
decimal_value = Decimal(a) * Decimal(b)
|
|
30
|
-
return float(decimal_value)
|
|
31
|
-
return operator.mul(a, b)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def decimal_div(a: Union[float, int], b: Union[float, int]) -> float:
|
|
35
|
-
if isinstance(a, float) and isinstance(b, float):
|
|
36
|
-
decimal_value = Decimal(a) / Decimal(b)
|
|
37
|
-
return float(decimal_value)
|
|
38
|
-
return operator.truediv(a, b)
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
vtlengine/API/_InternalApi.py,sha256=9dBXTc-JTD7tGSzRqtv6aonk4ONxPlhkdakgN0aOQm4,14397
|
|
2
|
-
vtlengine/API/__init__.py,sha256=yZe1cTwUmJc1fZWfe7NW94gcUxG92Spi6D6P8miEST4,10987
|
|
3
|
-
vtlengine/AST/ASTConstructor.py,sha256=UvAY1sRrdidBC_JfgcYtJLu8JeSj00FEaUqzsgyWtHI,19668
|
|
4
|
-
vtlengine/AST/ASTConstructorModules/Expr.py,sha256=ERHDPcf-eufpSDgyg_iwHEZXkBtcGdUpWbTUEra3lcY,65766
|
|
5
|
-
vtlengine/AST/ASTConstructorModules/ExprComponents.py,sha256=_rTOkafq_jo_jq2fLoggEiuB1hYvhagU4QodJibYZL0,36138
|
|
6
|
-
vtlengine/AST/ASTConstructorModules/Terminals.py,sha256=gbvauCKjq0C07WbuZov8mqUmtAzJ-d7CukkpvgzdYgg,25146
|
|
7
|
-
vtlengine/AST/ASTConstructorModules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
vtlengine/AST/ASTDataExchange.py,sha256=kPSz21DGbEv-2bZowObseqf2d2_iQj1VnrqWuD9ZwtA,140
|
|
9
|
-
vtlengine/AST/ASTEncoders.py,sha256=0RxSQ-4SFTOhFtQFntNeo8VT_gq4qCi92ZK7EWWqOCM,758
|
|
10
|
-
vtlengine/AST/ASTTemplate.py,sha256=3dd9fkWNJywDn279tUuZGcOCPbyMiGiqnBwqAB1FWrU,12357
|
|
11
|
-
vtlengine/AST/ASTVisitor.py,sha256=3QQTudBpbR4pPQdH7y07EgwuzhoGzNQ59qox8R-E3fM,500
|
|
12
|
-
vtlengine/AST/DAG/__init__.py,sha256=JyTaO4sqE9xZ_IcBv-aInoOFrvH0K3kc8hZCMkfth6A,14621
|
|
13
|
-
vtlengine/AST/DAG/_words.py,sha256=lEuBQ_w-KoKGna-x3gFGfbX1KP4Ez5EgdomH2LOeodk,170
|
|
14
|
-
vtlengine/AST/Grammar/Vtl.g4,sha256=86bBWjQLCHZSuB5iLIk0JZRgMyMg0n7xbU8qzot2cIE,26313
|
|
15
|
-
vtlengine/AST/Grammar/VtlTokens.g4,sha256=SwDR_59U25APqslczFcvTUiPoH7bC6kGaH2GkJ3kYzA,9972
|
|
16
|
-
vtlengine/AST/Grammar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
vtlengine/AST/Grammar/lexer.py,sha256=an_9C6ASQ2PN_0tAn41plIYt3gTx2cMrcbtBDXQyI-c,105743
|
|
18
|
-
vtlengine/AST/Grammar/parser.py,sha256=4AA9tdgPuAyXELW5Cr6hZaHq3pdNKp0NeDpp8sPaVb0,635423
|
|
19
|
-
vtlengine/AST/Grammar/tokens.py,sha256=YF7tO0nF2zYC-VaBAJLyc6VitM72CvYfFQpoPDGCMzo,3139
|
|
20
|
-
vtlengine/AST/VtlVisitor.py,sha256=OXx2mzbHEs7U_uKsbEzmAmXnFkWO8_Hv4aeUNTPYkJQ,35333
|
|
21
|
-
vtlengine/AST/__init__.py,sha256=_-NLJ-GCX5mMmAUGPnY3NzErnFEgjg8LdoGfpdRQjrU,9809
|
|
22
|
-
vtlengine/DataTypes/NumericTypesHandling.py,sha256=eeSUhnRkAlcYjwbLZcuuUuJUNFWR3tVWQj8DfEHythk,1230
|
|
23
|
-
vtlengine/DataTypes/TimeHandling.py,sha256=wRXhY7YmnKPkEk1yL_X1GkKVIya-vN3JaL_jRr2p9V0,18944
|
|
24
|
-
vtlengine/DataTypes/__init__.py,sha256=fhIorhqFkV9hPgJ0NQByRd1Cg_aiK_yUOGfBH11wPho,21617
|
|
25
|
-
vtlengine/Exceptions/__init__.py,sha256=_wgOY4XH92hDPOm5rHrR8R9xTc8kqMt0uF2gYLqlnB8,4780
|
|
26
|
-
vtlengine/Exceptions/messages.py,sha256=OMEI4isYdpL743_lU-b0ur8aiW643joVprCL9MS_RI0,21946
|
|
27
|
-
vtlengine/Interpreter/__init__.py,sha256=MkGxr-GDbXTgXnyG70ls3c7i8aZMr51ud6wUhEHU0S4,80456
|
|
28
|
-
vtlengine/Model/__init__.py,sha256=gnDArV8BXnK_x2Oj1lslAyMjtU7RyDSejV4920XfmvI,15593
|
|
29
|
-
vtlengine/Operators/Aggregation.py,sha256=04Gb6TsDS1BrBWxrihmGDCN6yYJcnCgtiC8GpltUKC4,11621
|
|
30
|
-
vtlengine/Operators/Analytic.py,sha256=ODi-vyyTiIETMtj_Ifc9xmneg-38oophS8VaX1oBdJY,11329
|
|
31
|
-
vtlengine/Operators/Assignment.py,sha256=Iz_ap-kfP9q-jRaTjb4iLyx9BYW-zMWYGBDOwSf8rZU,794
|
|
32
|
-
vtlengine/Operators/Boolean.py,sha256=3U5lHkxW5d7QQdGDNxXeXqejlPfFrXKG8_TqknrC8Ls,2856
|
|
33
|
-
vtlengine/Operators/CastOperator.py,sha256=WoK5-laTd7asYWEu0YcV0sLKt4P8k1MjLFXFBws9QKk,16727
|
|
34
|
-
vtlengine/Operators/Clause.py,sha256=KT9_upNvFvVjr4ry2TUyYnwP3WwQB8xaZWf1MoQwwkw,14784
|
|
35
|
-
vtlengine/Operators/Comparison.py,sha256=_yqY0fCzm5J8L9LqCQReUlMxP5w2iL9ppAQR1i-byAg,17180
|
|
36
|
-
vtlengine/Operators/Conditional.py,sha256=kV6vPWTt98wn5xoPblJ7rwbknJURSPKrLcN0-j47y7w,18530
|
|
37
|
-
vtlengine/Operators/General.py,sha256=qWGiTfE4pueh32ZrgQD3hYfhiffqpU-3eo-2BBzHztY,6642
|
|
38
|
-
vtlengine/Operators/HROperators.py,sha256=HFpZWGvYo4wpVSsbwKEFJQzhINZoYnypp4c77Q0LSXM,8970
|
|
39
|
-
vtlengine/Operators/Join.py,sha256=utTY7J9amAzA-G4RiK7yynBTMB-VLzwQaxn1XvnmzqM,17987
|
|
40
|
-
vtlengine/Operators/Numeric.py,sha256=iiah3HhHPHB6aNfiol5vMV07lCfmvxF8viiHhmKj6Ww,11906
|
|
41
|
-
vtlengine/Operators/RoleSetter.py,sha256=mbYsXrTDaa9qnjkr5T1EMW1DEh2gN4HqX4eZbGUg5XE,2232
|
|
42
|
-
vtlengine/Operators/Set.py,sha256=sosjBAgV6RlY1UxfyLr2afxYSSLT1U_buS5BohOZlrM,6930
|
|
43
|
-
vtlengine/Operators/String.py,sha256=7-NH9ZzsJwgaVpZYJ_fpvqTDr7aiMuM0zZW5_CcSuug,20142
|
|
44
|
-
vtlengine/Operators/Time.py,sha256=BHXmbmDES3EkAMgu1PyfNTWk7zWNPb3p5InPuaOztNQ,42929
|
|
45
|
-
vtlengine/Operators/Validation.py,sha256=fFmtECG4J0FmaW7SmeOTs3WZeNfOE-D1bI3T6IVzrr4,9932
|
|
46
|
-
vtlengine/Operators/__init__.py,sha256=oNkMlvTAfYmWK1X1Ngih9L87TZ9FTeFgk6nM3rL0lFQ,37197
|
|
47
|
-
vtlengine/Utils/__init__.py,sha256=I_LphVLMqunGRuZ3DnHVeNfHdFaBZb3tUsf2gXKGJsg,7552
|
|
48
|
-
vtlengine/__init__.py,sha256=L9tGzRGQ8HMDS23sVWIbBvj41sXR89pf0ZMzEidIEMM,89
|
|
49
|
-
vtlengine/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
-
vtlengine/files/output/__init__.py,sha256=fOvKUGr2EHOELMx6bL2deLjffz2Q_0vQnqtvITBWyvg,1170
|
|
51
|
-
vtlengine/files/output/_time_period_representation.py,sha256=Afukc1XQlJOsgv0kKrLJV1xergd2nLqyIzOsQy2GMSI,1579
|
|
52
|
-
vtlengine/files/parser/__init__.py,sha256=LiIoya46Y537kFt-7IMl4xCqiV4SCxsINgQqb_a0bfs,8787
|
|
53
|
-
vtlengine/files/parser/_rfc_dialect.py,sha256=Y8kAYBxH_t9AieN_tYg7QRh5A4DgvabKarx9Ko3QeCQ,462
|
|
54
|
-
vtlengine/files/parser/_time_checking.py,sha256=JoVhuOgSuMFw4_OoMn2XsR7PKXT-cpxUYEUTHs5KPjs,4740
|
|
55
|
-
vtlengine-1.0.3rc3.dist-info/LICENSE.md,sha256=2xqHuoHohba7gpcZZKtOICRjzeKsQANXG8WoV9V35KM,33893
|
|
56
|
-
vtlengine-1.0.3rc3.dist-info/METADATA,sha256=UX1RolcI5LX_RzGJ-6KMjc3D_GIuA4bx5WNYSprLF_Y,8773
|
|
57
|
-
vtlengine-1.0.3rc3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
58
|
-
vtlengine-1.0.3rc3.dist-info/RECORD,,
|
|
File without changes
|