pydpm_xl 0.1.39rc30__tar.gz → 0.1.39rc32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/PKG-INFO +2 -2
  2. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/__init__.py +1 -1
  3. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/__init__.py +2 -2
  4. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/complete_ast.py +38 -8
  5. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/client.py +225 -79
  6. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/PKG-INFO +2 -2
  7. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/SOURCES.txt +1 -0
  8. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/requires.txt +1 -1
  9. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pyproject.toml +4 -4
  10. pydpm_xl-0.1.39rc32/tests/test_cli_semantic.py +193 -0
  11. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/LICENSE +0 -0
  12. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/README.md +0 -0
  13. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ASTConstructor.py +0 -0
  14. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ASTObjects.py +0 -0
  15. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ASTTemplate.py +0 -0
  16. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ASTVisitor.py +0 -0
  17. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/MLGeneration.py +0 -0
  18. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ModuleAnalyzer.py +0 -0
  19. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/ModuleDependencies.py +0 -0
  20. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/WhereClauseChecker.py +0 -0
  21. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/__init__.py +0 -0
  22. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/AST/check_operands.py +0 -0
  23. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/DataTypes/ScalarTypes.py +0 -0
  24. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/DataTypes/TimeClasses.py +0 -0
  25. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/DataTypes/TypePromotion.py +0 -0
  26. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/DataTypes/__init__.py +0 -0
  27. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Exceptions/__init__.py +0 -0
  28. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Exceptions/exceptions.py +0 -0
  29. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Exceptions/messages.py +0 -0
  30. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/OperationScopes/OperationScopeService.py +0 -0
  31. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/OperationScopes/__init__.py +0 -0
  32. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/AggregateOperators.py +0 -0
  33. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/BooleanOperators.py +0 -0
  34. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/ClauseOperators.py +0 -0
  35. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/ComparisonOperators.py +0 -0
  36. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/ConditionalOperators.py +0 -0
  37. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/NumericOperators.py +0 -0
  38. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/Operator.py +0 -0
  39. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/StringOperators.py +0 -0
  40. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/TimeOperators.py +0 -0
  41. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Operators/__init__.py +0 -0
  42. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/ValidationsGenerationUtils.py +0 -0
  43. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/__init__.py +0 -0
  44. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/ast_serialization.py +0 -0
  45. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/operands_mapping.py +0 -0
  46. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/operator_mapping.py +0 -0
  47. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/tokens.py +0 -0
  48. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/Utils/utils.py +0 -0
  49. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/ValidationsGeneration/PropertiesConstraintsProcessor.py +0 -0
  50. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/ValidationsGeneration/Utils.py +0 -0
  51. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/ValidationsGeneration/VariantsProcessor.py +0 -0
  52. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/ValidationsGeneration/__init__.py +0 -0
  53. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/ValidationsGeneration/auxiliary_functions.py +0 -0
  54. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/ast_generator.py +0 -0
  55. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/data_dictionary.py +0 -0
  56. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/data_dictionary_validation.py +0 -0
  57. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/migration.py +0 -0
  58. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/operation_scopes.py +0 -0
  59. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/semantic.py +0 -0
  60. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/api/syntax.py +0 -0
  61. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/data_handlers.py +0 -0
  62. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/db_utils.py +0 -0
  63. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/__init__.py +0 -0
  64. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/__init__.py +0 -0
  65. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlLexer.interp +0 -0
  66. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlLexer.py +0 -0
  67. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlLexer.tokens +0 -0
  68. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlParser.interp +0 -0
  69. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlParser.py +0 -0
  70. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlParser.tokens +0 -0
  71. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlParserListener.py +0 -0
  72. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/dpm_xlParserVisitor.py +0 -0
  73. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dist/listeners.py +0 -0
  74. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dpm_xlLexer.g4 +0 -0
  75. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/grammar/dpm_xlParser.g4 +0 -0
  76. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/migration.py +0 -0
  77. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/models.py +0 -0
  78. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/semantics/DAG/DAGAnalyzer.py +0 -0
  79. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/semantics/DAG/__init__.py +0 -0
  80. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/semantics/SemanticAnalyzer.py +0 -0
  81. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/semantics/Symbols.py +0 -0
  82. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/semantics/__init__.py +0 -0
  83. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/data_types.sql +0 -0
  84. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/datapoints.sql +0 -0
  85. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/hierarchy_operand_reference.sql +0 -0
  86. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/hierarchy_preconditions.sql +0 -0
  87. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/hierarchy_variables.sql +0 -0
  88. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/hierarchy_variables_context.sql +0 -0
  89. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/key_components.sql +0 -0
  90. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/module_from_table.sql +0 -0
  91. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/open_keys.sql +0 -0
  92. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/operation_info.sql +0 -0
  93. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/operation_list.sql +0 -0
  94. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/operations_versions_from_module_version.sql +0 -0
  95. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/precondition_info.sql +0 -0
  96. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/report_type_operand_reference_info.sql +0 -0
  97. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/subcategory_info.sql +0 -0
  98. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/py_dpm/views/table_info.sql +0 -0
  99. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/dependency_links.txt +0 -0
  100. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/entry_points.txt +0 -0
  101. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/pydpm_xl.egg-info/top_level.txt +0 -0
  102. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/setup.cfg +0 -0
  103. {pydpm_xl-0.1.39rc30 → pydpm_xl-0.1.39rc32}/tests/test_semantic_release.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydpm_xl
