vtlengine 1.0__py3-none-any.whl → 1.0.2__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 +159 -102
- vtlengine/API/__init__.py +110 -68
- vtlengine/AST/ASTConstructor.py +188 -98
- vtlengine/AST/ASTConstructorModules/Expr.py +402 -205
- vtlengine/AST/ASTConstructorModules/ExprComponents.py +248 -104
- vtlengine/AST/ASTConstructorModules/Terminals.py +158 -95
- vtlengine/AST/ASTEncoders.py +1 -1
- vtlengine/AST/ASTTemplate.py +24 -9
- vtlengine/AST/ASTVisitor.py +8 -12
- vtlengine/AST/DAG/__init__.py +43 -35
- vtlengine/AST/DAG/_words.py +4 -4
- vtlengine/AST/Grammar/Vtl.g4 +49 -20
- vtlengine/AST/Grammar/VtlTokens.g4 +13 -1
- vtlengine/AST/Grammar/lexer.py +2012 -1312
- vtlengine/AST/Grammar/parser.py +7524 -4343
- vtlengine/AST/Grammar/tokens.py +140 -128
- vtlengine/AST/VtlVisitor.py +16 -5
- vtlengine/AST/__init__.py +41 -11
- vtlengine/DataTypes/NumericTypesHandling.py +5 -4
- vtlengine/DataTypes/TimeHandling.py +196 -301
- vtlengine/DataTypes/__init__.py +304 -218
- vtlengine/Exceptions/__init__.py +96 -27
- vtlengine/Exceptions/messages.py +149 -69
- vtlengine/Interpreter/__init__.py +817 -497
- vtlengine/Model/__init__.py +172 -121
- vtlengine/Operators/Aggregation.py +156 -95
- vtlengine/Operators/Analytic.py +167 -79
- vtlengine/Operators/Assignment.py +7 -4
- vtlengine/Operators/Boolean.py +27 -32
- vtlengine/Operators/CastOperator.py +177 -131
- vtlengine/Operators/Clause.py +137 -99
- vtlengine/Operators/Comparison.py +148 -117
- vtlengine/Operators/Conditional.py +290 -98
- vtlengine/Operators/General.py +68 -47
- vtlengine/Operators/HROperators.py +91 -72
- vtlengine/Operators/Join.py +217 -118
- vtlengine/Operators/Numeric.py +129 -46
- vtlengine/Operators/RoleSetter.py +16 -15
- vtlengine/Operators/Set.py +61 -36
- vtlengine/Operators/String.py +213 -139
- vtlengine/Operators/Time.py +467 -215
- vtlengine/Operators/Validation.py +117 -76
- vtlengine/Operators/__init__.py +340 -213
- vtlengine/Utils/__init__.py +232 -41
- vtlengine/__init__.py +1 -1
- vtlengine/files/output/__init__.py +15 -6
- vtlengine/files/output/_time_period_representation.py +10 -9
- vtlengine/files/parser/__init__.py +79 -52
- vtlengine/files/parser/_rfc_dialect.py +6 -5
- vtlengine/files/parser/_time_checking.py +48 -37
- vtlengine-1.0.2.dist-info/METADATA +245 -0
- vtlengine-1.0.2.dist-info/RECORD +58 -0
- {vtlengine-1.0.dist-info → vtlengine-1.0.2.dist-info}/WHEEL +1 -1
- vtlengine-1.0.dist-info/METADATA +0 -104
- vtlengine-1.0.dist-info/RECORD +0 -58
- {vtlengine-1.0.dist-info → vtlengine-1.0.2.dist-info}/LICENSE.md +0 -0
|
@@ -7,83 +7,94 @@ from vtlengine.DataTypes.TimeHandling import TimePeriodHandler
|
|
|
7
7
|
from vtlengine.Exceptions import InputValidationException
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def check_date(value: str):
|
|
10
|
+
def check_date(value: str) -> str:
|
|
11
11
|
"""
|
|
12
12
|
Check if the date is in the correct format.
|
|
13
13
|
"""
|
|
14
14
|
# Remove all whitespaces
|
|
15
15
|
value = value.replace(" ", "")
|
|
16
16
|
try:
|
|
17
|
-
if len(value) == 9 and value[7] ==
|
|
18
|
-
value = value[:-1] +
|
|
17
|
+
if len(value) == 9 and value[7] == "-":
|
|
18
|
+
value = value[:-1] + "0" + value[-1]
|
|
19
19
|
date_value = date.fromisoformat(value)
|
|
20
20
|
except ValueError as e:
|
|
21
|
-
if
|
|
21
|
+
if "is out of range" in str(e):
|
|
22
22
|
raise InputValidationException(f"Date {value} is out of range for the month.")
|
|
23
|
-
if
|
|
24
|
-
raise InputValidationException(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
if "month must be in 1..12" in str(e):
|
|
24
|
+
raise InputValidationException(
|
|
25
|
+
f"Date {value} is invalid. " f"Month must be between 1 and 12."
|
|
26
|
+
)
|
|
27
|
+
raise InputValidationException(
|
|
28
|
+
f"Date {value} is not in the correct format. " f"Use YYYY-MM-DD."
|
|
29
|
+
)
|
|
28
30
|
|
|
29
31
|
# Check date is between 1900 and 9999
|
|
30
32
|
if not 1800 <= date_value.year <= 9999:
|
|
31
|
-
raise InputValidationException(
|
|
32
|
-
|
|
33
|
+
raise InputValidationException(
|
|
34
|
+
f"Date {value} is invalid. " f"Year must be between 1900 and 9999."
|
|
35
|
+
)
|
|
33
36
|
|
|
34
37
|
return date_value.isoformat()
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
def dates_to_string(date1, date2):
|
|
38
|
-
date1_str = date1.strftime(
|
|
39
|
-
date2_str = date2.strftime(
|
|
40
|
+
def dates_to_string(date1: date, date2: date) -> str:
|
|
41
|
+
date1_str = date1.strftime("%Y-%m-%d")
|
|
42
|
+
date2_str = date2.strftime("%Y-%m-%d")
|
|
40
43
|
return f"{date1_str}/{date2_str}"
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
date_pattern = r
|
|
44
|
-
year_pattern = r
|
|
45
|
-
month_pattern = r
|
|
46
|
-
time_pattern = r
|
|
46
|
+
date_pattern = r"\d{4}[-][0-1]?\d[-][0-3]?\d"
|
|
47
|
+
year_pattern = r"\d{4}"
|
|
48
|
+
month_pattern = r"\d{4}[-][0-1]?\d"
|
|
49
|
+
time_pattern = r"^" + date_pattern + r"/" + date_pattern + r"$"
|
|
47
50
|
|
|
48
51
|
|
|
49
|
-
def check_time(value: str):
|
|
52
|
+
def check_time(value: str) -> str:
|
|
50
53
|
value = value.replace(" ", "")
|
|
51
54
|
year_result = re.fullmatch(year_pattern, value)
|
|
52
55
|
if year_result is not None:
|
|
53
|
-
date1_time = datetime.strptime(value,
|
|
56
|
+
date1_time = datetime.strptime(value, "%Y")
|
|
54
57
|
date2_time = date1_time.replace(day=31, month=12)
|
|
55
58
|
return dates_to_string(date1_time, date2_time)
|
|
56
59
|
month_result = re.fullmatch(month_pattern, value)
|
|
57
60
|
if month_result is not None:
|
|
58
|
-
date1_time = datetime.strptime(value,
|
|
61
|
+
date1_time = datetime.strptime(value, "%Y-%m")
|
|
59
62
|
last_month_day = calendar.monthrange(date1_time.year, date1_time.month)[1]
|
|
60
63
|
date2_time = date1_time.replace(day=last_month_day)
|
|
61
64
|
return dates_to_string(date1_time, date2_time)
|
|
62
65
|
time_result = re.fullmatch(time_pattern, value)
|
|
63
66
|
if time_result is not None:
|
|
64
|
-
time_list = value.split(
|
|
67
|
+
time_list = value.split("/")
|
|
65
68
|
if time_list[0] > time_list[1]:
|
|
66
69
|
raise ValueError("Start date is greater than end date.")
|
|
67
70
|
return value
|
|
68
|
-
raise ValueError(
|
|
69
|
-
|
|
71
|
+
raise ValueError(
|
|
72
|
+
"Time is not in the correct format. " "Use YYYY-MM-DD/YYYY-MM-DD or YYYY or YYYY-MM."
|
|
73
|
+
)
|
|
70
74
|
|
|
71
75
|
|
|
72
|
-
day_period_pattern = r
|
|
73
|
-
month_period_pattern = r
|
|
74
|
-
year_period_pattern = r
|
|
75
|
-
period_pattern =
|
|
76
|
+
day_period_pattern = r"^\d{4}[-][0-1]?\d[-][0-3]?\d$"
|
|
77
|
+
month_period_pattern = r"^\d{4}[-][0-1]?\d$"
|
|
78
|
+
year_period_pattern = r"^\d{4}$"
|
|
79
|
+
period_pattern = (
|
|
80
|
+
r"^\d{4}[A]$|^\d{4}[S][1-2]$|^\d{4}[Q][1-4]$|^\d{4}[M]"
|
|
81
|
+
r"[0-1]?\d$|^\d{4}[W][0-5]?\d$|^\d{4}[D][0-3]?[0-9]?\d$"
|
|
82
|
+
)
|
|
76
83
|
|
|
77
84
|
# Related with gitlab issue #440, we can say that period pattern
|
|
78
85
|
# matches with our internal representation (or vtl user manual)
|
|
79
86
|
# and further_options_period_pattern matches
|
|
80
87
|
# with other kinds of inputs that we have to accept for the period.
|
|
81
|
-
further_options_period_pattern = (
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
further_options_period_pattern = (
|
|
89
|
+
r"\d{4}-\d{2}-\d{2}|^\d{4}-D[0-3]\d\d$|^\d{4}-W([0-4]"
|
|
90
|
+
r"\d|5[0-3])|^\d{4}-(0[1-9]|1[0-2]|M(0[1-9]|1[0-2]|[1-9]))$|^"
|
|
91
|
+
r"\d{4}-Q[1-4]$|^\d{4}-S[1-2]$|^\d{4}-A1$"
|
|
92
|
+
)
|
|
84
93
|
|
|
85
94
|
|
|
86
|
-
def check_time_period(value: str):
|
|
95
|
+
def check_time_period(value: str) -> str:
|
|
96
|
+
if isinstance(value, int):
|
|
97
|
+
value = str(value)
|
|
87
98
|
value = value.replace(" ", "")
|
|
88
99
|
period_result = re.fullmatch(period_pattern, value)
|
|
89
100
|
if period_result is not None:
|
|
@@ -99,22 +110,22 @@ def check_time_period(value: str):
|
|
|
99
110
|
|
|
100
111
|
year_result = re.fullmatch(year_period_pattern, value)
|
|
101
112
|
if year_result is not None:
|
|
102
|
-
year = datetime.strptime(value,
|
|
113
|
+
year = datetime.strptime(value, "%Y")
|
|
103
114
|
year_period_wo_A = str(year.year)
|
|
104
115
|
return year_period_wo_A
|
|
105
116
|
# return year_period
|
|
106
117
|
|
|
107
118
|
month_result = re.fullmatch(month_period_pattern, value)
|
|
108
119
|
if month_result is not None:
|
|
109
|
-
month = datetime.strptime(value,
|
|
110
|
-
month_period = month.strftime(
|
|
120
|
+
month = datetime.strptime(value, "%Y-%m")
|
|
121
|
+
month_period = month.strftime("%YM%m")
|
|
111
122
|
result = TimePeriodHandler(month_period)
|
|
112
123
|
return str(result)
|
|
113
124
|
|
|
114
125
|
# TODO: Do we use this?
|
|
115
126
|
day_result = re.fullmatch(day_period_pattern, value)
|
|
116
127
|
if day_result is not None:
|
|
117
|
-
day = datetime.strptime(value,
|
|
118
|
-
day_period = day.strftime(
|
|
128
|
+
day = datetime.strptime(value, "%Y-%m-%d")
|
|
129
|
+
day_period = day.strftime("%YD%-j")
|
|
119
130
|
return day_period
|
|
120
131
|
raise ValueError
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: vtlengine
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Run and Validate VTL Scripts
|
|
5
|
+
Home-page: https://github.com/Meaningful-Data/vtlengine
|
|
6
|
+
License: AGPL-3.0
|
|
7
|
+
Keywords: vtl,sdmx,vtlengine,Validation and Transformation Language
|
|
8
|
+
Author: MeaningfulData
|
|
9
|
+
Author-email: info@meaningfuldata.eu
|
|
10
|
+
Requires-Python: >=3.10,<4.0
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Intended Audience :: Information Technology
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Typing :: Typed
|
|
22
|
+
Requires-Dist: antlr4-python3-runtime (==4.9.2)
|
|
23
|
+
Requires-Dist: bottleneck (>=1.3.4,<2.0.0)
|
|
24
|
+
Requires-Dist: duckdb (>=1.1.1,<2.0.0)
|
|
25
|
+
Requires-Dist: networkx (>=2.8.8,<3.0.0)
|
|
26
|
+
Requires-Dist: numexpr (>=2.9.0,<3.0.0)
|
|
27
|
+
Requires-Dist: pandas (>=2.1.4,<3.0.0)
|
|
28
|
+
Requires-Dist: s3fs (>=2024.9.0,<2025.0.0)
|
|
29
|
+
Requires-Dist: sqlglot (>=22.2.0,<23.0.0)
|
|
30
|
+
Project-URL: Repository, https://github.com/Meaningful-Data/vtlengine
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
# VTL Engine
|
|
34
|
+
|
|
35
|
+
| | |
|
|
36
|
+
|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
37
|
+
| Testing | [](https://github.com/Meaningful-Data/vtlengine/actions/workflows/testing.yml) |
|
|
38
|
+
| Package | [](https://pypi.org/project/vtlengine/) |
|
|
39
|
+
| License | [](https://github.com/Meaningful-Data/vtlengine/blob/main/LICENSE.md) |
|
|
40
|
+
|
|
41
|
+
## Introduction
|
|
42
|
+
|
|
43
|
+
The VTL Engine is a Python library for validating and running VTL scripts.
|
|
44
|
+
|
|
45
|
+
It is a Python-based library around the [VTL Language](http://sdmx.org/?page_id=5096).
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
### Requirements
|
|
50
|
+
|
|
51
|
+
The VTL Engine requires Python 3.10 or higher.
|
|
52
|
+
|
|
53
|
+
### Install with pip
|
|
54
|
+
|
|
55
|
+
To install the VTL Engine on any Operating System, you can use pip:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
|
|
59
|
+
pip install vtlengine
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
*Note: it is recommended to install the VTL Engine in a virtual environment.*
|
|
64
|
+
|
|
65
|
+
## Usage
|
|
66
|
+
|
|
67
|
+
The VTL Engine API implements two basic methods:
|
|
68
|
+
|
|
69
|
+
* **Semantic Analysis**: aimed at validating the correctness of a script and computing the data
|
|
70
|
+
structures of the data sets created in the script.
|
|
71
|
+
* **Run**: aimed at executing the provided input on the provided input datasets.
|
|
72
|
+
|
|
73
|
+
Any action with VTL requires the following elements as input:
|
|
74
|
+
|
|
75
|
+
* **VTL Script**: Is the VTL to be executed, which includes the transformation scheme, as well as de
|
|
76
|
+
User Defined Operators, Hierarchical Rulesets and Datapoint Rulesets. It is provided as a string
|
|
77
|
+
or as a Path object to a vtl file.
|
|
78
|
+
* **Data structures** : Provides the structure of the input artifacts of the VTL script, according
|
|
79
|
+
to
|
|
80
|
+
the VTL Information model. Given that the current version doesn't prescribe a standard format for
|
|
81
|
+
providing the information, the VTL Engine is implementing a JSON format that can be found here.
|
|
82
|
+
Data Structures can be provided as Dictionaries or as Paths to JSON files. It is possible to have
|
|
83
|
+
* **External routines**: The VTL Engine allows using SQL (SQLite) with the eval operator. Can be
|
|
84
|
+
provided as a string with the SQL or as a path object to an SQL file. Its default value is `None`,
|
|
85
|
+
which shall be used if external routines are not applicable to the VTL script.
|
|
86
|
+
* **Value domains**: Provides the value domains that are used in the VTL script, normally with an in
|
|
87
|
+
operator. Can be provided as a dictionary or as a path to a JSON file. Its default value
|
|
88
|
+
is `None`, which shall be used if value domains are not applicable to the VTL script.
|
|
89
|
+
|
|
90
|
+
### Semantic Analysis
|
|
91
|
+
|
|
92
|
+
The `semantic_analysis` method serves to validate the correctness of a VTL script, as well as to
|
|
93
|
+
calculate the data structures of the datasets generated by the VTL script itself (that calculation
|
|
94
|
+
is a pre-requisite for the semantic analysis).
|
|
95
|
+
|
|
96
|
+
* If the VTL script is correct, the method returns a dictionary with the data structures of all the
|
|
97
|
+
datasets generated by the script.
|
|
98
|
+
* If the VTL script is incorrect, raises a VTL Engine custom error Explaining the error.
|
|
99
|
+
|
|
100
|
+
#### Example 1: Correct VTL
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
from vtlengine import semantic_analysis
|
|
104
|
+
|
|
105
|
+
script = """
|
|
106
|
+
DS_A := DS_1 * 10;
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
data_structures = {
|
|
110
|
+
'datasets': [
|
|
111
|
+
{'name': 'DS_1',
|
|
112
|
+
'DataStructure': [
|
|
113
|
+
{'name': 'Id_1',
|
|
114
|
+
'type':
|
|
115
|
+
'Integer',
|
|
116
|
+
'role': 'Identifier',
|
|
117
|
+
'nullable': False},
|
|
118
|
+
{'name': 'Me_1',
|
|
119
|
+
'type': 'Number',
|
|
120
|
+
'role': 'Measure',
|
|
121
|
+
'nullable': True}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
sa_result = semantic_analysis(script=script, data_structures=data_structures)
|
|
128
|
+
|
|
129
|
+
print(sa_result)
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
{'DS_A': Dataset(name='DS_A', components={'Id_1': Component(name='Id_1', data_type=<class 'vtlengine.DataTypes.Integer'>, role=<Role.IDENTIFIER: 'Identifier'>, nullable=False), 'Me_1': Component(name='Me_1', data_type=<class 'vtlengine.DataTypes.Number'>, role=<Role.MEASURE: 'Measure'>, nullable=True)}, data=None)}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
#### Example 2: Incorrect VTL
|
|
140
|
+
|
|
141
|
+
Note that, as compared to Example 1, the only change is that Me_1 is of the String data type,
|
|
142
|
+
instead of Number.
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
from vtlengine import semantic_analysis
|
|
146
|
+
|
|
147
|
+
script = """
|
|
148
|
+
DS_A := DS_1 * 10;
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
data_structures = {
|
|
152
|
+
'datasets': [
|
|
153
|
+
{'name': 'DS_1',
|
|
154
|
+
'DataStructure': [
|
|
155
|
+
{'name': 'Id_1',
|
|
156
|
+
'type':
|
|
157
|
+
'Integer',
|
|
158
|
+
'role': 'Identifier',
|
|
159
|
+
'nullable': False},
|
|
160
|
+
{'name': 'Me_1',
|
|
161
|
+
'type': 'String',
|
|
162
|
+
'role': 'Measure',
|
|
163
|
+
'nullable': True}
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
sa_result = semantic_analysis(script=script, data_structures=data_structures)
|
|
170
|
+
|
|
171
|
+
print(sa_result)
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Will raise the following Error:
|
|
176
|
+
|
|
177
|
+
``` python
|
|
178
|
+
raise SemanticError(code="1-1-1-2",
|
|
179
|
+
vtlengine.Exceptions.SemanticError: ('Invalid implicit cast from String and Integer to Number.', '1-1-1-2')
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Run VTL Scripts
|
|
183
|
+
|
|
184
|
+
The `run` method serves to execute a VTL script with input datapoints.
|
|
185
|
+
|
|
186
|
+
Returns a dictionary with all the generated Datasets.
|
|
187
|
+
When the output parameter is set, the engine will write the result of the computation to the output
|
|
188
|
+
folder, else it will include the data in the dictionary of the computed datasets.
|
|
189
|
+
|
|
190
|
+
Two validations are performed before running, which can raise errors:
|
|
191
|
+
|
|
192
|
+
* Semantic analysis: Equivalent to running the `semantic_analysis` method
|
|
193
|
+
* Data load analysis: Basic check of the data structure (names and types)
|
|
194
|
+
|
|
195
|
+
#### Example 3: Simple run
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
from vtlengine import run
|
|
199
|
+
import pandas as pd
|
|
200
|
+
|
|
201
|
+
script = """
|
|
202
|
+
DS_A := DS_1 * 10;
|
|
203
|
+
"""
|
|
204
|
+
|
|
205
|
+
data_structures = {
|
|
206
|
+
'datasets': [
|
|
207
|
+
{'name': 'DS_1',
|
|
208
|
+
'DataStructure': [
|
|
209
|
+
{'name': 'Id_1',
|
|
210
|
+
'type':
|
|
211
|
+
'Integer',
|
|
212
|
+
'role': 'Identifier',
|
|
213
|
+
'nullable': False},
|
|
214
|
+
{'name': 'Me_1',
|
|
215
|
+
'type': 'Number',
|
|
216
|
+
'role': 'Measure',
|
|
217
|
+
'nullable': True}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
data_df = pd.DataFrame(
|
|
224
|
+
{"Id_1": [1, 2, 3],
|
|
225
|
+
"Me_1": [10, 20, 30]})
|
|
226
|
+
|
|
227
|
+
datapoints = {"DS_1": data_df}
|
|
228
|
+
|
|
229
|
+
run_result = run(script=script, data_structures=data_structures,
|
|
230
|
+
datapoints=datapoints)
|
|
231
|
+
|
|
232
|
+
print(run_result)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
returns:
|
|
236
|
+
|
|
237
|
+
``` python
|
|
238
|
+
{'DS_A': Dataset(name='DS_A', components={'Id_1': Component(name='Id_1', data_type=<class 'vtlengine.DataTypes.Integer'>, role=<Role.IDENTIFIER: 'Identifier'>, nullable=False), 'Me_1': Component(name='Me_1', data_type=<class 'vtlengine.DataTypes.Number'>, role=<Role.MEASURE: 'Measure'>, nullable=True)}, data= Id_1 Me_1
|
|
239
|
+
0 1 100.0
|
|
240
|
+
1 2 200.0
|
|
241
|
+
2 3 300.0)}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
For more information on usage, please refer to
|
|
245
|
+
the [API documentation](https://docs.vtlengine.meaningfuldata.eu/api.html).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
vtlengine/API/_InternalApi.py,sha256=YO6FrDlIF-OJDjhj5n2Ds7afNvA3x9JwM9J9BJexsmU,14403
|
|
2
|
+
vtlengine/API/__init__.py,sha256=shttqk4kmDbeQasawMuw_qqPN9uS2mzlzKy6QqZfp6o,10987
|
|
3
|
+
vtlengine/AST/ASTConstructor.py,sha256=qmHkfiVmGGAYD7NeNJz_zyGxU3t0hY-kDdkzWjCyuVw,19976
|
|
4
|
+
vtlengine/AST/ASTConstructorModules/Expr.py,sha256=6JQ3QynbIqRFrGg8MIJ54VB9Tf2OfxuM2BPwE8xODo0,66589
|
|
5
|
+
vtlengine/AST/ASTConstructorModules/ExprComponents.py,sha256=Ud9s-ff2TUUWqvLbAU8Djj7ApXh9mNUsE-fNhphnZQ4,36903
|
|
6
|
+
vtlengine/AST/ASTConstructorModules/Terminals.py,sha256=hcvgMzhWEAT1AsBZNrx80UYMf0nhcA4mbXDrcXAKQvc,25387
|
|
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=uL1wSwSqDwwBFhQEfhIOb8r9xG9uMwUOGBcVKD27bds,12358
|
|
11
|
+
vtlengine/AST/ASTVisitor.py,sha256=3QQTudBpbR4pPQdH7y07EgwuzhoGzNQ59qox8R-E3fM,500
|
|
12
|
+
vtlengine/AST/DAG/__init__.py,sha256=KAE0yz-kB6cBTJVBvOGcVT-fVStofDdCutjMsbITqNw,14714
|
|
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=VnNBAtm89AgKIDFPTQL0Jxunv5kUJ_n9D3Aj6Tfs2Do,3142
|
|
20
|
+
vtlengine/AST/VtlVisitor.py,sha256=G9bpyPEvx8hUMzzn1V2RE4O3c59nPUEYrm5bEq8d6kc,35334
|
|
21
|
+
vtlengine/AST/__init__.py,sha256=X5WIN476KnPeFFzHunldVCD1RtaHHUIcxtZONY0jaWk,9824
|
|
22
|
+
vtlengine/DataTypes/NumericTypesHandling.py,sha256=eeSUhnRkAlcYjwbLZcuuUuJUNFWR3tVWQj8DfEHythk,1230
|
|
23
|
+
vtlengine/DataTypes/TimeHandling.py,sha256=HHktFbZTA90bNnLLXc39CrbMsU_5qZW4CQJd44k1IC4,18852
|
|
24
|
+
vtlengine/DataTypes/__init__.py,sha256=tAm7U383MWckZCCqoh2327XaU44qap_l8nGkmmQlh_o,21607
|
|
25
|
+
vtlengine/Exceptions/__init__.py,sha256=yEWbYbWZVSyZU4n5fhAbl3bxKo5y88yNHag967zrM7k,4832
|
|
26
|
+
vtlengine/Exceptions/messages.py,sha256=vW03MjerI77YR_RpYg9gK1SXQMisV0jAcq_GYYee-6g,20456
|
|
27
|
+
vtlengine/Interpreter/__init__.py,sha256=IUpPSIWoCln7gWW4c8XL8O52P7yELKKNemnLrHXhfvY,80854
|
|
28
|
+
vtlengine/Model/__init__.py,sha256=_v7Sp5XBu5_qgTFdVSfBfmlGSEQlEj5mh_t_cZC5klY,15554
|
|
29
|
+
vtlengine/Operators/Aggregation.py,sha256=PyJqyOHfZ6o12w5FS-y9-5zfOdNmVjq1cXtn41rtD-E,11629
|
|
30
|
+
vtlengine/Operators/Analytic.py,sha256=uU0GrKsipuiOGZxhzb5_AVT5BEPKtJEby1c3c4Lpocs,11429
|
|
31
|
+
vtlengine/Operators/Assignment.py,sha256=xCL9OocHqXvfwMLm33aM8moRoZtgwNxd6OnmVVwbP0Q,795
|
|
32
|
+
vtlengine/Operators/Boolean.py,sha256=ZIT60qUNkbcRn7idHVLrViZdx_PxWg2hUNVGuFA7Tf0,2878
|
|
33
|
+
vtlengine/Operators/CastOperator.py,sha256=yPadG3PJ6h3G0TMvt1EOZWjEFilMmkvQsnKZLorzpys,16743
|
|
34
|
+
vtlengine/Operators/Clause.py,sha256=GoE1CgXStq59MxbnIiMJfhPNsWtWZP7R4MTQaVzCPfA,14815
|
|
35
|
+
vtlengine/Operators/Comparison.py,sha256=5Efnl4fCt0hWRn1iukkSOG7s6NWB9u3I5fEsGCVvkYw,16513
|
|
36
|
+
vtlengine/Operators/Conditional.py,sha256=SeLWo7cT_Y4RZjKoWOovASGi4DJqHIvBc0ShE4SEXks,18594
|
|
37
|
+
vtlengine/Operators/General.py,sha256=K6fxp-IbFTDGiZrm0A194bnQo7j0IcPyu5Y4Jq-91Hk,6652
|
|
38
|
+
vtlengine/Operators/HROperators.py,sha256=jr6Wz-c9szhZ9luKAj3Bg1CwWbzauwlPOChzknvaBi0,8553
|
|
39
|
+
vtlengine/Operators/Join.py,sha256=VwYCtzqlPT75iVctomp8NPAaKi3HiCQ1Pc_K7IPhZCU,18065
|
|
40
|
+
vtlengine/Operators/Numeric.py,sha256=Sc7zPt4HjRH0l8pVnnBF9vkBoQK6zCFBF1Y0kpHiMRM,11928
|
|
41
|
+
vtlengine/Operators/RoleSetter.py,sha256=vjFmZnKPONmR2ztBbi4om7DQZkK6t2joDxMg9v_JPBA,2247
|
|
42
|
+
vtlengine/Operators/Set.py,sha256=7KnHUZaswz3TRcIeE1FwnI_TYR4LP4ZqbMN-bgPQU_g,7041
|
|
43
|
+
vtlengine/Operators/String.py,sha256=hd9bVHqCAQVrXtBNN-oJlWZRONSfeVWRpIL654GvMr8,20315
|
|
44
|
+
vtlengine/Operators/Time.py,sha256=Ng7w8TtFOemmDdDQfms6sUoAz1kUODbI2IybioC4f_0,34823
|
|
45
|
+
vtlengine/Operators/Validation.py,sha256=C7w1bvc8j-dYshPNvtpN_oCGMkbsoGoyv4WBCh9o2pg,10000
|
|
46
|
+
vtlengine/Operators/__init__.py,sha256=CJEwWUlz827yp4lyuXPSsMCMd4IWqCOw0yYvqpB76CI,36993
|
|
47
|
+
vtlengine/Utils/__init__.py,sha256=pWnyAi5WmoBGiaG00jCBBYHJ1IeSF6k7HpJI-aWbOY4,7105
|
|
48
|
+
vtlengine/__init__.py,sha256=qmLklaVsS-yHG4QeSzGDYln49PLhFaIjBatYNwAm2Ug,89
|
|
49
|
+
vtlengine/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
vtlengine/files/output/__init__.py,sha256=X1gmR7Hwp1wKuVTEYPxJRg1cCH-9rYdJk5Ma4_iQc8o,1170
|
|
51
|
+
vtlengine/files/output/_time_period_representation.py,sha256=3uSMK_tHXigsKNFt5-U75ZI9pIRVi6WERFwAG6jEBz0,1580
|
|
52
|
+
vtlengine/files/parser/__init__.py,sha256=Dk7BP4f2H-1EIgx8-VyFTqcP_VyfdDj9XzRvAqmr95Q,8807
|
|
53
|
+
vtlengine/files/parser/_rfc_dialect.py,sha256=Y8kAYBxH_t9AieN_tYg7QRh5A4DgvabKarx9Ko3QeCQ,462
|
|
54
|
+
vtlengine/files/parser/_time_checking.py,sha256=IJLZ6dxCTf6DWPT6TKJ-Hc5nUyRmTgpTq_qfWgeZJ_o,4741
|
|
55
|
+
vtlengine-1.0.2.dist-info/LICENSE.md,sha256=2xqHuoHohba7gpcZZKtOICRjzeKsQANXG8WoV9V35KM,33893
|
|
56
|
+
vtlengine-1.0.2.dist-info/METADATA,sha256=vU4vjEPjnJ15tJC0dboeBP0ZF5IZQne_KrF8GdcDURY,8531
|
|
57
|
+
vtlengine-1.0.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
58
|
+
vtlengine-1.0.2.dist-info/RECORD,,
|
vtlengine-1.0.dist-info/METADATA
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: vtlengine
|
|
3
|
-
Version: 1.0
|
|
4
|
-
Summary: Run and Validate VTL Scripts
|
|
5
|
-
License: AGPL-3.0
|
|
6
|
-
Author: MeaningfulData
|
|
7
|
-
Author-email: info@meaningfuldata.eu
|
|
8
|
-
Requires-Python: >=3.10,<4.0
|
|
9
|
-
Classifier: Development Status :: 4 - Beta
|
|
10
|
-
Classifier: Intended Audience :: Developers
|
|
11
|
-
Classifier: Intended Audience :: Information Technology
|
|
12
|
-
Classifier: Intended Audience :: Science/Research
|
|
13
|
-
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
14
|
-
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
-
Requires-Dist: antlr4-python3-runtime (==4.9.2)
|
|
19
|
-
Requires-Dist: bottleneck (>=1.3.4,<2.0.0)
|
|
20
|
-
Requires-Dist: duckdb (>=1.1.1,<2.0.0)
|
|
21
|
-
Requires-Dist: networkx (>=2.8.8,<3.0.0)
|
|
22
|
-
Requires-Dist: numba (>=0.60.0,<0.61.0)
|
|
23
|
-
Requires-Dist: numexpr (>=2.9.0,<3.0.0)
|
|
24
|
-
Requires-Dist: pandas (>=2.1.4,<3.0.0)
|
|
25
|
-
Requires-Dist: pyarrow (>=17.0.0,<18.0.0)
|
|
26
|
-
Requires-Dist: s3fs (>=2024.9.0,<2025.0.0)
|
|
27
|
-
Requires-Dist: sqlglot (>=22.2.0,<23.0.0)
|
|
28
|
-
Description-Content-Type: text/markdown
|
|
29
|
-
|
|
30
|
-
# VTL Engine
|
|
31
|
-
|
|
32
|
-
## Introduction
|
|
33
|
-
|
|
34
|
-
The VTL Engine is a Python library that allows you to validate and run VTL scripts.
|
|
35
|
-
It is a Python-based library around the [VTL Language](http://sdmx.org/?page_id=5096).
|
|
36
|
-
|
|
37
|
-
## Installation
|
|
38
|
-
|
|
39
|
-
### Requirements
|
|
40
|
-
|
|
41
|
-
The VTL Engine requires Python 3.10 or higher.
|
|
42
|
-
|
|
43
|
-
### Install with pip
|
|
44
|
-
To install the VTL Engine on any Operating System, you can use pip:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
pip install vtlengine
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
*Note: it is recommended to install the VTL Engine in a virtual environment.*
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
## Usage
|
|
54
|
-
|
|
55
|
-
### Semantic Analysis
|
|
56
|
-
To perform the validation of a VTL script, please use the semantic_analysis function.
|
|
57
|
-
Here is an example:
|
|
58
|
-
|
|
59
|
-
```python
|
|
60
|
-
|
|
61
|
-
from API import semantic_analysis
|
|
62
|
-
from pathlib import Path
|
|
63
|
-
|
|
64
|
-
base_path = Path(__file__).parent / "testSuite/API/data/"
|
|
65
|
-
script = base_path / Path("vtl/1.vtl")
|
|
66
|
-
datastructures = base_path / Path("DataStructure/input")
|
|
67
|
-
value_domains = base_path / Path("ValueDomain/VD_1.json")
|
|
68
|
-
external_routines = base_path / Path("sql/1.sql")
|
|
69
|
-
|
|
70
|
-
semantic_analysis(script=script, data_structures=datastructures,
|
|
71
|
-
value_domains=value_domains, external_routines=external_routines)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
The semantic analysis function will return a dictionary of the computed datasets and their structure.
|
|
75
|
-
|
|
76
|
-
### Run VTL Scripts
|
|
77
|
-
|
|
78
|
-
To execute a VTL script, please use the run function. Here is an example:
|
|
79
|
-
|
|
80
|
-
```python
|
|
81
|
-
|
|
82
|
-
from API import run
|
|
83
|
-
from pathlib import Path
|
|
84
|
-
|
|
85
|
-
base_path = Path(__file__).parent / "testSuite/API/data/"
|
|
86
|
-
script = base_path / Path("vtl/1.vtl")
|
|
87
|
-
datastructures = base_path / Path("DataStructure/input")
|
|
88
|
-
datapoints = base_path / Path("DataSet/input")
|
|
89
|
-
output_folder = base_path / Path("DataSet/output")
|
|
90
|
-
|
|
91
|
-
value_domains = None
|
|
92
|
-
external_routines = None
|
|
93
|
-
|
|
94
|
-
run(script=script, data_structures=datastructures, datapoints=datapoints,
|
|
95
|
-
value_domains=value_domains, external_routines=external_routines,
|
|
96
|
-
output_path=output_folder, return_only_persistent=True
|
|
97
|
-
)
|
|
98
|
-
```
|
|
99
|
-
The VTL engine will load each datapoints file as being needed, reducing the memory footprint.
|
|
100
|
-
When the output parameter is set, the engine will write the result of the computation
|
|
101
|
-
to the output folder, else it will include the data in the dictionary of the computed datasets.
|
|
102
|
-
|
|
103
|
-
For more information on usage, please refer to the [API documentation](https://docs.vtlengine.meaningfuldata.eu/api.html).
|
|
104
|
-
|
vtlengine-1.0.dist-info/RECORD
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
vtlengine/API/_InternalApi.py,sha256=dYR42DbyY_umGfRXQOiz_-wGB9_jcx9Q3ooiWo--hbg,12526
|
|
2
|
-
vtlengine/API/__init__.py,sha256=2uknCsuffQ8Mj01ETYW2esM0nhZyw_Qu2Vu5IOxuaec,10168
|
|
3
|
-
vtlengine/AST/ASTConstructor.py,sha256=UyW_0lraVH8RZ2MmAfHt445nqDY1woc0GKEyUht4bSQ,19406
|
|
4
|
-
vtlengine/AST/ASTConstructorModules/Expr.py,sha256=GdRbg1erybHIZEKDL26jErxjKB7_0meGZKXrUCBHHNA,62808
|
|
5
|
-
vtlengine/AST/ASTConstructorModules/ExprComponents.py,sha256=8tVFR-gLDnqJV1lCrGf0-YH-KqydVHfzCVmya6c1-Tk,33581
|
|
6
|
-
vtlengine/AST/ASTConstructorModules/Terminals.py,sha256=AC81AaQnM47EZtK40R9XexLqZCrJAmYd_aodwxQ5NXU,24889
|
|
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=a_NhyUfUEVfSFyArb-nXIM2wvQZX96OBloJy1hGF12Q,758
|
|
10
|
-
vtlengine/AST/ASTTemplate.py,sha256=h61kxO_yfvDO3LnEhSavvN3eV8sAyffRV85GEKu-brc,11942
|
|
11
|
-
vtlengine/AST/ASTVisitor.py,sha256=ovGXIfdCcY8ukUE5hiPbdxmAPPdHOzcS-dL-CsgwEDY,494
|
|
12
|
-
vtlengine/AST/DAG/__init__.py,sha256=ErxDIxBY6W8d9Ed9J1fYS8Jmlv6c0RX_B0Ktt6Su8yo,14709
|
|
13
|
-
vtlengine/AST/DAG/_words.py,sha256=b7Mgp4dL1Wd4uMDdtEmF_esxn2GR8C3mqEKO9ysuhrg,170
|
|
14
|
-
vtlengine/AST/Grammar/Vtl.g4,sha256=uxDPfJ14lMfxB5PyLf0f8Vb07T2z3JboU2FB22WMVz4,23776
|
|
15
|
-
vtlengine/AST/Grammar/VtlTokens.g4,sha256=s4NtuaC9FcXNzUEAhy-HPQozfqSkoIaluHbzk9RKYkk,9570
|
|
16
|
-
vtlengine/AST/Grammar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
vtlengine/AST/Grammar/lexer.py,sha256=2_nnGDCc6P2i0VDVfKI0Db61PWYBEuylVs50ph5F1CM,96642
|
|
18
|
-
vtlengine/AST/Grammar/parser.py,sha256=kU7FYalgvS4IiEETlmqje4kd8BawJsrCGiPiEc6j9Zw,545780
|
|
19
|
-
vtlengine/AST/Grammar/tokens.py,sha256=Dq4OD3kYyc6EH4wQ0JoC04KHn2gazoVEgzl7__Jrqpg,2884
|
|
20
|
-
vtlengine/AST/VtlVisitor.py,sha256=t59fHL-gYjZSIRgE2h9R8aVLA2CVHSJ3WbHIddswX_U,35077
|
|
21
|
-
vtlengine/AST/__init__.py,sha256=GmUtsS8J9-4k1MZifQg1ZgM_0iJaA-39h99nh4Hhiyk,9516
|
|
22
|
-
vtlengine/DataTypes/NumericTypesHandling.py,sha256=CuQtCFHKS1voMwjk-jHZM4hD2XN4l1wJxeD3e-bGHaQ,1017
|
|
23
|
-
vtlengine/DataTypes/TimeHandling.py,sha256=irH2wHU4luB0dVdTh-5id-rgoNlW-WnBdkH1-gbc7vM,20478
|
|
24
|
-
vtlengine/DataTypes/__init__.py,sha256=QkkPZRzxTXGhI_GV3gFErGlNYeoDUv3qBSYxv8XnMe8,20762
|
|
25
|
-
vtlengine/Exceptions/__init__.py,sha256=WBRLEjb0lIRO1oeqUg245MZj_fFNMsq6leZvq66lyaM,2851
|
|
26
|
-
vtlengine/Exceptions/messages.py,sha256=LSERRfUOgXsPwVkd_1L6tJGL6AFvtuZ6MqOhb4J09uw,18655
|
|
27
|
-
vtlengine/Interpreter/__init__.py,sha256=UK4btF5D4hJtOgXgeN7YVgiZfOFIJG0hAlX44wNqqFw,73817
|
|
28
|
-
vtlengine/Model/__init__.py,sha256=NHVWPqlw3CuGjujo5hfsKez2Vf1EmtuRzxSiQ1w0oNQ,14778
|
|
29
|
-
vtlengine/Operators/Aggregation.py,sha256=3COPPQT2I4Is_Dz5kwgmLn88Oine0FeN_dRH-LSZ70A,11166
|
|
30
|
-
vtlengine/Operators/Analytic.py,sha256=Y4wI14Bclxd2CpI45UF16QbvowfUJcgva0dcBz3JoRY,9658
|
|
31
|
-
vtlengine/Operators/Assignment.py,sha256=JA8TtcwhKNwLIEIitzEM3PTUy700Ls8iZ7tDXVQIxbo,768
|
|
32
|
-
vtlengine/Operators/Boolean.py,sha256=itItNmFuZg9iVPpTYIQJ3xCZ83WYq5QQKT_keKb1h3Y,2973
|
|
33
|
-
vtlengine/Operators/CastOperator.py,sha256=3JlzQNHDPkMimffV34QEdwE1p0YJgsAQoP36xfboYJI,16611
|
|
34
|
-
vtlengine/Operators/Clause.py,sha256=hPPV0oZ1V_ExR-hLV1WJyvrbOERy22BLFizd7sd_gZc,13748
|
|
35
|
-
vtlengine/Operators/Comparison.py,sha256=WRllEMPZyaSMMm8-4s8muWeZ3QLc9qC9Xs1X1ibSLRM,16522
|
|
36
|
-
vtlengine/Operators/Conditional.py,sha256=g7dON5TWxO6yOMhCa_EgfYE5bHqlfjof7PEFBqVcp7E,12417
|
|
37
|
-
vtlengine/Operators/General.py,sha256=hf9a3Vjq_S1z5Fj3Q3lykXzwmsLKlJ1Mkg7M74df9kA,6546
|
|
38
|
-
vtlengine/Operators/HROperators.py,sha256=6k8rya5bkxR09sZm_vI9GIDWjYCZi05P_6nAzC404YE,8614
|
|
39
|
-
vtlengine/Operators/Join.py,sha256=o1MRZ5sMiujstQrAYS57BE_SnW__6ogIVJD1LC6CKzA,15570
|
|
40
|
-
vtlengine/Operators/Numeric.py,sha256=Sk2eXmHmnL1NPZK0UvSUMTKNYGt0anXImCor1DbH3Go,10292
|
|
41
|
-
vtlengine/Operators/RoleSetter.py,sha256=MQQBkpfJAQ5mTvAET5hs21kxoESof_aTQNSUzvRMgcg,2075
|
|
42
|
-
vtlengine/Operators/Set.py,sha256=14-QmJ6jM-asCf-of0zxmK-sXhMUB11N_7NCH2p6nvU,6343
|
|
43
|
-
vtlengine/Operators/String.py,sha256=5Urz2t7bPeMXxtvA-p_WCZKhdTpk1rWl3yboNOscQI8,20069
|
|
44
|
-
vtlengine/Operators/Time.py,sha256=2TXhkrZDdQFNOX-2juLNZhlgu0eDCmmDavqN41kAZ9U,29708
|
|
45
|
-
vtlengine/Operators/Validation.py,sha256=0Fxxbf2SUHHOSBuqjsY6seSIuf7RPvED3RlzCCcoxHs,10052
|
|
46
|
-
vtlengine/Operators/__init__.py,sha256=AhsShQhr0wblRXpDTAk_DYj6RUF8wKC_71DY7mav9eA,36387
|
|
47
|
-
vtlengine/Utils/__init__.py,sha256=ePVlQjwmAyPfdiLx2zjfttHXcpYdVVxOOJfqmTVLDug,5427
|
|
48
|
-
vtlengine/__init__.py,sha256=yQTWCUMo6A1ym0Gz8hTDzY8e9-2HIEkWT_dZsmEQscI,88
|
|
49
|
-
vtlengine/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
-
vtlengine/files/output/__init__.py,sha256=AJjDcpHJOqqQTTFVlKkhKnaDqLD6ujfnVO7amViKavk,1045
|
|
51
|
-
vtlengine/files/output/_time_period_representation.py,sha256=6jIRRjd900aay7ZtKe7S02gwV51K7_8SrIO8qW9kn4w,1579
|
|
52
|
-
vtlengine/files/parser/__init__.py,sha256=6OIgKXQ_r4lnm6Ch2THmcUGRwywxyAdgUZmpxdfR3IQ,8492
|
|
53
|
-
vtlengine/files/parser/_rfc_dialect.py,sha256=FGAMgp5GhovpIU-cMa1Nmwz2kbcIQPym7tmgxWzDUfk,455
|
|
54
|
-
vtlengine/files/parser/_time_checking.py,sha256=zhq0tWAj7IFp1FdwxfFLlJ-W69VbbnUNO4slZTIC2HM,4735
|
|
55
|
-
vtlengine-1.0.dist-info/LICENSE.md,sha256=2xqHuoHohba7gpcZZKtOICRjzeKsQANXG8WoV9V35KM,33893
|
|
56
|
-
vtlengine-1.0.dist-info/METADATA,sha256=Ql6Lr12GZmtbE86ytN81UG2yE00iEn6vh_xEZEswkU0,3416
|
|
57
|
-
vtlengine-1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
58
|
-
vtlengine-1.0.dist-info/RECORD,,
|
|
File without changes
|