quantum-framework 0.18.0__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.
Files changed (333) hide show
  1. quantum/__init__.py +1 -0
  2. quantum/cli/__init__.py +2 -0
  3. quantum/cli/admin.py +131 -0
  4. quantum/cli/check.py +223 -0
  5. quantum/cli/commands/__init__.py +15 -0
  6. quantum/cli/commands/build.py +414 -0
  7. quantum/cli/commands/dev.py +185 -0
  8. quantum/cli/commands/docs.py +329 -0
  9. quantum/cli/commands/lint.py +523 -0
  10. quantum/cli/commands/migrate.py +548 -0
  11. quantum/cli/commands/new.py +622 -0
  12. quantum/cli/commands/serve.py +190 -0
  13. quantum/cli/commands/test.py +193 -0
  14. quantum/cli/deploy.py +810 -0
  15. quantum/cli/hot_reload.py +951 -0
  16. quantum/cli/jobs.py +356 -0
  17. quantum/cli/mq.py +582 -0
  18. quantum/cli/pkg.py +390 -0
  19. quantum/cli/runner.py +565 -0
  20. quantum/cli/server_process.py +159 -0
  21. quantum/cli/utils.py +334 -0
  22. quantum/compiler/__init__.py +30 -0
  23. quantum/compiler/base_generator.py +367 -0
  24. quantum/compiler/cli.py +295 -0
  25. quantum/compiler/expression_transformer.py +444 -0
  26. quantum/compiler/javascript/__init__.py +10 -0
  27. quantum/compiler/javascript/generator.py +659 -0
  28. quantum/compiler/optimizer.py +270 -0
  29. quantum/compiler/python/__init__.py +10 -0
  30. quantum/compiler/python/generator.py +883 -0
  31. quantum/compiler/python/runtime.py +863 -0
  32. quantum/compiler/transpiler.py +330 -0
  33. quantum/core/__init__.py +3 -0
  34. quantum/core/ast_nodes.py +2619 -0
  35. quantum/core/config_env.py +54 -0
  36. quantum/core/docs_links.py +8 -0
  37. quantum/core/expression_diagnostics.py +87 -0
  38. quantum/core/expression_stdlib.py +208 -0
  39. quantum/core/expressions.py +677 -0
  40. quantum/core/features/agents/src/__init__.py +30 -0
  41. quantum/core/features/agents/src/ast_node.py +540 -0
  42. quantum/core/features/conditionals/src/__init__.py +8 -0
  43. quantum/core/features/conditionals/src/ast_node.py +68 -0
  44. quantum/core/features/data_import/src/__init__.py +0 -0
  45. quantum/core/features/data_import/src/ast_node.py +292 -0
  46. quantum/core/features/data_import/src/runtime.py +533 -0
  47. quantum/core/features/dump/src/__init__.py +12 -0
  48. quantum/core/features/dump/src/ast_node.py +106 -0
  49. quantum/core/features/dump/src/parser.py +61 -0
  50. quantum/core/features/dump/src/runtime.py +246 -0
  51. quantum/core/features/functions/src/__init__.py +8 -0
  52. quantum/core/features/functions/src/ast_node.py +149 -0
  53. quantum/core/features/game_engine_2d/src/__init__.py +19 -0
  54. quantum/core/features/game_engine_2d/src/ast_nodes.py +1719 -0
  55. quantum/core/features/game_engine_2d/src/parser.py +983 -0
  56. quantum/core/features/invocation/src/__init__.py +0 -0
  57. quantum/core/features/invocation/src/ast_node.py +147 -0
  58. quantum/core/features/invocation/src/runtime.py +332 -0
  59. quantum/core/features/knowledge_base/src/__init__.py +6 -0
  60. quantum/core/features/knowledge_base/src/ast_node.py +113 -0
  61. quantum/core/features/knowledge_base/src/parser.py +82 -0
  62. quantum/core/features/logging/src/__init__.py +12 -0
  63. quantum/core/features/logging/src/ast_node.py +111 -0
  64. quantum/core/features/logging/src/parser.py +50 -0
  65. quantum/core/features/logging/src/runtime.py +190 -0
  66. quantum/core/features/loops/src/__init__.py +8 -0
  67. quantum/core/features/loops/src/ast_node.py +60 -0
  68. quantum/core/features/query/src/__init__.py +0 -0
  69. quantum/core/features/query/src/query_validators.py +20 -0
  70. quantum/core/features/state_management/src/__init__.py +11 -0
  71. quantum/core/features/state_management/src/ast_node.py +121 -0
  72. quantum/core/features/terminal_engine/src/__init__.py +21 -0
  73. quantum/core/features/terminal_engine/src/ast_nodes.py +560 -0
  74. quantum/core/features/terminal_engine/src/parser.py +361 -0
  75. quantum/core/features/testing_engine/src/__init__.py +41 -0
  76. quantum/core/features/testing_engine/src/ast_nodes.py +1212 -0
  77. quantum/core/features/testing_engine/src/parser.py +604 -0
  78. quantum/core/features/theming/src/__init__.py +48 -0
  79. quantum/core/features/theming/src/ast_node.py +137 -0
  80. quantum/core/features/theming/src/presets.py +405 -0
  81. quantum/core/features/ui_engine/src/__init__.py +20 -0
  82. quantum/core/features/ui_engine/src/ast_nodes.py +1913 -0
  83. quantum/core/features/ui_engine/src/parser.py +1192 -0
  84. quantum/core/features/websocket/src/__init__.py +24 -0
  85. quantum/core/features/websocket/src/ast_node.py +247 -0
  86. quantum/core/guards.py +53 -0
  87. quantum/core/html_compat.py +299 -0
  88. quantum/core/parser.py +1551 -0
  89. quantum/core/parser_registry.py +213 -0
  90. quantum/core/parsers/__init__.py +76 -0
  91. quantum/core/parsers/ai/__init__.py +12 -0
  92. quantum/core/parsers/ai/agent_parser.py +106 -0
  93. quantum/core/parsers/ai/knowledge_parser.py +86 -0
  94. quantum/core/parsers/ai/llm_parser.py +78 -0
  95. quantum/core/parsers/ai/team_parser.py +88 -0
  96. quantum/core/parsers/base.py +322 -0
  97. quantum/core/parsers/composition/__init__.py +10 -0
  98. quantum/core/parsers/composition/import_parser.py +50 -0
  99. quantum/core/parsers/composition/slot_parser.py +48 -0
  100. quantum/core/parsers/control_flow/__init__.py +11 -0
  101. quantum/core/parsers/control_flow/if_parser.py +71 -0
  102. quantum/core/parsers/control_flow/loop_parser.py +105 -0
  103. quantum/core/parsers/control_flow/set_parser.py +93 -0
  104. quantum/core/parsers/data/__init__.py +12 -0
  105. quantum/core/parsers/data/data_parser.py +229 -0
  106. quantum/core/parsers/data/invoke_parser.py +133 -0
  107. quantum/core/parsers/data/query_parser.py +213 -0
  108. quantum/core/parsers/data/transaction_parser.py +86 -0
  109. quantum/core/parsers/events/__init__.py +9 -0
  110. quantum/core/parsers/events/dispatch_event_parser.py +44 -0
  111. quantum/core/parsers/forms/__init__.py +11 -0
  112. quantum/core/parsers/forms/action_parser.py +79 -0
  113. quantum/core/parsers/forms/flash_parser.py +34 -0
  114. quantum/core/parsers/forms/redirect_parser.py +33 -0
  115. quantum/core/parsers/functions/__init__.py +11 -0
  116. quantum/core/parsers/functions/function_parser.py +98 -0
  117. quantum/core/parsers/functions/param_parser.py +73 -0
  118. quantum/core/parsers/functions/return_parser.py +31 -0
  119. quantum/core/parsers/html/__init__.py +10 -0
  120. quantum/core/parsers/html/component_call_parser.py +130 -0
  121. quantum/core/parsers/html/html_parser.py +115 -0
  122. quantum/core/parsers/jobs/__init__.py +11 -0
  123. quantum/core/parsers/jobs/job_parser.py +71 -0
  124. quantum/core/parsers/jobs/schedule_parser.py +62 -0
  125. quantum/core/parsers/jobs/thread_parser.py +57 -0
  126. quantum/core/parsers/messaging/__init__.py +17 -0
  127. quantum/core/parsers/messaging/message_ack_parser.py +30 -0
  128. quantum/core/parsers/messaging/message_nack_parser.py +30 -0
  129. quantum/core/parsers/messaging/message_parser.py +114 -0
  130. quantum/core/parsers/messaging/queue_parser.py +61 -0
  131. quantum/core/parsers/messaging/websocket_parser.py +121 -0
  132. quantum/core/parsers/routing/__init__.py +9 -0
  133. quantum/core/parsers/routing/route_parser.py +41 -0
  134. quantum/core/parsers/scripting/__init__.py +12 -0
  135. quantum/core/parsers/scripting/pyclass_parser.py +62 -0
  136. quantum/core/parsers/scripting/pydecorator_parser.py +68 -0
  137. quantum/core/parsers/scripting/pyimport_parser.py +52 -0
  138. quantum/core/parsers/scripting/python_parser.py +49 -0
  139. quantum/core/parsers/services/__init__.py +12 -0
  140. quantum/core/parsers/services/dump_parser.py +52 -0
  141. quantum/core/parsers/services/file_parser.py +48 -0
  142. quantum/core/parsers/services/log_parser.py +46 -0
  143. quantum/core/parsers/services/mail_parser.py +65 -0
  144. quantum/core/tiers.py +164 -0
  145. quantum/core/xml_lines.py +81 -0
  146. quantum/packages/__init__.py +28 -0
  147. quantum/packages/manager.py +413 -0
  148. quantum/packages/manifest.py +351 -0
  149. quantum/packages/registry.py +399 -0
  150. quantum/packages/resolver.py +336 -0
  151. quantum/plugins/__init__.py +33 -0
  152. quantum/plugins/hooks.py +329 -0
  153. quantum/plugins/loader.py +479 -0
  154. quantum/plugins/manifest.py +336 -0
  155. quantum/plugins/registry.py +371 -0
  156. quantum/runtime/__init__.py +25 -0
  157. quantum/runtime/action_handler.py +532 -0
  158. quantum/runtime/adapters/__init__.py +88 -0
  159. quantum/runtime/adapters/memory_adapter.py +690 -0
  160. quantum/runtime/adapters/rabbitmq_adapter.py +715 -0
  161. quantum/runtime/adapters/redis_adapter.py +582 -0
  162. quantum/runtime/adapters/sqlite_adapter.py +414 -0
  163. quantum/runtime/agent_service.py +1133 -0
  164. quantum/runtime/ast_cache.py +506 -0
  165. quantum/runtime/auth_service.py +267 -0
  166. quantum/runtime/component.py +1048 -0
  167. quantum/runtime/component_composer.py +133 -0
  168. quantum/runtime/component_resolver.py +174 -0
  169. quantum/runtime/conditions.py +54 -0
  170. quantum/runtime/database_service.py +595 -0
  171. quantum/runtime/db_schema.py +100 -0
  172. quantum/runtime/dev_panel.py +178 -0
  173. quantum/runtime/email_service.py +162 -0
  174. quantum/runtime/error_handler.py +295 -0
  175. quantum/runtime/execution_context.py +283 -0
  176. quantum/runtime/executor_registry.py +178 -0
  177. quantum/runtime/executors/__init__.py +71 -0
  178. quantum/runtime/executors/ai/__init__.py +12 -0
  179. quantum/runtime/executors/ai/agent_executor.py +217 -0
  180. quantum/runtime/executors/ai/knowledge_executor.py +114 -0
  181. quantum/runtime/executors/ai/llm_executor.py +153 -0
  182. quantum/runtime/executors/ai/team_executor.py +171 -0
  183. quantum/runtime/executors/base.py +264 -0
  184. quantum/runtime/executors/control_flow/__init__.py +12 -0
  185. quantum/runtime/executors/control_flow/if_executor.py +98 -0
  186. quantum/runtime/executors/control_flow/loop_executor.py +308 -0
  187. quantum/runtime/executors/control_flow/redirect_executor.py +43 -0
  188. quantum/runtime/executors/control_flow/set_executor.py +464 -0
  189. quantum/runtime/executors/data/__init__.py +12 -0
  190. quantum/runtime/executors/data/data_executor.py +156 -0
  191. quantum/runtime/executors/data/invoke_executor.py +228 -0
  192. quantum/runtime/executors/data/query_executor.py +290 -0
  193. quantum/runtime/executors/data/transaction_executor.py +91 -0
  194. quantum/runtime/executors/jobs/__init__.py +11 -0
  195. quantum/runtime/executors/jobs/job_executor.py +190 -0
  196. quantum/runtime/executors/jobs/schedule_executor.py +132 -0
  197. quantum/runtime/executors/jobs/thread_executor.py +127 -0
  198. quantum/runtime/executors/messaging/__init__.py +17 -0
  199. quantum/runtime/executors/messaging/message_ack_executor.py +51 -0
  200. quantum/runtime/executors/messaging/message_executor.py +174 -0
  201. quantum/runtime/executors/messaging/queue_executor.py +103 -0
  202. quantum/runtime/executors/messaging/websocket_executor.py +197 -0
  203. quantum/runtime/executors/scripting/__init__.py +11 -0
  204. quantum/runtime/executors/scripting/pyclass_executor.py +90 -0
  205. quantum/runtime/executors/scripting/pyimport_executor.py +81 -0
  206. quantum/runtime/executors/scripting/python_executor.py +249 -0
  207. quantum/runtime/executors/services/__init__.py +12 -0
  208. quantum/runtime/executors/services/dump_executor.py +72 -0
  209. quantum/runtime/executors/services/file_executor.py +89 -0
  210. quantum/runtime/executors/services/log_executor.py +77 -0
  211. quantum/runtime/executors/services/mail_executor.py +81 -0
  212. quantum/runtime/expression_cache.py +498 -0
  213. quantum/runtime/file_upload_service.py +326 -0
  214. quantum/runtime/function_registry.py +118 -0
  215. quantum/runtime/game_builder.py +166 -0
  216. quantum/runtime/game_code_generator.py +2371 -0
  217. quantum/runtime/game_templates.py +2006 -0
  218. quantum/runtime/godot_code_generator.py +4681 -0
  219. quantum/runtime/godot_templates.py +1449 -0
  220. quantum/runtime/job_executor.py +1599 -0
  221. quantum/runtime/knowledge_service.py +546 -0
  222. quantum/runtime/llm_cache.py +100 -0
  223. quantum/runtime/llm_providers.py +704 -0
  224. quantum/runtime/llm_service.py +287 -0
  225. quantum/runtime/local_server.py +28 -0
  226. quantum/runtime/logging_setup.py +141 -0
  227. quantum/runtime/message_broker.py +364 -0
  228. quantum/runtime/message_queue_service.py +571 -0
  229. quantum/runtime/param_validation.py +218 -0
  230. quantum/runtime/pypy_compat.py +317 -0
  231. quantum/runtime/python_bridge.py +698 -0
  232. quantum/runtime/query_validators.py +304 -0
  233. quantum/runtime/renderer.py +734 -0
  234. quantum/runtime/service_container.py +470 -0
  235. quantum/runtime/table_params.py +163 -0
  236. quantum/runtime/terminal_builder.py +76 -0
  237. quantum/runtime/terminal_code_generator.py +607 -0
  238. quantum/runtime/terminal_templates.py +243 -0
  239. quantum/runtime/testing_builder.py +77 -0
  240. quantum/runtime/testing_code_generator.py +833 -0
  241. quantum/runtime/testing_templates.py +85 -0
  242. quantum/runtime/ui_builder.py +222 -0
  243. quantum/runtime/ui_console.py +405 -0
  244. quantum/runtime/ui_desktop.py +56 -0
  245. quantum/runtime/ui_form_rules.py +193 -0
  246. quantum/runtime/ui_html_adapter.py +2567 -0
  247. quantum/runtime/ui_html_templates.py +2106 -0
  248. quantum/runtime/ui_mobile_adapter.py +1832 -0
  249. quantum/runtime/ui_mobile_templates.py +1003 -0
  250. quantum/runtime/ui_page_renderer.py +392 -0
  251. quantum/runtime/ui_pager.py +73 -0
  252. quantum/runtime/ui_table_edit.py +139 -0
  253. quantum/runtime/ui_textual_adapter.py +1866 -0
  254. quantum/runtime/ui_textual_templates.py +45 -0
  255. quantum/runtime/ui_tokens.py +465 -0
  256. quantum/runtime/ui_validator.py +365 -0
  257. quantum/runtime/ui_view.py +221 -0
  258. quantum/runtime/validators.py +256 -0
  259. quantum/runtime/web_server.py +2131 -0
  260. quantum/runtime/websocket_adapter.py +501 -0
  261. quantum/runtime/websocket_service.py +585 -0
  262. quantum/runtime/websocket_transport.py +289 -0
  263. quantum/runtime/wsgi.py +101 -0
  264. quantum/services.py +109 -0
  265. quantum/utils/__init__.py +1 -0
  266. quantum_admin/__init__.py +4 -0
  267. quantum_admin/assets/quantum-admin-connectors.js +123 -0
  268. quantum_admin/assets/quantum-admin.css +2058 -0
  269. quantum_admin/assets/quantum-source-highlight.js +106 -0
  270. quantum_admin/backend/__init__.py +4 -0
  271. quantum_admin/backend/audit_service.py +346 -0
  272. quantum_admin/backend/auth_service.py +394 -0
  273. quantum_admin/backend/component_discovery.py +766 -0
  274. quantum_admin/backend/config_generator.py +586 -0
  275. quantum_admin/backend/connector_service.py +1016 -0
  276. quantum_admin/backend/crud.py +557 -0
  277. quantum_admin/backend/database.py +226 -0
  278. quantum_admin/backend/db_setup_service.py +193 -0
  279. quantum_admin/backend/deploy_service.py +698 -0
  280. quantum_admin/backend/docker_service.py +422 -0
  281. quantum_admin/backend/environment_service.py +418 -0
  282. quantum_admin/backend/git_service.py +370 -0
  283. quantum_admin/backend/health_service.py +390 -0
  284. quantum_admin/backend/job_service.py +347 -0
  285. quantum_admin/backend/log_service.py +331 -0
  286. quantum_admin/backend/main.py +14426 -0
  287. quantum_admin/backend/models.py +986 -0
  288. quantum_admin/backend/pipeline_service.py +812 -0
  289. quantum_admin/backend/resource_manager.py +1118 -0
  290. quantum_admin/backend/schemas.py +419 -0
  291. quantum_admin/backend/secret_manager.py +277 -0
  292. quantum_admin/backend/settings_service.py +488 -0
  293. quantum_admin/backend/template_service.py +710 -0
  294. quantum_admin/backend/test_execution_service.py +364 -0
  295. quantum_admin/backend/test_generator.py +782 -0
  296. quantum_admin/backend/webhook_service.py +454 -0
  297. quantum_admin/backend/websocket_manager.py +360 -0
  298. quantum_admin/components/admin/_layout/AdminShell.q +121 -0
  299. quantum_admin/components/admin/agents.q +107 -0
  300. quantum_admin/components/admin/app/[name].q +558 -0
  301. quantum_admin/components/admin/applications.q +160 -0
  302. quantum_admin/components/admin/component/[...path].q +205 -0
  303. quantum_admin/components/admin/components.q +59 -0
  304. quantum_admin/components/admin/connectors.q +283 -0
  305. quantum_admin/components/admin/dashboard.q +86 -0
  306. quantum_admin/components/admin/database.q +95 -0
  307. quantum_admin/components/admin/features.q +69 -0
  308. quantum_admin/components/admin/index.q +12 -0
  309. quantum_admin/components/admin/jobs.q +75 -0
  310. quantum_admin/components/admin/login.q +65 -0
  311. quantum_admin/components/admin/logout.q +11 -0
  312. quantum_admin/components/admin/settings.q +174 -0
  313. quantum_admin/components/admin/source.q +45 -0
  314. quantum_admin/components/admin/tests.q +73 -0
  315. quantum_admin/run.py +13 -0
  316. quantum_admin/services/__init__.py +16 -0
  317. quantum_admin/services/_base.py +84 -0
  318. quantum_admin/services/_component_test_generator.py +205 -0
  319. quantum_admin/services/_yaml_editor.py +82 -0
  320. quantum_admin/services/apps.py +330 -0
  321. quantum_admin/services/auth.py +61 -0
  322. quantum_admin/services/components.py +210 -0
  323. quantum_admin/services/connectors.py +164 -0
  324. quantum_admin/services/projects.py +189 -0
  325. quantum_admin/services/repository.py +223 -0
  326. quantum_admin/services/settings.py +150 -0
  327. quantum_admin/services/yaml_import.py +118 -0
  328. quantum_framework-0.18.0.dist-info/METADATA +281 -0
  329. quantum_framework-0.18.0.dist-info/RECORD +333 -0
  330. quantum_framework-0.18.0.dist-info/WHEEL +5 -0
  331. quantum_framework-0.18.0.dist-info/entry_points.txt +2 -0
  332. quantum_framework-0.18.0.dist-info/licenses/LICENSE +21 -0
  333. quantum_framework-0.18.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,292 @@
