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.

Files changed (53) hide show
  1. vtlengine/API/_InternalApi.py +288 -61
  2. vtlengine/API/__init__.py +269 -71
  3. vtlengine/API/data/schema/json_schema_2.1.json +116 -0
  4. vtlengine/AST/ASTComment.py +56 -0
  5. vtlengine/AST/ASTConstructor.py +76 -22
  6. vtlengine/AST/ASTConstructorModules/Expr.py +238 -120
  7. vtlengine/AST/ASTConstructorModules/ExprComponents.py +126 -61
  8. vtlengine/AST/ASTConstructorModules/Terminals.py +97 -42
  9. vtlengine/AST/ASTConstructorModules/__init__.py +50 -0
  10. vtlengine/AST/ASTEncoders.py +5 -1
  11. vtlengine/AST/ASTString.py +608 -0
  12. vtlengine/AST/ASTTemplate.py +28 -2
  13. vtlengine/AST/DAG/__init__.py +10 -4
  14. vtlengine/AST/Grammar/lexer.py +0 -1
  15. vtlengine/AST/Grammar/parser.py +185 -440
  16. vtlengine/AST/VtlVisitor.py +0 -1
  17. vtlengine/AST/__init__.py +127 -14
  18. vtlengine/DataTypes/TimeHandling.py +50 -15
  19. vtlengine/DataTypes/__init__.py +79 -7
  20. vtlengine/Exceptions/__init__.py +3 -5
  21. vtlengine/Exceptions/messages.py +74 -105
  22. vtlengine/Interpreter/__init__.py +136 -46
  23. vtlengine/Model/__init__.py +14 -11
  24. vtlengine/Operators/Aggregation.py +17 -9
  25. vtlengine/Operators/Analytic.py +64 -20
  26. vtlengine/Operators/Assignment.py +0 -1
  27. vtlengine/Operators/CastOperator.py +44 -44
  28. vtlengine/Operators/Clause.py +16 -10
  29. vtlengine/Operators/Comparison.py +20 -12
  30. vtlengine/Operators/Conditional.py +47 -15
  31. vtlengine/Operators/General.py +9 -4
  32. vtlengine/Operators/HROperators.py +4 -14
  33. vtlengine/Operators/Join.py +15 -14
  34. vtlengine/Operators/Numeric.py +32 -26
  35. vtlengine/Operators/RoleSetter.py +6 -2
  36. vtlengine/Operators/Set.py +12 -8
  37. vtlengine/Operators/String.py +9 -9
  38. vtlengine/Operators/Time.py +145 -124
  39. vtlengine/Operators/Validation.py +10 -4
  40. vtlengine/Operators/__init__.py +56 -69
  41. vtlengine/Utils/__init__.py +55 -1
  42. vtlengine/__extras_check.py +17 -0
  43. vtlengine/__init__.py +2 -2
  44. vtlengine/files/output/__init__.py +2 -1
  45. vtlengine/files/output/_time_period_representation.py +2 -1
  46. vtlengine/files/parser/__init__.py +52 -46
  47. vtlengine/files/parser/_time_checking.py +4 -4
  48. {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/METADATA +21 -17
  49. vtlengine-1.1.dist-info/RECORD +61 -0
  50. {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/WHEEL +1 -1
  51. vtlengine/DataTypes/NumericTypesHandling.py +0 -38
  52. vtlengine-1.0.3rc3.dist-info/RECORD +0 -58
  53. {vtlengine-1.0.3rc3.dist-info → vtlengine-1.1.dist-info}/LICENSE.md +0 -0
@@ -23,6 +23,7 @@ from vtlengine.AST import (
23
23
  PersistentAssignment,
24
24
  Start,
25
25
  )
26
+ from vtlengine.AST.ASTConstructorModules import extract_token_info
26
27
  from vtlengine.AST.ASTConstructorModules.Expr import Expr
27
28
  from vtlengine.AST.ASTConstructorModules.ExprComponents import ExprComp
28
29
  from vtlengine.AST.ASTConstructorModules.Terminals import Terminals
@@ -64,7 +65,9 @@ class ASTVisitor(VtlVisitor):
64
65
  for statement in statements:
65
66
  statements_nodes.append(self.visitStatement(statement))
66
67
 
67
- start_node = Start(statements_nodes)
68
+ token_info = extract_token_info(ctx)
69
+
70
+ start_node = Start(children=statements_nodes, **token_info)
68
71
 
69
72
  return start_node
70
73
 
@@ -99,7 +102,8 @@ class ASTVisitor(VtlVisitor):
99
102
 
100
103
  right_node = Expr().visitExpr(ctx_list[2])
101
104
 
102
- assignment_node = Assignment(left_node, op_node, right_node)
105
+ token_info = extract_token_info(ctx)
106
+ assignment_node = Assignment(left=left_node, op=op_node, right=right_node, **token_info)
103
107
  return assignment_node
104
108
 
105
109
  # | varID PUT_SYMBOL expr # persistAssignment
@@ -114,7 +118,10 @@ class ASTVisitor(VtlVisitor):
114
118
 
115
119
  right_node = Expr().visitExpr(ctx_list[2])
116
120
 
117
- persistent_assignment_node = PersistentAssignment(left_node, op_node, right_node)
121
+ token_info = extract_token_info(ctx)
122
+ persistent_assignment_node = PersistentAssignment(
123
+ left=left_node, op=op_node, right=right_node, **token_info
124
+ )
118
125
  return persistent_assignment_node
119
126
 
120
127
  """______________________________________________________________________________________
@@ -167,8 +174,14 @@ class ASTVisitor(VtlVisitor):
167
174
  else:
168
175
  return_node = return_[0]
169
176
 
177
+ token_info = extract_token_info(ctx)
178
+
170
179
  return Operator(
171
- op=operator, parameters=parameters, output_type=return_node, expression=expr
180
+ op=operator,
181
+ parameters=parameters,
182
+ output_type=return_node,
183
+ expression=expr,
184
+ **token_info,
172
185
  )
173
186
 
174
187
  """
@@ -189,11 +202,14 @@ class ASTVisitor(VtlVisitor):
189
202
  signature_type, ruleset_elements = self.visitRulesetSignature(ctx_list[5])
190
203
  ruleset_rules = self.visitRuleClauseDatapoint(ctx_list[8])
191
204
 
205
+ token_info = extract_token_info(ctx)
206
+
192
207
  return DPRuleset(
193
208
  name=ruleset_name,
194
209
  params=ruleset_elements,
195
210
  rules=ruleset_rules,
196
211
  signature_type=signature_type,
212
+ **token_info,
197
213
  )
198
214
 
199
215
  def visitRulesetSignature(self, ctx: Parser.RulesetSignatureContext):
@@ -209,6 +225,7 @@ class ASTVisitor(VtlVisitor):
209
225
  if isinstance(value_domain, TerminalNodeImpl)
210
226
  and value_domain.getSymbol().type == Parser.VALUE_DOMAIN
211
227
  ]
228
+ kind = ""
212
229
  if len(value_domains) != 0:
213
230
  kind = "ValuedomainID"
214
231
 
@@ -269,7 +286,10 @@ class ASTVisitor(VtlVisitor):
269
286
  ]