3
- Version: 0.1.39rc30
3
+ Version: 0.1.39rc32
4
4
  Summary: Python library for DPM-XL data processing and analysis
5
5
  Author-email: "MeaningfulData S.L." <info@meaningfuldata.eu>
6
6
  License: GPL-3.0-or-later
@@ -25,7 +25,7 @@ Requires-Dist: antlr4-python3-runtime<4.9.3,>=4.9.2
25
25
  Requires-Dist: pyodbc<5.2.0,>=5.1.0
26
26
  Requires-Dist: click<8.2.0,>=8.1.6
27
27
  Requires-Dist: python-dotenv<1.1.0,>=1.0.1
28
- Requires-Dist: psycopg2<3.0.0,>=2.9.0
28
+ Requires-Dist: psycopg2-binary<3.0.0,>=2.9.0
29
29
  Provides-Extra: test
30
30
  Requires-Dist: pytest<8.0.0,>=7.4.0; extra == "test"
31
31
  Requires-Dist: pytest-cov<5.0.0,>=4.1.0; extra == "test"
@@ -41,7 +41,7 @@ Available packages:
41
41
  - pydpm.api: Main APIs for migration, syntax, and semantic analysis
42
42
  """
43
43
 
44
- __version__ = "0.1.39rc30"
44
+ __version__ = "0.1.39rc32"
45
45
  __author__ = "MeaningfulData S.L."
46
46
  __email__ = "info@meaningfuldata.eu"
47
47
  __license__ = "GPL-3.0-or-later"
@@ -167,10 +167,10 @@ class API:
167
167
  cls.visitor = ASTVisitor()
168
168
  cls.AST = cls.visitor.visit(cls.CST)
169
169
 
170
- def semantic_validation(self, expression):
170
+ def semantic_validation(self, expression, release_id=None):
171
171
  self.create_ast(expression=expression)
172
172
 
173
- oc = OperandsChecking(session=self.session, expression=expression, ast=self.AST, release_id=None)
173
+ oc = OperandsChecking(session=self.session, expression=expression, ast=self.AST, release_id=release_id)
174
174
  semanticAnalysis = SemanticAnalyzer.InputAnalyzer(expression)
175
175
 
176
176
  semanticAnalysis.data = oc.data
@@ -14,7 +14,12 @@ from typing import Dict, Any, Optional
14
14
  from py_dpm.Utils.ast_serialization import ASTToJSONVisitor
15
15
 
16
16
 
17
- def generate_complete_ast(expression: str, database_path: str = None, connection_url: str = None):
17
+ def generate_complete_ast(
18
+ expression: str,
19
+ database_path: str = None,
20
+ connection_url: str = None,
21
+ release_id: Optional[int] = None
22
+ ):
18
23
  """
19
24
  Generate complete AST with all data fields, exactly like json_scripts examples.
20
25
 
