quantum-framework 0.9.0__tar.gz → 0.10.0__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.
- {quantum_framework-0.9.0/quantum_framework.egg-info → quantum_framework-0.10.0}/PKG-INFO +62 -32
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/README.md +58 -29
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/pyproject.toml +4 -3
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/runner.py +3 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expression_stdlib.py +34 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/runtime.py +13 -18
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/data_parser.py +5 -2
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/tiers.py +52 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/data_executor.py +4 -1
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/knowledge_service.py +78 -32
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/pypy_compat.py +5 -3
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/service_container.py +29 -8
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/web_server.py +6 -1
- {quantum_framework-0.9.0 → quantum_framework-0.10.0/quantum_framework.egg-info}/PKG-INFO +62 -32
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_pypy_compat.py +10 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/LICENSE +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/build.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/dev.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/docs.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/lint.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/migrate.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/new.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/serve.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/test.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/deploy.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/hot_reload.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/jobs.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/mq.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/pkg.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/server_process.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/utils.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/base_generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/cli.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/expression_transformer.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/javascript/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/javascript/generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/optimizer.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/runtime.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/transpiler.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/ast_nodes.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expression_diagnostics.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expressions.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/agents/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/agents/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/conditionals/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/conditionals/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/desktop_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/html_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/runtime.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/functions/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/functions/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/ast_nodes.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/runtime.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/runtime.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/loops/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/loops/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/database_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/query_validators.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/state_management/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/state_management/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/ast_nodes.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/presets.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/ast_nodes.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/websocket/src/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/websocket/src/ast_node.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/html_compat.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parser_registry.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/agent_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/knowledge_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/llm_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/team_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/base.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/import_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/slot_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/if_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/loop_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/set_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/invoke_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/query_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/transaction_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/events/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/action_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/flash_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/redirect_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/function_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/param_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/return_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/component_call_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/html_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/job_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/thread_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/queue_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/persistence/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/persistence/persist_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/routing/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/routing/route_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/python_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/dump_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/file_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/log_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/mail_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/manager.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/manifest.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/registry.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/resolver.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/hooks.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/loader.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/manifest.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/registry.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/action_handler.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/memory_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/rabbitmq_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/redis_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/agent_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/api_server.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ast_cache.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/auth_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component_composer.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component_resolver.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/database_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/email_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/error_handler.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/execution_context.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executor_registry.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/agent_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/knowledge_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/llm_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/team_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/base.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/if_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/loop_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/set_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/invoke_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/query_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/transaction_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/job_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/message_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/websocket_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/pyclass_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/pyimport_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/python_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/dump_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/file_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/log_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/mail_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/expression_cache.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/file_upload_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/function_registry.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_builder.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_code_generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/godot_code_generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/godot_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/job_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_cache.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_providers.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/logging_setup.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/message_broker.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/message_queue_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/param_validation.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/python_bridge.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/query_validators.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/renderer.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_builder.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_code_generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_builder.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_code_generator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_builder.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_desktop_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_desktop_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_html_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_html_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_mobile_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_mobile_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_textual_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_textual_templates.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_tokens.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_validator.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/validators.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_service.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_transport.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/wsgi.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/utils/__init__.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/SOURCES.txt +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/dependency_links.txt +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/entry_points.txt +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/requires.txt +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/top_level.txt +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/setup.cfg +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_agent.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_animations.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ast_cache.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_cli_commands.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_component_library.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_data_fetching.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_desktop_bridge.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_expression_cache.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_form_validation.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_codegen.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_e2e.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_engine.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_godot_codegen.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_job_executor.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_llm_providers.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_message_broker.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_message_queue.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_mobile_target.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_multi_agent.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_packages.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_plugins.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_projects_blog_components_admin.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_python_scripting.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_state_persistence.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_terminal_codegen.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_terminal_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_testing_codegen.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_testing_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_theming.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_html_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_parity.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_parser.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_textual_adapter.py +0 -0
- {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_websocket.py +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantum-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: Full-stack declarative framework for building web, desktop, and mobile applications
|
|
5
5
|
Author-email: Daniel Gregorio <danielgregorio2611@gmail.com>
|
|
6
6
|
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://quantum
|
|
8
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Homepage, https://github.com/danielgregorio/quantum
|
|
8
|
+
Project-URL: Documentation, https://danielgregorio.github.io/quantum/
|
|
9
|
+
Project-URL: Changelog, https://github.com/danielgregorio/quantum/releases
|
|
9
10
|
Project-URL: Repository, https://github.com/danielgregorio/quantum
|
|
10
11
|
Keywords: framework,declarative,xml,web,desktop,mobile
|
|
11
12
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -43,9 +44,10 @@ Dynamic: license-file
|
|
|
43
44
|
# Quantum
|
|
44
45
|
|
|
45
46
|
[](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
|
|
46
|
-
[](https://pypi.org/project/quantum-framework/)
|
|
48
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
47
49
|
[](https://danielgregorio.github.io/quantum/)
|
|
48
|
-
[](LICENSE)
|
|
50
|
+
[](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
|
|
49
51
|
|
|
50
52
|
> **Declarative web apps in XML, with AI and RAG built into the language.
|
|
51
53
|
> No build chain, no JavaScript, no frontend framework.**
|
|
@@ -123,6 +125,9 @@ coercion of the model's arguments are the runtime's job.
|
|
|
123
125
|
</q:component>
|
|
124
126
|
```
|
|
125
127
|
|
|
128
|
+
Save it as `components/orders.q`, run `quantum start`, and it is served at
|
|
129
|
+
`http://localhost:8080/orders`.
|
|
130
|
+
|
|
126
131
|
`q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
|
|
127
132
|
enforced by the parser, not by discipline.
|
|
128
133
|
|
|
@@ -134,14 +139,22 @@ Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
|
|
|
134
139
|
|
|
135
140
|
## Quick start
|
|
136
141
|
|
|
137
|
-
**Requirements:** Python 3.
|
|
142
|
+
**Requirements:** Python 3.12+ and `pip`.
|
|
138
143
|
|
|
139
144
|
```bash
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
pip install -e ".[dev]"
|
|
145
|
+
pip install quantum-framework
|
|
146
|
+
```
|
|
143
147
|
|
|
144
|
-
|
|
148
|
+
Create `hello.q`:
|
|
149
|
+
|
|
150
|
+
```xml
|
|
151
|
+
<q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
|
|
152
|
+
<q:return value="Hello World!" />
|
|
153
|
+
</q:component>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
quantum run hello.q
|
|
145
158
|
```
|
|
146
159
|
|
|
147
160
|
```
|
|
@@ -149,17 +162,21 @@ quantum run examples/hello.q
|
|
|
149
162
|
[SUCCESS] Result: Hello World!
|
|
150
163
|
```
|
|
151
164
|
|
|
165
|
+
For a web app, put `.q` files in `components/` and run `quantum start`
|
|
166
|
+
(`components/index.q` is served at `/`). `quantum stop` stops it.
|
|
167
|
+
|
|
152
168
|
For the AI examples you also need an [Ollama](https://ollama.com) server and the RAG
|
|
153
169
|
extra:
|
|
154
170
|
|
|
155
171
|
```bash
|
|
156
|
-
pip install -
|
|
172
|
+
pip install "quantum-framework[rag]"
|
|
157
173
|
ollama pull phi3 && ollama pull nomic-embed-text
|
|
158
174
|
export QUANTUM_LLM_BASE_URL=http://localhost:11434
|
|
159
175
|
```
|
|
160
176
|
|
|
161
|
-
Declare datasources in `quantum.config.yaml` and `q:query` works
|
|
162
|
-
running
|
|
177
|
+
Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
|
|
178
|
+
with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
|
|
179
|
+
`pip install "quantum-framework[db]"`:
|
|
163
180
|
|
|
164
181
|
```yaml
|
|
165
182
|
datasources:
|
|
@@ -173,26 +190,41 @@ datasources:
|
|
|
173
190
|
| Command | What it does |
|
|
174
191
|
|---------|--------------|
|
|
175
192
|
| `run <file.q>` | Execute a component, app, or API |
|
|
176
|
-
| `start` | Start the web server |
|
|
177
|
-
| `
|
|
193
|
+
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
194
|
+
| `stop` | Stop the server started by `start` |
|
|
195
|
+
| `deploy [path]` · `apps` | Deploy an application, manage deployed ones |
|
|
178
196
|
| `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
|
|
179
197
|
|
|
198
|
+
### From source
|
|
199
|
+
|
|
200
|
+
To work on Quantum itself:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
git clone https://github.com/danielgregorio/quantum.git
|
|
204
|
+
cd quantum
|
|
205
|
+
pip install -e ".[dev]"
|
|
206
|
+
quantum run examples/hello.q
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
|
|
210
|
+
|
|
180
211
|
---
|
|
181
212
|
|
|
182
213
|
## Documentation
|
|
183
214
|
|
|
184
|
-
Full docs
|
|
185
|
-
|
|
215
|
+
Full docs at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)**:
|
|
216
|
+
|
|
217
|
+
- [Getting Started](https://danielgregorio.github.io/quantum/guide/getting-started) · [Installation](https://danielgregorio.github.io/quantum/guide/installation) · [Quick Start](https://danielgregorio.github.io/quantum/guide/quick-start)
|
|
218
|
+
- [Components](https://danielgregorio.github.io/quantum/guide/components) · [State](https://danielgregorio.github.io/quantum/guide/state-management) · [Loops](https://danielgregorio.github.io/quantum/guide/loops) · [Conditionals](https://danielgregorio.github.io/quantum/guide/conditionals)
|
|
219
|
+
- [Queries](https://danielgregorio.github.io/quantum/guide/query) · [Functions](https://danielgregorio.github.io/quantum/guide/functions) · [Data fetching](https://danielgregorio.github.io/quantum/guide/data-fetching)
|
|
186
220
|
|
|
187
|
-
|
|
188
|
-
- [Components](docs/guide/components.md) · [State](docs/guide/state-management.md) · [Loops](docs/guide/loops.md) · [Conditionals](docs/guide/conditionals.md)
|
|
189
|
-
- [Queries](docs/guide/query.md) · [Functions](docs/guide/functions.md) · [Data fetching](docs/guide/data-fetching.md)
|
|
221
|
+
Releases and their notes are on the [GitHub Releases](https://github.com/danielgregorio/quantum/releases) page.
|
|
190
222
|
|
|
191
223
|
---
|
|
192
224
|
|
|
193
225
|
## Stability
|
|
194
226
|
|
|
195
|
-
Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short version:
|
|
227
|
+
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
196
228
|
|
|
197
229
|
| Surface | Status |
|
|
198
230
|
|---------|--------|
|
|
@@ -200,13 +232,11 @@ Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short ve
|
|
|
200
232
|
| AI — `q:llm`, `q:knowledge`, `q:agent` | **Beta** — validated end-to-end against a live Ollama server |
|
|
201
233
|
| `q:team` (multi-agent handoff) | Beta, less exercised |
|
|
202
234
|
| Jobs, messaging, websockets, mail, file uploads, `ui:*`, terminal target | **Experimental** — they run, but no API stability promise |
|
|
203
|
-
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](SECURITY.md) |
|
|
235
|
+
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) |
|
|
204
236
|
|
|
205
237
|
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
206
|
-
end-to-end despite being documented as complete.
|
|
207
|
-
|
|
208
|
-
[`AUDIT_FIX_PLAN.md`](AUDIT_FIX_PLAN.md). Feature status is now verified by execution
|
|
209
|
-
rather than asserted by hand.
|
|
238
|
+
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
239
|
+
feature status is now verified by execution rather than asserted by hand.
|
|
210
240
|
|
|
211
241
|
Pre-1.0: APIs may change between minor versions.
|
|
212
242
|
|
|
@@ -221,24 +251,24 @@ quantum/
|
|
|
221
251
|
│ ├── runtime/ # Execution engine, web server, renderer
|
|
222
252
|
│ └── cli/ # Command-line entry point
|
|
223
253
|
├── examples/ # runnable .q examples
|
|
224
|
-
├── tests/ # pytest suite (~
|
|
254
|
+
├── tests/ # pytest suite (~3.8k tests)
|
|
225
255
|
├── scripts/ # dev tools
|
|
226
256
|
└── docs/ # VitePress documentation
|
|
227
257
|
```
|
|
228
258
|
|
|
229
259
|
Adding a tag is one parser + one executor + a registry entry — see
|
|
230
|
-
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
260
|
+
[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
|
|
231
261
|
|
|
232
262
|
---
|
|
233
263
|
|
|
234
264
|
## Contributing
|
|
235
265
|
|
|
236
|
-
Read **[CONTRIBUTING.md](CONTRIBUTING.md)** for dev setup and how the modular
|
|
266
|
+
Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
|
|
237
267
|
parser/executor architecture works. By participating you agree to the
|
|
238
|
-
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
268
|
+
[Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
|
|
239
269
|
|
|
240
|
-
Found a security issue? Follow [SECURITY.md](SECURITY.md) — **do not** open a public issue.
|
|
270
|
+
Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
|
|
241
271
|
|
|
242
272
|
## License
|
|
243
273
|
|
|
244
|
-
MIT — see [LICENSE](LICENSE).
|
|
274
|
+
MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Quantum
|
|
2
2
|
|
|
3
3
|
[](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
|
|
4
|
-
[](https://pypi.org/project/quantum-framework/)
|
|
5
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
5
6
|
[](https://danielgregorio.github.io/quantum/)
|
|
6
|
-
[](LICENSE)
|
|
7
|
+
[](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
|
|
7
8
|
|
|
8
9
|
> **Declarative web apps in XML, with AI and RAG built into the language.
|
|
9
10
|
> No build chain, no JavaScript, no frontend framework.**
|
|
@@ -81,6 +82,9 @@ coercion of the model's arguments are the runtime's job.
|
|
|
81
82
|
</q:component>
|
|
82
83
|
```
|
|
83
84
|
|
|
85
|
+
Save it as `components/orders.q`, run `quantum start`, and it is served at
|
|
86
|
+
`http://localhost:8080/orders`.
|
|
87
|
+
|
|
84
88
|
`q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
|
|
85
89
|
enforced by the parser, not by discipline.
|
|
86
90
|
|
|
@@ -92,14 +96,22 @@ Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
|
|
|
92
96
|
|
|
93
97
|
## Quick start
|
|
94
98
|
|
|
95
|
-
**Requirements:** Python 3.
|
|
99
|
+
**Requirements:** Python 3.12+ and `pip`.
|
|
96
100
|
|
|
97
101
|
```bash
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
pip install -e ".[dev]"
|
|
102
|
+
pip install quantum-framework
|
|
103
|
+
```
|
|
101
104
|
|
|
102
|
-
|
|
105
|
+
Create `hello.q`:
|
|
106
|
+
|
|
107
|
+
```xml
|
|
108
|
+
<q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
|
|
109
|
+
<q:return value="Hello World!" />
|
|
110
|
+
</q:component>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
quantum run hello.q
|
|
103
115
|
```
|
|
104
116
|
|
|
105
117
|
```
|
|
@@ -107,17 +119,21 @@ quantum run examples/hello.q
|
|
|
107
119
|
[SUCCESS] Result: Hello World!
|
|
108
120
|
```
|
|
109
121
|
|
|
122
|
+
For a web app, put `.q` files in `components/` and run `quantum start`
|
|
123
|
+
(`components/index.q` is served at `/`). `quantum stop` stops it.
|
|
124
|
+
|
|
110
125
|
For the AI examples you also need an [Ollama](https://ollama.com) server and the RAG
|
|
111
126
|
extra:
|
|
112
127
|
|
|
113
128
|
```bash
|
|
114
|
-
pip install -
|
|
129
|
+
pip install "quantum-framework[rag]"
|
|
115
130
|
ollama pull phi3 && ollama pull nomic-embed-text
|
|
116
131
|
export QUANTUM_LLM_BASE_URL=http://localhost:11434
|
|
117
132
|
```
|
|
118
133
|
|
|
119
|
-
Declare datasources in `quantum.config.yaml` and `q:query` works
|
|
120
|
-
running
|
|
134
|
+
Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
|
|
135
|
+
with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
|
|
136
|
+
`pip install "quantum-framework[db]"`:
|
|
121
137
|
|
|
122
138
|
```yaml
|
|
123
139
|
datasources:
|
|
@@ -131,26 +147,41 @@ datasources:
|
|
|
131
147
|
| Command | What it does |
|
|
132
148
|
|---------|--------------|
|
|
133
149
|
| `run <file.q>` | Execute a component, app, or API |
|
|
134
|
-
| `start` | Start the web server |
|
|
135
|
-
| `
|
|
150
|
+
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
151
|
+
| `stop` | Stop the server started by `start` |
|
|
152
|
+
| `deploy [path]` · `apps` | Deploy an application, manage deployed ones |
|
|
136
153
|
| `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
|
|
137
154
|
|
|
155
|
+
### From source
|
|
156
|
+
|
|
157
|
+
To work on Quantum itself:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
git clone https://github.com/danielgregorio/quantum.git
|
|
161
|
+
cd quantum
|
|
162
|
+
pip install -e ".[dev]"
|
|
163
|
+
quantum run examples/hello.q
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
|
|
167
|
+
|
|
138
168
|
---
|
|
139
169
|
|
|
140
170
|
## Documentation
|
|
141
171
|
|
|
142
|
-
Full docs
|
|
143
|
-
|
|
172
|
+
Full docs at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)**:
|
|
173
|
+
|
|
174
|
+
- [Getting Started](https://danielgregorio.github.io/quantum/guide/getting-started) · [Installation](https://danielgregorio.github.io/quantum/guide/installation) · [Quick Start](https://danielgregorio.github.io/quantum/guide/quick-start)
|
|
175
|
+
- [Components](https://danielgregorio.github.io/quantum/guide/components) · [State](https://danielgregorio.github.io/quantum/guide/state-management) · [Loops](https://danielgregorio.github.io/quantum/guide/loops) · [Conditionals](https://danielgregorio.github.io/quantum/guide/conditionals)
|
|
176
|
+
- [Queries](https://danielgregorio.github.io/quantum/guide/query) · [Functions](https://danielgregorio.github.io/quantum/guide/functions) · [Data fetching](https://danielgregorio.github.io/quantum/guide/data-fetching)
|
|
144
177
|
|
|
145
|
-
|
|
146
|
-
- [Components](docs/guide/components.md) · [State](docs/guide/state-management.md) · [Loops](docs/guide/loops.md) · [Conditionals](docs/guide/conditionals.md)
|
|
147
|
-
- [Queries](docs/guide/query.md) · [Functions](docs/guide/functions.md) · [Data fetching](docs/guide/data-fetching.md)
|
|
178
|
+
Releases and their notes are on the [GitHub Releases](https://github.com/danielgregorio/quantum/releases) page.
|
|
148
179
|
|
|
149
180
|
---
|
|
150
181
|
|
|
151
182
|
## Stability
|
|
152
183
|
|
|
153
|
-
Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short version:
|
|
184
|
+
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
154
185
|
|
|
155
186
|
| Surface | Status |
|
|
156
187
|
|---------|--------|
|
|
@@ -158,13 +189,11 @@ Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short ve
|
|
|
158
189
|
| AI — `q:llm`, `q:knowledge`, `q:agent` | **Beta** — validated end-to-end against a live Ollama server |
|
|
159
190
|
| `q:team` (multi-agent handoff) | Beta, less exercised |
|
|
160
191
|
| Jobs, messaging, websockets, mail, file uploads, `ui:*`, terminal target | **Experimental** — they run, but no API stability promise |
|
|
161
|
-
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](SECURITY.md) |
|
|
192
|
+
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) |
|
|
162
193
|
|
|
163
194
|
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
164
|
-
end-to-end despite being documented as complete.
|
|
165
|
-
|
|
166
|
-
[`AUDIT_FIX_PLAN.md`](AUDIT_FIX_PLAN.md). Feature status is now verified by execution
|
|
167
|
-
rather than asserted by hand.
|
|
195
|
+
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
196
|
+
feature status is now verified by execution rather than asserted by hand.
|
|
168
197
|
|
|
169
198
|
Pre-1.0: APIs may change between minor versions.
|
|
170
199
|
|
|
@@ -179,24 +208,24 @@ quantum/
|
|
|
179
208
|
│ ├── runtime/ # Execution engine, web server, renderer
|
|
180
209
|
│ └── cli/ # Command-line entry point
|
|
181
210
|
├── examples/ # runnable .q examples
|
|
182
|
-
├── tests/ # pytest suite (~
|
|
211
|
+
├── tests/ # pytest suite (~3.8k tests)
|
|
183
212
|
├── scripts/ # dev tools
|
|
184
213
|
└── docs/ # VitePress documentation
|
|
185
214
|
```
|
|
186
215
|
|
|
187
216
|
Adding a tag is one parser + one executor + a registry entry — see
|
|
188
|
-
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
217
|
+
[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
|
|
189
218
|
|
|
190
219
|
---
|
|
191
220
|
|
|
192
221
|
## Contributing
|
|
193
222
|
|
|
194
|
-
Read **[CONTRIBUTING.md](CONTRIBUTING.md)** for dev setup and how the modular
|
|
223
|
+
Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
|
|
195
224
|
parser/executor architecture works. By participating you agree to the
|
|
196
|
-
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
225
|
+
[Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
|
|
197
226
|
|
|
198
|
-
Found a security issue? Follow [SECURITY.md](SECURITY.md) — **do not** open a public issue.
|
|
227
|
+
Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
|
|
199
228
|
|
|
200
229
|
## License
|
|
201
230
|
|
|
202
|
-
MIT — see [LICENSE](LICENSE).
|
|
231
|
+
MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quantum-framework"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.10.0"
|
|
8
8
|
description = "Full-stack declarative framework for building web, desktop, and mobile applications"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -60,8 +60,9 @@ websocket = [
|
|
|
60
60
|
quantum = "quantum.cli.runner:main"
|
|
61
61
|
|
|
62
62
|
[project.urls]
|
|
63
|
-
Homepage = "https://quantum
|
|
64
|
-
Documentation = "https://
|
|
63
|
+
Homepage = "https://github.com/danielgregorio/quantum"
|
|
64
|
+
Documentation = "https://danielgregorio.github.io/quantum/"
|
|
65
|
+
Changelog = "https://github.com/danielgregorio/quantum/releases"
|
|
65
66
|
Repository = "https://github.com/danielgregorio/quantum"
|
|
66
67
|
|
|
67
68
|
[tool.setuptools.packages.find]
|
|
@@ -175,6 +175,9 @@ class QuantumRunner:
|
|
|
175
175
|
for route in app.routes:
|
|
176
176
|
print(f" {route.method} {route.path}")
|
|
177
177
|
|
|
178
|
+
from quantum.core.tiers import warn_app_type
|
|
179
|
+
warn_app_type(app.app_type)
|
|
180
|
+
|
|
178
181
|
if app.app_type == 'game':
|
|
179
182
|
return self._build_game(app, debug)
|
|
180
183
|
elif app.app_type == 'terminal':
|
|
@@ -118,7 +118,41 @@ def _round(v: Any, digits: int = 0) -> Any:
|
|
|
118
118
|
return int(result) if digits == 0 else result
|
|
119
119
|
|
|
120
120
|
|
|
121
|
+
# -- passwords ---------------------------------------------------------------
|
|
122
|
+
#
|
|
123
|
+
# Authentication is Core (decision D4), and a login is "look the user up, then
|
|
124
|
+
# check the password". Without these, a .q could not check a password against
|
|
125
|
+
# a stored hash without q:python — so every login example just set
|
|
126
|
+
# session.authenticated=true for whoever submitted the form (gap AUTH-1).
|
|
127
|
+
|
|
128
|
+
def hash_password(password: Any) -> str:
|
|
129
|
+
"""bcrypt hash of a password, for storing. Never store the password itself."""
|
|
130
|
+
import bcrypt
|
|
131
|
+
if password is None or password == '':
|
|
132
|
+
raise ValueError("hashPassword: the password is empty")
|
|
133
|
+
return bcrypt.hashpw(str(password).encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def verify_password(password: Any, hashed: Any) -> bool:
|
|
137
|
+
"""True when `password` matches a hash made by hashPassword.
|
|
138
|
+
|
|
139
|
+
Fail-closed: an empty password, a missing hash or a malformed hash is
|
|
140
|
+
False, never an error — so `q:if condition="verifyPassword(senha, h)"`
|
|
141
|
+
cannot be tricked into the true branch by bad data.
|
|
142
|
+
"""
|
|
143
|
+
import bcrypt
|
|
144
|
+
if not password or not hashed or not isinstance(hashed, str):
|
|
145
|
+
return False
|
|
146
|
+
try:
|
|
147
|
+
return bcrypt.checkpw(str(password).encode('utf-8'), hashed.encode('utf-8'))
|
|
148
|
+
except (ValueError, TypeError):
|
|
149
|
+
return False
|
|
150
|
+
|
|
151
|
+
|
|
121
152
|
STDLIB = {
|
|
153
|
+
# passwords
|
|
154
|
+
'hashPassword': hash_password,
|
|
155
|
+
'verifyPassword': verify_password,
|
|
122
156
|
# dates
|
|
123
157
|
'now': now,
|
|
124
158
|
'dateAdd': date_add,
|
|
@@ -241,7 +241,7 @@ class DataImportService:
|
|
|
241
241
|
data.append(record)
|
|
242
242
|
|
|
243
243
|
return DataResult(
|
|
244
|
-
success=False,
|
|
244
|
+
success=True, # was False: every XML import "failed", so no transform ran on it
|
|
245
245
|
data=data,
|
|
246
246
|
recordCount=len(data),
|
|
247
247
|
source=source
|
|
@@ -385,7 +385,7 @@ class DataImportService:
|
|
|
385
385
|
"""Compute derived field"""
|
|
386
386
|
field = compute_op.get('field')
|
|
387
387
|
expression = compute_op.get('expression')
|
|
388
|
-
comp_type = compute_op.get('
|
|
388
|
+
comp_type = compute_op.get('comp_type', 'string')
|
|
389
389
|
|
|
390
390
|
if not field or not expression:
|
|
391
391
|
return data
|
|
@@ -482,23 +482,18 @@ class DataImportService:
|
|
|
482
482
|
if xpath == 'text()':
|
|
483
483
|
return node.text
|
|
484
484
|
|
|
485
|
-
#
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
elif xpath.endswith('/@'):
|
|
491
|
-
# Extract attribute from child
|
|
492
|
-
parts = xpath.rsplit('/@', 1)
|
|
493
|
-
if len(parts) == 2:
|
|
494
|
-
child_path, attr = parts
|
|
495
|
-
child_elem = node.find(child_path)
|
|
496
|
-
if child_elem is not None:
|
|
497
|
-
return child_elem.get(attr)
|
|
498
|
-
else:
|
|
499
|
-
return child.text
|
|
485
|
+
# child/@attr — ElementTree's find() does not understand the @ step.
|
|
486
|
+
if '/@' in xpath:
|
|
487
|
+
child_path, attr = xpath.rsplit('/@', 1)
|
|
488
|
+
child = node.find(child_path)
|
|
489
|
+
return child.get(attr) if child is not None else None
|
|
500
490
|
|
|
501
|
-
|
|
491
|
+
# child/text() — nor text(); it raised SyntaxError on every such field.
|
|
492
|
+
if xpath.endswith('/text()'):
|
|
493
|
+
xpath = xpath[:-len('/text()')]
|
|
494
|
+
|
|
495
|
+
child = node.find(xpath)
|
|
496
|
+
return child.text if child is not None else None
|
|
502
497
|
|
|
503
498
|
def _evaluate_condition(self, condition: str, record: Dict[str, Any], context: Any) -> bool:
|
|
504
499
|
"""Evaluate a q:data filter condition against one imported record.
|
{quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/data_parser.py
RENAMED
|
@@ -125,12 +125,15 @@ class DataParser(BaseTagParser):
|
|
|
125
125
|
def _parse_field(self, element: ET.Element) -> FieldNode:
|
|
126
126
|
"""Parse q:field for JSON/XML."""
|
|
127
127
|
name = self.get_attr(element, 'name')
|
|
128
|
-
|
|
128
|
+
# `xpath` is the attribute every example and the reference use; only
|
|
129
|
+
# `path` was read, so `xpath="@id"` became the name "id" and `type` was
|
|
130
|
+
# dropped — attributes came back None and numbers came back as text.
|
|
131
|
+
path = self.get_attr(element, 'xpath') or self.get_attr(element, 'path')
|
|
129
132
|
|
|
130
133
|
if not name:
|
|
131
134
|
raise ParserError("Field requires 'name' attribute")
|
|
132
135
|
|
|
133
|
-
return FieldNode(name, path or name)
|
|
136
|
+
return FieldNode(name, path or name, self.get_attr(element, 'type') or 'string')
|
|
134
137
|
|
|
135
138
|
def _parse_transform(self, element: ET.Element) -> TransformNode:
|
|
136
139
|
"""Parse q:transform — a container of operations.
|
|
@@ -38,6 +38,28 @@ EXPERIMENTAL = frozenset({
|
|
|
38
38
|
|
|
39
39
|
SUPPORTED = CORE | DIFERENCIAL
|
|
40
40
|
|
|
41
|
+
# Authentication is Core too (decision D4, 2026-09-10), but it is not a tag:
|
|
42
|
+
# it is the require_auth / require_role attributes of q:component plus the
|
|
43
|
+
# session scope. Listed here so the surface is complete in one place.
|
|
44
|
+
CORE_ATTRIBUTES = frozenset({"require_auth", "require_role"})
|
|
45
|
+
|
|
46
|
+
# Application types, by tier. A q:application's type decides which engine
|
|
47
|
+
# runs it, so the tier of the type is the tier of the whole app.
|
|
48
|
+
#
|
|
49
|
+
# LABORATORIO (decision D1/D2): the 2D game engine (qg:, including the Godot
|
|
50
|
+
# codegen) stays in the repository on purpose — games press on the language
|
|
51
|
+
# and surface features and bugs the core needs — but it carries no stability
|
|
52
|
+
# promise and is not part of the pitch. Its tests run in the main suite, so a
|
|
53
|
+
# core change that breaks a game shows up in CI.
|
|
54
|
+
LAB_APP_TYPES = frozenset({"game"})
|
|
55
|
+
# "html" and "api" are experimental too, measured 2026-09-10: `quantum run` on a
|
|
56
|
+
# type="html" application fails at once (gap G17), and the type="api" server
|
|
57
|
+
# never executes a route's body — it serves the literal text of the first
|
|
58
|
+
# q:return (gap G18). The supported way to build a web app is pages in
|
|
59
|
+
# components/ served by `quantum start`, which runs no q:application at all.
|
|
60
|
+
EXPERIMENTAL_APP_TYPES = frozenset({"terminal", "ui", "testing", "microservices",
|
|
61
|
+
"html", "api"})
|
|
62
|
+
|
|
41
63
|
|
|
42
64
|
def tier_of(tag_name: str) -> str:
|
|
43
65
|
"""'core' | 'diferencial' | 'experimental' | 'unknown'."""
|
|
@@ -77,6 +99,36 @@ def warn_if_unsupported(tag_name: str) -> None:
|
|
|
77
99
|
)
|
|
78
100
|
|
|
79
101
|
|
|
102
|
+
def app_tier_of(app_type: str) -> str:
|
|
103
|
+
"""'laboratorio' | 'experimental' | 'supported' for a q:application type."""
|
|
104
|
+
if app_type in LAB_APP_TYPES:
|
|
105
|
+
return "laboratorio"
|
|
106
|
+
if app_type in EXPERIMENTAL_APP_TYPES:
|
|
107
|
+
return "experimental"
|
|
108
|
+
return "supported"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def warn_app_type(app_type: str) -> None:
|
|
112
|
+
"""One-time warning when an application of a non-supported type runs."""
|
|
113
|
+
tier = app_tier_of(app_type)
|
|
114
|
+
key = f"application:{app_type}"
|
|
115
|
+
if tier == "supported" or key in _warned:
|
|
116
|
+
return
|
|
117
|
+
_warned.add(key)
|
|
118
|
+
if tier == "laboratorio":
|
|
119
|
+
logger.warning(
|
|
120
|
+
"q:application type=%r is LABORATÓRIO — it exists to press on the "
|
|
121
|
+
"language, with no stability promise (SUPPORT_TIERS.md). It may "
|
|
122
|
+
"change or break without notice.", app_type
|
|
123
|
+
)
|
|
124
|
+
else:
|
|
125
|
+
logger.warning(
|
|
126
|
+
"q:application type=%r is EXPERIMENTAL — not covered by the "
|
|
127
|
+
"supported surface (SUPPORT_TIERS.md). It may change or break "
|
|
128
|
+
"without notice; do not rely on it in production.", app_type
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
80
132
|
def reset_warnings() -> None:
|
|
81
133
|
"""For tests, and for a reloading server."""
|
|
82
134
|
_warned.clear()
|
{quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/data_executor.py
RENAMED
|
@@ -119,7 +119,10 @@ class DataExecutor(BaseExecutor):
|
|
|
119
119
|
elif hasattr(operation, 'field'):
|
|
120
120
|
op_dict['field'] = operation.field
|
|
121
121
|
op_dict['expression'] = operation.expression
|
|
122
|
-
|
|
122
|
+
# Not 'type': that key names the operation ('compute').
|
|
123
|
+
# Writing the result type over it made every q:compute
|
|
124
|
+
# unrecognised, and the transformation was skipped.
|
|
125
|
+
op_dict['comp_type'] = operation.comp_type
|
|
123
126
|
|
|
124
127
|
params['transforms'].append(op_dict)
|
|
125
128
|
|