270
287
 
271
288
  if len(when) != 0:
272
- rule_node = HRBinOp(left=expr_node[0], op=when[0].getSymbol().text, right=expr_node[1])
289
+ token_info = extract_token_info(when[0].getSymbol())
290
+ rule_node = HRBinOp(
291
+ left=expr_node[0], op=when[0].getSymbol().text, right=expr_node[1], **token_info
292
+ )
273
293
 
274
294
  else:
275
295
  rule_node = expr_node[0]
@@ -287,7 +307,10 @@ class ASTVisitor(VtlVisitor):
287
307
  ]
288
308
  er_level = None if len(er_level) == 0 else er_level[0]
289
309
 
290
- return DPRule(name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level)
310
+ token_info = extract_token_info(ctx)
311
+ return DPRule(
312
+ name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level, **token_info
313
+ )
291
314
 
292
315
  def visitParameterItem(self, ctx: Parser.ParameterItemContext):
293
316
  """
@@ -314,7 +337,10 @@ class ASTVisitor(VtlVisitor):
314
337
 
315
338
  if isinstance(argument_type, (Dataset, Component, Scalar)):
316
339
  argument_type.name = argument_name.value
317
- return Argument(name=argument_name.value, type_=argument_type, default=argument_default)
340
+ token_info = extract_token_info(ctx)
341
+ return Argument(
342
+ name=argument_name.value, type_=argument_type, default=argument_default, **token_info
343
+ )
318
344
 
319
345
  """