@@ -25,6 +30,8 @@ def generate_complete_ast(expression: str, database_path: str = None, connection
25
30
  expression: DPM-XL expression string
26
31
  database_path: Path to SQLite database file (e.g., "./database.db")
27
32
  connection_url: SQLAlchemy connection URL for PostgreSQL (optional)
33
+ release_id: Optional release ID to filter database lookups by specific release.
34
+ If None, uses all available data (release-agnostic).
28
35
 
29
36
  Returns:
30
37
  dict: {
@@ -59,7 +66,7 @@ def generate_complete_ast(expression: str, database_path: str = None, connection
59
66
 
60
67
  # Perform complete semantic validation with operand checking
61
68
  # This should populate all data fields on VarID nodes
62
- semantic_result = api.semantic_validation(expression)
69
+ semantic_result = api.semantic_validation(expression, release_id=release_id)
63
70
 
64
71
 
65
72
  # Force data population if semantic validation completed successfully
@@ -87,7 +94,7 @@ def generate_complete_ast(expression: str, database_path: str = None, connection
87
94
  session=session,
88
95
  expression=expression,
89
96
  ast=inner_ast,
90
- release_id=None
97
+ release_id=release_id
91
98
  )
92
99
 
93
100
  # Apply the data from operand checker to VarID nodes
@@ -246,7 +253,12 @@ def _check_data_fields_populated(ast_dict):
246
253
  return False
247
254
 
248
255
 
249
- def generate_complete_batch(expressions: list, database_path: str = None, connection_url: str = None):
256
+ def generate_complete_batch(
257
+ expressions: list,
258
+ database_path: str = None,
259
+ connection_url: str = None,
260
+ release_id: Optional[int] = None
261
+ ):
250
262
  """
251
263
  Generate complete ASTs for multiple expressions.
252
264
 
@@ -254,20 +266,29 @@ def generate_complete_batch(expressions: list, database_path: str = None, connec
254
266
  expressions: List of DPM-XL expression strings
255
267
  database_path: Path to SQLite database file
256
268
  connection_url: SQLAlchemy connection URL for PostgreSQL (optional)
269
+ release_id: Optional release ID to filter database lookups by specific release.
270
+ If None, uses all available data (release-agnostic).
257
271
 
258
272
  Returns:
259
273
  list: List of result dictionaries
260
274
  """
261
275
  results = []
262
276
  for i, expr in enumerate(expressions):
263
- result = generate_complete_ast(expr, database_path, connection_url)
277
+ result = generate_complete_ast(
278
+ expr, database_path, connection_url, release_id=release_id
279
+ )
264
280
  result['batch_index'] = i
265
281
  results.append(result)
266
282
  return results
267
283
 
268
284
 
269
285
  # Convenience function with cleaner interface
270
- def parse_with_data_fields(expression: str, database_path: str = None, connection_url: str = None):
286
+ def parse_with_data_fields(
287
+ expression: str,
288
+ database_path: str = None,
289
+ connection_url: str = None,
290
+ release_id: Optional[int] = None
291
+ ):
271
292
  """
272
293
  Simple function to parse expression and get AST with data fields.
273
294
 
@@ -275,11 +296,15 @@ def parse_with_data_fields(expression: str, database_path: str = None, connectio
275
296
  expression: DPM-XL expression string
276
297
  database_path: Path to SQLite database file
277
298
  connection_url: SQLAlchemy connection URL for PostgreSQL (optional)
299
+ release_id: Optional release ID to filter database lookups by specific release.
300
+ If None, uses all available data (release-agnostic).
278
301
 
279
302
  Returns:
280
303
  dict: AST dictionary with data fields, or None if failed
281
304
  """
282
- result = generate_complete_ast(expression, database_path, connection_url)
305
+ result = generate_complete_ast(
306
+ expression, database_path, connection_url, release_id=release_id
307
+ )
283
308
  return result['ast'] if result['success'] else None
284
309
 
285
310
 
@@ -296,6 +321,7 @@ def generate_enriched_ast(
296
321
  operation_code: Optional[str] = None,
297
322
  table_context: Optional[Dict[str, Any]] = None,
298
323
  precondition: Optional[str] = None,
324
+ release_id: Optional[int] = None,
299
325
  ) -> Dict[str, Any]:
300
326
  """
301
327
  Generate enriched, engine-ready AST from DPM-XL expression.
@@ -311,6 +337,8 @@ def generate_enriched_ast(
311
337
  operation_code: Optional operation code (defaults to "default_code")
312
338
  table_context: Optional table context dict with keys: 'table', 'columns', 'rows', 'sheets', 'default', 'interval'
313
339
  precondition: Optional precondition variable reference (e.g., {v_F_44_04})
340
+ release_id: Optional release ID to filter database lookups by specific release.
341
+ If None, uses all available data (release-agnostic).
314
342
 
315
343
  Returns:
316
344
  dict: {
@@ -321,7 +349,9 @@ def generate_enriched_ast(
321
349
  """
322
350
  try:
323
351
  # Generate complete AST first
324
- complete_result = generate_complete_ast(expression, database_path, connection_url)
352
+ complete_result = generate_complete_ast(
353
+ expression, database_path, connection_url, release_id=release_id
354
+ )
325
355
 
326
356
  if not complete_result['success']:
327
357
  return {