1
+ """
2
+ Data Import Feature - AST Nodes
3
+ Defines DataNode and related nodes for q:data
4
+ """
5
+
6
+ from typing import List, Dict, Any, Optional
7
+ from quantum.core.ast_nodes import QuantumNode
8
+
9
+
10
+ class DataNode(QuantumNode):
11
+ """Represents a <q:data> - Data import and transformation component"""
12
+
13
+ def __init__(self, name: str, source: str, data_type: str):
14
+ self.name = name # Variable name for result
15
+ self.source = source # File path, URL, or variable reference
16
+ self.data_type = data_type # csv, json, xml, transform
17
+
18
+ # Caching
19
+ self.cache = True # Cache by default
20
+ self.ttl = None # Cache TTL in seconds
21
+
22
+ # CSV-specific attributes
23
+ self.delimiter = ","
24
+ self.quote = '"'
25
+ self.header = True # First row contains headers
26
+ self.encoding = "utf-8"
27
+ self.skip_rows = 0
28
+
29
+ # XML-specific attributes
30
+ self.xpath = None # XPath expression to select nodes
31
+ self.namespace = None # XML namespace URI
32
+
33
+ # Child elements
34
+ self.columns: List['ColumnNode'] = [] # For CSV
35
+ self.fields: List['FieldNode'] = [] # For XML
36
+ self.transforms: List['TransformNode'] = [] # For transformations
37
+ self.headers: List['HeaderNode'] = [] # For HTTP headers (URL sources)
38
+
39
+ # Result metadata
40
+ self.result = None # Variable name for metadata
41
+ self.on_error = 'fail' # DATA-4: 'fail' or 'continue'
42
+
43
+ def add_column(self, column: 'ColumnNode'):
44
+ """Add CSV column definition"""
45
+ self.columns.append(column)
46
+
47
+ def add_field(self, field: 'FieldNode'):
48
+ """Add XML field mapping"""
49
+ self.fields.append(field)
50
+
51
+ def add_transform(self, transform: 'TransformNode'):
52
+ """Add transformation operation"""
53
+ self.transforms.append(transform)
54
+
55
+ def add_header(self, header: 'HeaderNode'):
56
+ """Add HTTP header"""
57
+ self.headers.append(header)
58
+
59
+ def to_dict(self) -> Dict[str, Any]:
60
+ return {
61
+ "type": "data",
62
+ "name": self.name,
63
+ "source": self.source,
64
+ "data_type": self.data_type,
65
+ "cache": self.cache,
66
+ "ttl": self.ttl,
67
+ "columns": [c.to_dict() for c in self.columns],
68
+ "fields": [f.to_dict() for f in self.fields],
69
+ "transforms": [t.to_dict() for t in self.transforms],
70
+ "headers": [h.to_dict() for h in self.headers]
71
+ }
72
+
73
+ def validate(self) -> List[str]:
74
+ errors = []
75
+ if not self.name:
76
+ errors.append("Data name is required")
77
+ if not self.source:
78
+ errors.append("Data source is required")
79
+ if self.data_type not in ['csv', 'json', 'xml', 'transform']:
80
+ errors.append(f"Invalid data type: {self.data_type}. Must be csv, json, xml, or transform")
81
+
82
+ # Validate child elements
83
+ for column in self.columns:
84
+ errors.extend(column.validate())
85
+ for field in self.fields:
86
+ errors.extend(field.validate())
87
+ for transform in self.transforms:
88
+ errors.extend(transform.validate())
89
+ for header in self.headers:
90
+ errors.extend(header.validate())
91
+
92
+ return errors
93
+
94
+
95
+ class ColumnNode(QuantumNode):
96
+ """Represents a <q:column> - CSV column definition"""
97
+
98
+ def __init__(self, name: str, col_type: str = "string"):
99
+ self.name = name
100
+ self.col_type = col_type # string, integer, decimal, boolean, date, datetime
101
+
102
+ # Validation (same as QuantumParam)
103
+ self.required = False
104
+ self.default = None
105
+ self.validate_rule = None
106
+ self.pattern = None
107
+ self.min = None
108
+ self.max = None
109
+ self.minlength = None
110
+ self.maxlength = None
111
+ self.range = None
112
+ self.enum = None
113
+
114
+ def to_dict(self) -> Dict[str, Any]:
115
+ return {
116
+ "type": "column",
117
+ "name": self.name,
118
+ "col_type": self.col_type,
119
+ "required": self.required,
120
+ "default": self.default
121
+ }
122
+
123
+ def validate(self) -> List[str]:
124
+ errors = []
125
+ if not self.name:
126
+ errors.append("Column name is required")
127
+ valid_types = ['string', 'integer', 'decimal', 'boolean', 'date', 'datetime', 'json', 'array']
128
+ if self.col_type not in valid_types:
129
+ errors.append(f"Invalid column type: {self.col_type}. Must be one of {valid_types}")
130
+ return errors
131
+
132
+
133
+ class FieldNode(QuantumNode):
134
+ """Represents a <q:field> - XML field mapping"""
135
+
136
+ def __init__(self, name: str, xpath: str, field_type: str = "string"):
137
+ self.name = name
138
+ self.xpath = xpath # XPath expression to extract value
139
+ self.field_type = field_type # string, integer, decimal, boolean, date, datetime
140
+
141
+ def to_dict(self) -> Dict[str, Any]:
142
+ return {
143
+ "type": "field",
144
+ "name": self.name,
145
+ "xpath": self.xpath,
146
+ "field_type": self.field_type
147
+ }
148
+
149
+ def validate(self) -> List[str]:
150
+ errors = []
151
+ if not self.name:
152
+ errors.append("Field name is required")
153
+ if not self.xpath:
154
+ errors.append("Field xpath is required")
155
+ valid_types = ['string', 'integer', 'decimal', 'boolean', 'date', 'datetime', 'json', 'array']
156
+ if self.field_type not in valid_types:
157
+ errors.append(f"Invalid field type: {self.field_type}. Must be one of {valid_types}")
158
+ return errors
159
+
160
+
161
+ class TransformNode(QuantumNode):
162
+ """Represents a <q:transform> - Container for transformation operations"""
163
+
164
+ def __init__(self):
165
+ self.operations: List[QuantumNode] = [] # Filter, Sort, Limit, Compute, etc.
166
+
167
+ def add_operation(self, operation: QuantumNode):
168
+ """Add transformation operation"""
169
+ self.operations.append(operation)
170
+
171
+ def to_dict(self) -> Dict[str, Any]:
172
+ return {
173
+ "type": "transform",
174
+ "operations": [op.to_dict() for op in self.operations]
175
+ }
176
+
177
+ def validate(self) -> List[str]:
178
+ errors = []
179
+ for operation in self.operations:
180
+ errors.extend(operation.validate())
181
+ return errors
182
+
183
+
184
+ class FilterNode(QuantumNode):
185
+ """Represents a <q:filter> - Filter operation"""
186
+
187
+ def __init__(self, condition: str):
188
+ self.condition = condition # Filter expression
189
+
190
+ def to_dict(self) -> Dict[str, Any]:
191
+ return {
192
+ "type": "filter",
193
+ "condition": self.condition
194
+ }
195
+
196
+ def validate(self) -> List[str]:
197
+ errors = []
198
+ if not self.condition:
199
+ errors.append("Filter condition is required")
200
+ return errors
201
+
202
+
203
+ class SortNode(QuantumNode):
204
+ """Represents a <q:sort> - Sort operation"""
205
+
206
+ def __init__(self, by: str, order: str = "asc"):
207
+ self.by = by # Field name to sort by
208
+ self.order = order # asc or desc
209
+
210
+ def to_dict(self) -> Dict[str, Any]:
211
+ return {
212
+ "type": "sort",
213
+ "by": self.by,
214
+ "order": self.order
215
+ }
216
+
217
+ def validate(self) -> List[str]:
218
+ errors = []
219
+ if not self.by:
220
+ errors.append("Sort 'by' field is required")
221
+ if self.order not in ['asc', 'desc']:
222
+ errors.append(f"Invalid sort order: {self.order}. Must be 'asc' or 'desc'")
223
+ return errors
224
+
225
+
226
+ class LimitNode(QuantumNode):
227
+ """Represents a <q:limit> - Limit operation"""
228
+
229
+ def __init__(self, value: int):
230
+ self.value = value # Maximum number of records
231
+
232
+ def to_dict(self) -> Dict[str, Any]:
233
+ return {
234
+ "type": "limit",
235
+ "value": self.value
236
+ }
237
+
238
+ def validate(self) -> List[str]:
239
+ errors = []
240
+ if self.value is None:
241
+ errors.append("Limit value is required")
242
+ if isinstance(self.value, int) and self.value < 0:
243
+ errors.append("Limit value must be >= 0")
244
+ return errors
245
+
246
+
247
+ class ComputeNode(QuantumNode):
248
+ """Represents a <q:compute> - Compute derived field"""
249
+
250
+ def __init__(self, field: str, expression: str, comp_type: str = "string"):
251
+ self.field = field # New field name
252
+ self.expression = expression # Expression to compute value
253
+ self.comp_type = comp_type # Result type
254
+
255
+ def to_dict(self) -> Dict[str, Any]:
256
+ return {
257
+ "type": "compute",
258
+ "field": self.field,
259
+ "expression": self.expression,
260
+ "comp_type": self.comp_type
261
+ }
262
+
263
+ def validate(self) -> List[str]:
264
+ errors = []
265
+ if not self.field:
266
+ errors.append("Compute field name is required")
267
+ if not self.expression:
268
+ errors.append("Compute expression is required")
269
+ return errors
270
+
271
+
272
+ class HeaderNode(QuantumNode):
273
+ """Represents a <q:header> - HTTP header for URL sources"""
274
+
275
+ def __init__(self, name: str, value: str):
276
+ self.name = name
277
+ self.value = value
278
+
279
+ def to_dict(self) -> Dict[str, Any]:
280
+ return {
281
+ "type": "header",
282
+ "name": self.name,
283
+ "value": self.value[:50] + "..." if len(str(self.value)) > 50 else self.value
284
+ }
285
+
286
+ def validate(self) -> List[str]:
287
+ errors = []
288
+ if not self.name:
289
+ errors.append("Header name is required")
290
+ if self.value is None:
291
+ errors.append(f"Header '{self.name}' value is required")
292
+ return errors