320
346
  -----------------------------------
@@ -342,11 +368,14 @@ class ASTVisitor(VtlVisitor):
342
368
  if len(ruleset_rules) == 0:
343
369
  raise Exception(f"No rules found for the ruleset {ruleset_name}")
344
370
 
371
+ token_info = extract_token_info(ctx)
372
+
345
373
  return HRuleset(
346
374
  signature_type=signature_type,
347
375
  name=ruleset_name,
348
376
  element=ruleset_elements,
349
377
  rules=ruleset_rules,
378
+ **token_info,
350
379
  )
351
380
 
352
381
  # TODO Add support for value Domains.
@@ -379,23 +408,30 @@ class ASTVisitor(VtlVisitor):
379
408
  and identifier.getSymbol().type == Parser.IDENTIFIER
380
409
  ][0]
381
410
 
411
+ token_info = extract_token_info(ctx)
382
412
  if conditions:
383
413
  identifiers_list = [
384
414
  DefIdentifier(
385
- value=elto.alias if getattr(elto, "alias", None) else elto.value, kind=kind
415
+ value=elto.alias if getattr(elto, "alias", None) else elto.value,
416
+ kind=kind,
417
+ **token_info,
386
418
  )
387
419
  for elto in conditions[0]
388
420
  ]
389
- identifiers_list.append(DefIdentifier(value=dataset.getSymbol().text, kind=kind))
421
+ identifiers_list.append(
422
+ DefIdentifier(value=dataset.getSymbol().text, kind=kind, **token_info)
423
+ )
390
424
  return signature_type, identifiers_list
391
425
  else:
392
- return signature_type, DefIdentifier(value=dataset.getSymbol().text, kind=kind)
426
+ return signature_type, DefIdentifier(
427
+ value=dataset.getSymbol().text, kind=kind, **token_info
428
+ )
393
429
 
394
430
  # TODO Support for valueDomainSignature.
395
431
  def visitValueDomainSignature(self, ctx: Parser.ValueDomainSignatureContext):
396
432
  """
397
433
  valueDomainSignature: CONDITION IDENTIFIER (AS IDENTIFIER)? (',' IDENTIFIER (AS IDENTIFIER)?)* ;
398
- """ # noqa E501
434
+ """ # noqa E501
399
435
  # AST_ASTCONSTRUCTOR.7
400
436
  ctx_list = list(ctx.getChildren())
401
437
  component_nodes = [
@@ -452,14 +488,16 @@ class ASTVisitor(VtlVisitor):
452
488
  ]
453
489
  er_level = None if len(er_level) == 0 else er_level[0]
454
490
 
455
- return HRule(name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level)
491
+ token_info = extract_token_info(ctx)
492
+
493
+ return HRule(name=rule_name, rule=rule_node, erCode=er_code, erLevel=er_level, **token_info)
456
494
 
457
495
  def visitCodeItemRelation(self, ctx: Parser.CodeItemRelationContext):
458
496
  """
459
497
  codeItemRelation: ( WHEN expr THEN )? codeItemRef codeItemRelationClause (codeItemRelationClause)* ;
460
498
  ( WHEN exprComponent THEN )? codetemRef=valueDomainValue comparisonOperand? codeItemRelationClause (codeItemRelationClause)*
461
499
 
462
- """ # noqa E501
500
+ """ # noqa E501
463
501
 
464
502
  ctx_list = list(ctx.getChildren())
465
503
 
@@ -469,22 +507,29 @@ class ASTVisitor(VtlVisitor):
469
507
  when = ctx_list[0].getSymbol().text
470
508
  vd_value = Terminals().visitValueDomainValue(ctx_list[3])
471
509
  op = Terminals().visitComparisonOperand(ctx_list[4])
510
+ token_info_value = extract_token_info(ctx_list[3])
511
+ token_info_op = extract_token_info(ctx_list[4])
472
512
  else:
473
513
  vd_value = Terminals().visitValueDomainValue(ctx_list[0])
474
514
  op = Terminals().visitComparisonOperand(ctx_list[1])
515
+ token_info_value = extract_token_info(ctx_list[0])
516
+ token_info_op = extract_token_info(ctx_list[1])
475
517
 
476
518
  rule_node = HRBinOp(
477
- left=DefIdentifier(value=vd_value, kind="CodeItemID"), op=op, right=None
519
+ left=DefIdentifier(value=vd_value, kind="CodeItemID", **token_info_value),
520
+ op=op,
521
+ right=None,
522
+ **token_info_op,
478
523
  )
479
524
  items = [
480
525
  item for item in ctx_list if isinstance(item, Parser.CodeItemRelationClauseContext)
481
526
  ]
482
-
527
+ token_info = extract_token_info(items[0])
483
528
  # Means that no concatenations of operations is needed for that rule.
484
529
  if len(items) == 1:
485
530
  cir_node = self.visitCodeItemRelationClause(items[0])
486
531
  if isinstance(cir_node, HRBinOp):
487
- rule_node.right = HRUnOp(op=cir_node.op, operand=cir_node.right)
532
+ rule_node.right = HRUnOp(op=cir_node.op, operand=cir_node.right, **token_info)
488
533
 
489
534
  elif isinstance(cir_node, DefIdentifier):
490
535
  rule_node.right = cir_node
@@ -493,7 +538,9 @@ class ASTVisitor(VtlVisitor):
493
538
  else:
494
539
  previous_node = self.visitCodeItemRelationClause(items[0])
495
540
  if isinstance(previous_node, HRBinOp):
496
- previous_node = HRUnOp(op=previous_node.op, operand=previous_node.right)
541
+ previous_node = HRUnOp(
542
+ op=previous_node.op, operand=previous_node.right, **token_info
543
+ )
497
544
 
498
545
  for item in items[1:]:
499
546
  item_node = self.visitCodeItemRelationClause(item)
@@ -505,14 +552,15 @@ class ASTVisitor(VtlVisitor):
505
552
 
506
553
  if when is not None:
507
554
  expr_node = ExprComp().visitExprComponent(ctx_list[1])
508
- rule_node = HRBinOp(left=expr_node, op=when, right=rule_node)
555
+ token_when_info = extract_token_info(ctx_list[1])
556
+ rule_node = HRBinOp(left=expr_node, op=when, right=rule_node, **token_when_info)
509
557
 
510
558
  return rule_node
511
559
 
512
560
  def visitCodeItemRelationClause(self, ctx: Parser.CodeItemRelationClauseContext):
513
561
  """
514
562
  (opAdd=( PLUS | MINUS ))? rightCodeItem=valueDomainValue ( QLPAREN rightCondition=exprComponent QRPAREN )?
515
- """ # noqa E501
563
+ """ # noqa E501
516
564
  ctx_list = list(ctx.getChildren())
517
565
 
518
566
  expr = [expr for expr in ctx_list if isinstance(expr, Parser.ExprContext)]
@@ -530,14 +578,20 @@ class ASTVisitor(VtlVisitor):
530
578
  op = ctx_list[0].getSymbol().text
531
579
  value = Terminals().visitValueDomainValue(ctx_list[1])
532
580
 
533
- code_item = DefIdentifier(value=value, kind="CodeItemID")
581
+ code_item = DefIdentifier(
582
+ value=value, kind="CodeItemID", **extract_token_info(ctx_list[1])
583
+ )
534
584
  if right_condition:
535
585
  code_item._right_condition = right_condition[0]
536
586
 
537
- return HRBinOp(left=None, op=op, right=code_item)
587
+ return HRBinOp(
588
+ left=None, op=op, right=code_item, **extract_token_info(ctx_list[0].getSymbol())
589
+ )
538
590
  else:
539
591
  value = Terminals().visitValueDomainValue(ctx_list[0])
540
- code_item = DefIdentifier(value=value, kind="CodeItemID")
592
+ code_item = DefIdentifier(
593
+ value=value, kind="CodeItemID", **extract_token_info(ctx_list[0])
594
+ )
541
595
  if right_condition:
542
596
  code_item._right_condition = right_condition[0]
543
597