quantum-framework 0.14.0__tar.gz → 0.16.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.14.0/quantum_framework.egg-info → quantum_framework-0.16.0}/PKG-INFO +3 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/pyproject.toml +5 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/build.py +4 -7
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/migrate.py +2 -2
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/new.py +1 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/deploy.py +1 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/mq.py +2 -2
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/runner.py +22 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/utils.py +1 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/ast_nodes.py +1 -1
- quantum_framework-0.16.0/quantum/core/docs_links.py +8 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/state_management/src/ast_node.py +0 -107
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/ui_engine/src/ast_nodes.py +34 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/ui_engine/src/parser.py +38 -5
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parser.py +34 -19
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/control_flow/set_parser.py +10 -11
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/tiers.py +20 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/action_handler.py +2 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/component.py +3 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/control_flow/if_executor.py +2 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/control_flow/loop_executor.py +2 -1
- quantum_framework-0.16.0/quantum/runtime/local_server.py +28 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/renderer.py +19 -10
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_builder.py +50 -21
- quantum_framework-0.16.0/quantum/runtime/ui_console.py +360 -0
- quantum_framework-0.16.0/quantum/runtime/ui_desktop.py +56 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_html_adapter.py +75 -199
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_html_templates.py +56 -247
- quantum_framework-0.16.0/quantum/runtime/ui_page_renderer.py +226 -0
- quantum_framework-0.16.0/quantum/runtime/ui_view.py +155 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/web_server.py +20 -3
- {quantum_framework-0.14.0 → quantum_framework-0.16.0/quantum_framework.egg-info}/PKG-INFO +3 -1
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_framework.egg-info/SOURCES.txt +6 -6
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_framework.egg-info/requires.txt +3 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_cli_commands.py +4 -5
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_ui_html_adapter.py +0 -25
- quantum_framework-0.14.0/quantum/core/parsers/persistence/__init__.py +0 -9
- quantum_framework-0.14.0/quantum/core/parsers/persistence/persist_parser.py +0 -64
- quantum_framework-0.14.0/quantum/runtime/ui_desktop_adapter.py +0 -1730
- quantum_framework-0.14.0/quantum/runtime/ui_desktop_templates.py +0 -307
- quantum_framework-0.14.0/tests/test_desktop_bridge.py +0 -442
- quantum_framework-0.14.0/tests/test_state_persistence.py +0 -458
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/LICENSE +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/README.md +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/admin.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/dev.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/docs.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/lint.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/serve.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/commands/test.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/hot_reload.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/jobs.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/pkg.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/cli/server_process.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/base_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/cli.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/expression_transformer.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/javascript/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/javascript/generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/optimizer.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/python/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/python/generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/python/runtime.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/compiler/transpiler.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/config_env.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/expression_diagnostics.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/expression_stdlib.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/expressions.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/agents/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/agents/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/conditionals/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/conditionals/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/data_import/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/data_import/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/data_import/src/runtime.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/dump/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/dump/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/dump/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/dump/src/runtime.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/functions/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/functions/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/game_engine_2d/src/ast_nodes.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/game_engine_2d/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/invocation/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/invocation/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/invocation/src/runtime.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/knowledge_base/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/knowledge_base/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/logging/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/logging/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/logging/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/logging/src/runtime.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/loops/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/loops/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/query/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/query/src/query_validators.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/state_management/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/terminal_engine/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/testing_engine/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/testing_engine/src/ast_nodes.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/testing_engine/src/parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/theming/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/theming/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/theming/src/presets.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/ui_engine/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/websocket/src/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/websocket/src/ast_node.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/guards.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/html_compat.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parser_registry.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/ai/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/ai/agent_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/ai/knowledge_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/ai/llm_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/ai/team_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/base.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/composition/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/composition/import_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/composition/slot_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/control_flow/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/control_flow/if_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/control_flow/loop_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/data/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/data/data_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/data/invoke_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/data/query_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/data/transaction_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/events/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/forms/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/forms/action_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/forms/flash_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/forms/redirect_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/functions/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/functions/function_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/functions/param_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/functions/return_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/html/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/html/component_call_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/html/html_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/jobs/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/jobs/job_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/jobs/thread_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/message_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/queue_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/routing/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/routing/route_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/scripting/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/scripting/python_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/services/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/services/dump_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/services/file_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/services/log_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/parsers/services/mail_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/packages/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/packages/manager.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/packages/manifest.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/packages/registry.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/packages/resolver.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/plugins/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/plugins/hooks.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/plugins/loader.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/plugins/manifest.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/plugins/registry.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/adapters/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/adapters/memory_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/adapters/rabbitmq_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/adapters/redis_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/agent_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ast_cache.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/auth_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/component_composer.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/component_resolver.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/conditions.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/database_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/email_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/error_handler.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/execution_context.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executor_registry.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/ai/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/ai/agent_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/ai/knowledge_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/ai/llm_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/ai/team_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/base.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/control_flow/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/control_flow/redirect_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/control_flow/set_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/data/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/data/data_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/data/invoke_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/data/query_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/data/transaction_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/jobs/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/jobs/job_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/messaging/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/messaging/message_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/messaging/websocket_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/scripting/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/scripting/pyclass_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/scripting/pyimport_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/scripting/python_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/services/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/services/dump_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/services/file_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/services/log_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/executors/services/mail_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/expression_cache.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/file_upload_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/function_registry.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/game_builder.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/game_code_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/game_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/godot_code_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/godot_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/job_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/knowledge_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/llm_cache.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/llm_providers.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/llm_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/logging_setup.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/message_broker.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/message_queue_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/param_validation.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/pypy_compat.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/python_bridge.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/query_validators.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/service_container.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/terminal_builder.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/terminal_code_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/terminal_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/testing_builder.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/testing_code_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/testing_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_mobile_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_mobile_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_textual_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_textual_templates.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_tokens.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/ui_validator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/validators.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/websocket_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/websocket_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/websocket_transport.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/runtime/wsgi.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/services.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/utils/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/assets/quantum-admin-connectors.js +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/assets/quantum-admin.css +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/assets/quantum-source-highlight.js +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/audit_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/auth_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/component_discovery.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/config_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/connector_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/crud.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/database.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/db_setup_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/deploy_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/docker_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/environment_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/git_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/health_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/job_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/log_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/main.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/models.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/pipeline_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/resource_manager.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/schemas.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/secret_manager.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/settings_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/template_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/test_execution_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/test_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/webhook_service.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/backend/websocket_manager.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/_layout/AdminShell.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/agents.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/app/[name].q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/applications.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/component/[...path].q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/components.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/connectors.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/dashboard.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/database.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/features.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/index.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/jobs.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/login.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/logout.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/settings.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/source.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/components/admin/tests.q +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/run.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/__init__.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/_base.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/_component_test_generator.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/_yaml_editor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/apps.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/auth.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/components.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/connectors.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/projects.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/repository.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/settings.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_admin/services/yaml_import.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_framework.egg-info/dependency_links.txt +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_framework.egg-info/entry_points.txt +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum_framework.egg-info/top_level.txt +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/setup.cfg +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_agent.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_animations.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_ast_cache.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_component_library.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_expression_cache.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_form_validation.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_game_codegen.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_game_e2e.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_game_engine.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_game_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_godot_codegen.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_job_executor.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_llm_providers.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_message_broker.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_message_queue.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_mobile_target.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_multi_agent.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_packages.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_plugins.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_pypy_compat.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_python_scripting.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_terminal_codegen.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_terminal_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_testing_codegen.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_testing_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_theming.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_ui_parity.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_ui_parser.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_ui_textual_adapter.py +0 -0
- {quantum_framework-0.14.0 → quantum_framework-0.16.0}/tests/test_websocket.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantum-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.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
|
|
@@ -42,6 +42,8 @@ Provides-Extra: admin
|
|
|
42
42
|
Requires-Dist: sqlalchemy>=2.0; extra == "admin"
|
|
43
43
|
Requires-Dist: PyJWT>=2.8; extra == "admin"
|
|
44
44
|
Requires-Dist: cryptography>=42.0; extra == "admin"
|
|
45
|
+
Provides-Extra: desktop
|
|
46
|
+
Requires-Dist: pywebview>=5.0; extra == "desktop"
|
|
45
47
|
Provides-Extra: websocket
|
|
46
48
|
Requires-Dist: websockets>=12.0; extra == "websocket"
|
|
47
49
|
Dynamic: license-file
|
|
@@ -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.16.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"}
|
|
@@ -58,6 +58,10 @@ admin = [
|
|
|
58
58
|
"PyJWT>=2.8",
|
|
59
59
|
"cryptography>=42.0",
|
|
60
60
|
]
|
|
61
|
+
desktop = [
|
|
62
|
+
# `quantum desktop`: the native window around the application's server.
|
|
63
|
+
"pywebview>=5.0",
|
|
64
|
+
]
|
|
61
65
|
websocket = [
|
|
62
66
|
# The transport behind q:websocket. Without it the tag registers a
|
|
63
67
|
# connection and opens nothing — and says so, rather than pretending.
|
|
@@ -16,12 +16,12 @@ from quantum.cli.utils import get_console, find_project_root, find_q_files
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
# Available build targets
|
|
19
|
-
TARGETS = ['html', '
|
|
19
|
+
TARGETS = ['html', 'mobile', 'textual', 'all']
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
@click.command('build')
|
|
23
23
|
@click.option('--target', '-t', type=click.Choice(TARGETS), default='html',
|
|
24
|
-
help='Build target (html,
|
|
24
|
+
help='Build target (html, mobile, textual, all)')
|
|
25
25
|
@click.option('--output', '-o', type=click.Path(), default='./dist',
|
|
26
26
|
help='Output directory')
|
|
27
27
|
@click.option('--minify', is_flag=True, default=True, help='Minify output')
|
|
@@ -53,8 +53,6 @@ def build(
|
|
|
53
53
|
|
|
54
54
|
quantum build
|
|
55
55
|
|
|
56
|
-
quantum build --target desktop
|
|
57
|
-
|
|
58
56
|
quantum build --target all --output ./build
|
|
59
57
|
|
|
60
58
|
quantum build --target mobile --no-minify
|
|
@@ -98,7 +96,7 @@ def build(
|
|
|
98
96
|
|
|
99
97
|
# Determine targets to build
|
|
100
98
|
if target == 'all':
|
|
101
|
-
targets_to_build = ['html', '
|
|
99
|
+
targets_to_build = ['html', 'mobile', 'textual']
|
|
102
100
|
else:
|
|
103
101
|
targets_to_build = [target]
|
|
104
102
|
|
|
@@ -247,12 +245,11 @@ def _build_application(
|
|
|
247
245
|
from quantum.runtime.testing_builder import TestingBuilder
|
|
248
246
|
builder = TestingBuilder()
|
|
249
247
|
ext = '.py'
|
|
250
|
-
elif app_type == 'ui' or target in ('html', '
|
|
248
|
+
elif app_type == 'ui' or target in ('html', 'mobile', 'textual'):
|
|
251
249
|
builder = UIBuilder()
|
|
252
250
|
# Map target to extension
|
|
253
251
|
ext_map = {
|
|
254
252
|
'html': '.html',
|
|
255
|
-
'desktop': '.py',
|
|
256
253
|
'mobile': '.js',
|
|
257
254
|
'textual': '.py',
|
|
258
255
|
}
|
|
@@ -32,7 +32,7 @@ class Migration:
|
|
|
32
32
|
@property
|
|
33
33
|
def content(self) -> str:
|
|
34
34
|
if self._content is None:
|
|
35
|
-
self._content = self.path.read_text()
|
|
35
|
+
self._content = self.path.read_text(encoding="utf-8") # DB-8: nunca a codificacao do sistema
|
|
36
36
|
return self._content
|
|
37
37
|
|
|
38
38
|
@property
|
|
@@ -378,7 +378,7 @@ class MigrationRunner:
|
|
|
378
378
|
click.echo(f"Rolling back {version}: {migration_info['name']}...")
|
|
379
379
|
|
|
380
380
|
# Execute rollback SQL
|
|
381
|
-
self.db.execute_script(down_file.read_text())
|
|
381
|
+
self.db.execute_script(down_file.read_text(encoding="utf-8"))
|
|
382
382
|
|
|
383
383
|
# Remove migration record
|
|
384
384
|
self._remove_migration_record(version)
|
|
@@ -443,7 +443,7 @@ def _create_api_template(project_dir: Path, project_name: str) -> None:
|
|
|
443
443
|
|
|
444
444
|
# Update config for API
|
|
445
445
|
config_path = project_dir / 'quantum.config.yaml'
|
|
446
|
-
config = config_path.read_text()
|
|
446
|
+
config = config_path.read_text(encoding="utf-8")
|
|
447
447
|
config = config.replace('type: api', 'type: microservices')
|
|
448
448
|
config_path.write_text(config)
|
|
449
449
|
|
|
@@ -114,7 +114,7 @@ class QuantumDeployer:
|
|
|
114
114
|
"""Load configuration from file."""
|
|
115
115
|
config_file = Path(config_path)
|
|
116
116
|
if config_file.exists():
|
|
117
|
-
with open(config_file) as f:
|
|
117
|
+
with open(config_file, encoding='utf-8') as f:
|
|
118
118
|
return yaml.safe_load(f) or {}
|
|
119
119
|
return {}
|
|
120
120
|
|
|
@@ -353,7 +353,7 @@ def _handle_mq_publish(broker, args) -> int:
|
|
|
353
353
|
|
|
354
354
|
# Get message body
|
|
355
355
|
if args.file:
|
|
356
|
-
with open(args.file, 'r') as f:
|
|
356
|
+
with open(args.file, 'r', encoding='utf-8') as f:
|
|
357
357
|
body = f.read()
|
|
358
358
|
elif args.message:
|
|
359
359
|
body = args.message
|
|
@@ -388,7 +388,7 @@ def _handle_mq_send(broker, args) -> int:
|
|
|
388
388
|
|
|
389
389
|
# Get message body
|
|
390
390
|
if args.file:
|
|
391
|
-
with open(args.file, 'r') as f:
|
|
391
|
+
with open(args.file, 'r', encoding='utf-8') as f:
|
|
392
392
|
body = f.read()
|
|
393
393
|
elif args.message:
|
|
394
394
|
body = args.message
|
|
@@ -285,6 +285,8 @@ Examples:
|
|
|
285
285
|
quantum start # Start web server (magic!)
|
|
286
286
|
quantum run hello.q # Execute component
|
|
287
287
|
quantum admin # Start the Quantum Admin
|
|
288
|
+
quantum console # The application's pages in the terminal
|
|
289
|
+
quantum desktop # The application's pages in a desktop window
|
|
288
290
|
quantum run game.q --engine godot # Build Godot 4 project
|
|
289
291
|
quantum run backup-job.q # Execute job
|
|
290
292
|
quantum deploy ./my-app # Deploy application
|
|
@@ -335,6 +337,18 @@ Examples:
|
|
|
335
337
|
# Stop command
|
|
336
338
|
subparsers.add_parser('stop', help='Stop running web server')
|
|
337
339
|
|
|
340
|
+
# Console: the application's pages in the terminal (UI-3)
|
|
341
|
+
console_parser = subparsers.add_parser('console', help="Open the application's pages in the terminal")
|
|
342
|
+
console_parser.add_argument('path', nargs='?', default='/', help='Page to open (default: /)')
|
|
343
|
+
console_parser.add_argument('--config', default='quantum.config.yaml', help='Config file')
|
|
344
|
+
|
|
345
|
+
# Desktop: the application's pages in a native window (UI-4)
|
|
346
|
+
desktop_parser = subparsers.add_parser('desktop', help="Open the application's pages in a desktop window")
|
|
347
|
+
desktop_parser.add_argument('path', nargs='?', default='/', help='Page to open (default: /)')
|
|
348
|
+
desktop_parser.add_argument('--config', default='quantum.config.yaml', help='Config file')
|
|
349
|
+
desktop_parser.add_argument('--width', type=int, default=1024, help='Window width (default: 1024)')
|
|
350
|
+
desktop_parser.add_argument('--height', type=int, default=720, help='Window height (default: 720)')
|
|
351
|
+
|
|
338
352
|
# Admin command (the screens need the [admin] extra; checked when run)
|
|
339
353
|
from quantum.cli.admin import create_admin_parser
|
|
340
354
|
create_admin_parser(subparsers)
|
|
@@ -401,6 +415,14 @@ Examples:
|
|
|
401
415
|
traceback.print_exc()
|
|
402
416
|
sys.exit(1)
|
|
403
417
|
|
|
418
|
+
elif args.command == 'console':
|
|
419
|
+
from quantum.runtime.ui_console import run_console
|
|
420
|
+
sys.exit(run_console(args.config, args.path))
|
|
421
|
+
|
|
422
|
+
elif args.command == 'desktop':
|
|
423
|
+
from quantum.runtime.ui_desktop import run_desktop
|
|
424
|
+
sys.exit(run_desktop(args.config, args.path, width=args.width, height=args.height))
|
|
425
|
+
|
|
404
426
|
elif args.command == 'admin':
|
|
405
427
|
from quantum.cli.admin import handle_admin
|
|
406
428
|
sys.exit(handle_admin(args))
|
|
@@ -307,7 +307,7 @@ def get_quantum_version() -> str:
|
|
|
307
307
|
# Try to read from version file
|
|
308
308
|
version_file = Path(__file__).parent.parent / '__version__.py'
|
|
309
309
|
if version_file.exists():
|
|
310
|
-
content = version_file.read_text()
|
|
310
|
+
content = version_file.read_text(encoding="utf-8")
|
|
311
311
|
# Parse version = "x.y.z"
|
|
312
312
|
for line in content.splitlines():
|
|
313
313
|
if line.startswith('version'):
|
|
@@ -676,7 +676,7 @@ class OnEventNode(QuantumNode):
|
|
|
676
676
|
|
|
677
677
|
# MIGRATED: SetNode and PersistNode moved to feature-based structure
|
|
678
678
|
# Import from new location (Option C migration)
|
|
679
|
-
from .features.state_management.src.ast_node import SetNode
|
|
679
|
+
from .features.state_management.src.ast_node import SetNode
|
|
680
680
|
|
|
681
681
|
|
|
682
682
|
class QueryNode(QuantumNode):
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""Documentation pages that error messages point to (one place, one spelling)."""
|
|
2
|
+
|
|
3
|
+
DOCS = 'https://danielgregorio.github.io/quantum'
|
|
4
|
+
|
|
5
|
+
# EXEC-*: the order in which a page's parts run. The traps — a statement in
|
|
6
|
+
# the markup, a variable the action cannot see, a guard reading the page —
|
|
7
|
+
# all come from that order, so their messages send the reader here.
|
|
8
|
+
HOW_A_PAGE_RUNS = f'{DOCS}/guide/how-a-page-runs'
|
|
@@ -3,11 +3,6 @@ AST Node for State Management (q:set)
|
|
|
3
3
|
|
|
4
4
|
This module contains the SetNode class, which represents the <q:set> tag
|
|
5
5
|
for state management in Quantum Language.
|
|
6
|
-
|
|
7
|
-
State Persistence Support:
|
|
8
|
-
- persist="local" - localStorage (browser) or file (desktop)
|
|
9
|
-
- persist="session" - sessionStorage (browser) or memory (desktop)
|
|
10
|
-
- persist="sync" - synchronized across tabs/windows (browser) or network (desktop)
|
|
11
6
|
"""
|
|
12
7
|
|
|
13
8
|
from typing import Dict, Any, List, Optional
|
|
@@ -54,12 +49,6 @@ class SetNode(QuantumNode):
|
|
|
54
49
|
self.key = None
|
|
55
50
|
self.source = None
|
|
56
51
|
|
|
57
|
-
# State Persistence
|
|
58
|
-
self.persist: Optional[str] = None # None, "local", "session", "sync"
|
|
59
|
-
self.persist_key: Optional[str] = None # Custom storage key (defaults to name)
|
|
60
|
-
self.persist_encrypt: bool = False # Encrypt persisted data
|
|
61
|
-
self.persist_ttl: Optional[int] = None # TTL in seconds for cached persistence
|
|
62
|
-
|
|
63
52
|
def to_dict(self) -> Dict[str, Any]:
|
|
64
53
|
result = {
|
|
65
54
|
"type": "set",
|
|
@@ -84,14 +73,6 @@ class SetNode(QuantumNode):
|
|
|
84
73
|
"maxlength": self.maxlength
|
|
85
74
|
}
|
|
86
75
|
}
|
|
87
|
-
# Add persistence info if enabled
|
|
88
|
-
if self.persist:
|
|
89
|
-
result["persistence"] = {
|
|
90
|
-
"scope": self.persist,
|
|
91
|
-
"key": self.persist_key or self.name,
|
|
92
|
-
"encrypt": self.persist_encrypt,
|
|
93
|
-
"ttl": self.persist_ttl
|
|
94
|
-
}
|
|
95
76
|
return result
|
|
96
77
|
|
|
97
78
|
def validate(self) -> List[str]:
|
|
@@ -136,93 +117,5 @@ class SetNode(QuantumNode):
|
|
|
136
117
|
if self.maxlength and len(str(self.value)) > int(self.maxlength):
|
|
137
118
|
errors.append(f"Value length {len(str(self.value))} exceeds maxlength {self.maxlength}")
|
|
138
119
|
|
|
139
|
-
# Validar persist scope
|
|
140
|
-
if self.persist:
|
|
141
|
-
valid_persist_scopes = ['local', 'session', 'sync']
|
|
142
|
-
if self.persist not in valid_persist_scopes:
|
|
143
|
-
errors.append(f"Invalid persist scope: {self.persist}. Must be one of {valid_persist_scopes}")
|
|
144
|
-
|
|
145
|
-
return errors
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
class PersistNode(QuantumNode):
|
|
149
|
-
"""
|
|
150
|
-
Represents a <q:persist> - Explicit persistence configuration.
|
|
151
|
-
|
|
152
|
-
Allows fine-grained control over state persistence beyond the persist attribute on q:set.
|
|
153
|
-
|
|
154
|
-
Examples:
|
|
155
|
-
<q:persist scope="local" prefix="myapp_">
|
|
156
|
-
<q:var name="theme" />
|
|
157
|
-
<q:var name="locale" />
|
|
158
|
-
</q:persist>
|
|
159
|
-
|
|
160
|
-
<q:persist scope="sync" key="user_preferences" encrypt="true">
|
|
161
|
-
<q:var name="darkMode" />
|
|
162
|
-
<q:var name="fontSize" />
|
|
163
|
-
</q:persist>
|
|
164
|
-
|
|
165
|
-
Attributes:
|
|
166
|
-
scope: "local" (localStorage), "session" (sessionStorage), "sync" (cross-tab/network)
|
|
167
|
-
prefix: Optional prefix for all storage keys
|
|
168
|
-
key: If set, all vars are stored under this single key as an object
|
|
169
|
-
encrypt: Whether to encrypt persisted data
|
|
170
|
-
ttl: Time-to-live in seconds (for cache invalidation)
|
|
171
|
-
storage: Override storage backend ("localStorage", "indexedDB", "file", "db")
|
|
172
|
-
"""
|
|
173
|
-
|
|
174
|
-
def __init__(
|
|
175
|
-
self,
|
|
176
|
-
scope: str = "local",
|
|
177
|
-
prefix: Optional[str] = None,
|
|
178
|
-
key: Optional[str] = None,
|
|
179
|
-
encrypt: bool = False,
|
|
180
|
-
ttl: Optional[int] = None,
|
|
181
|
-
storage: Optional[str] = None
|
|
182
|
-
):
|
|
183
|
-
self.scope = scope
|
|
184
|
-
self.prefix = prefix
|
|
185
|
-
self.key = key
|
|
186
|
-
self.encrypt = encrypt
|
|
187
|
-
self.ttl = ttl
|
|
188
|
-
self.storage = storage
|
|
189
|
-
self.variables: List[str] = [] # List of variable names to persist
|
|
190
|
-
|
|
191
|
-
def add_variable(self, name: str):
|
|
192
|
-
"""Add a variable name to persist."""
|
|
193
|
-
self.variables.append(name)
|
|
194
|
-
|
|
195
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
196
|
-
return {
|
|
197
|
-
"type": "persist",
|
|
198
|
-
"scope": self.scope,
|
|
199
|
-
"prefix": self.prefix,
|
|
200
|
-
"key": self.key,
|
|
201
|
-
"encrypt": self.encrypt,
|
|
202
|
-
"ttl": self.ttl,
|
|
203
|
-
"storage": self.storage,
|
|
204
|
-
"variables": self.variables
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
def validate(self) -> List[str]:
|
|
208
|
-
errors = []
|
|
209
|
-
|
|
210
|
-
# Validate scope
|
|
211
|
-
valid_scopes = ['local', 'session', 'sync']
|
|
212
|
-
if self.scope not in valid_scopes:
|
|
213
|
-
errors.append(f"Invalid persist scope: {self.scope}. Must be one of {valid_scopes}")
|
|
214
|
-
|
|
215
|
-
# Validate storage backend if specified
|
|
216
|
-
if self.storage:
|
|
217
|
-
valid_storage = ['localStorage', 'sessionStorage', 'indexedDB', 'file', 'db']
|
|
218
|
-
if self.storage not in valid_storage:
|
|
219
|
-
errors.append(f"Invalid storage backend: {self.storage}. Must be one of {valid_storage}")
|
|
220
|
-
|
|
221
|
-
# Validate variables
|
|
222
|
-
if not self.variables:
|
|
223
|
-
errors.append("q:persist must contain at least one q:var element")
|
|
224
|
-
|
|
225
120
|
return errors
|
|
226
121
|
|
|
227
|
-
def __repr__(self):
|
|
228
|
-
return f'<PersistNode scope={self.scope} vars={len(self.variables)}>'
|
|
@@ -33,6 +33,11 @@ class UILayoutMixin:
|
|
|
33
33
|
self.ui_id: Optional[str] = None
|
|
34
34
|
self.ui_class: Optional[str] = None
|
|
35
35
|
self.visible: Optional[str] = None
|
|
36
|
+
# UI-2: responsive layout, declared (sm < 640 px, md < 768 px, lg < 1024 px)
|
|
37
|
+
self.stack_below: Optional[str] = None # hbox side by side, stacked below the breakpoint
|
|
38
|
+
self.hide_below: Optional[str] = None
|
|
39
|
+
self.hide_above: Optional[str] = None
|
|
40
|
+
self.grow: Optional[str] = None # "true": takes the room left in its row
|
|
36
41
|
|
|
37
42
|
def _layout_to_dict(self) -> Dict[str, Any]:
|
|
38
43
|
"""Return layout attributes as dict (for to_dict)."""
|
|
@@ -369,7 +374,7 @@ class UIValidatorNode(QuantumNode):
|
|
|
369
374
|
Can be defined at form level (reusable) or inline in an input.
|
|
370
375
|
|
|
371
376
|
Examples:
|
|
372
|
-
<ui:validator name="phone" pattern="
|
|
377
|
+
<ui:validator name="phone" pattern="^\\d{10,11}$" message="Invalid phone number" />
|
|
373
378
|
<ui:validator name="passwordMatch" field="password" match="confirm_password"
|
|
374
379
|
message="Passwords must match" />
|
|
375
380
|
<ui:validator name="customEmail" type="email" message="Please enter a valid email" />
|
|
@@ -544,6 +549,7 @@ class UIInputNode(QuantumNode, UILayoutMixin):
|
|
|
544
549
|
|
|
545
550
|
def __init__(self):
|
|
546
551
|
self.bind: Optional[str] = None
|
|
552
|
+
self.value: Optional[str] = None # initial value (UI-6)
|
|
547
553
|
self.placeholder: Optional[str] = None
|
|
548
554
|
self.input_type: str = "text" # text, password, email, number
|
|
549
555
|
self.on_change: Optional[str] = None
|
|
@@ -587,6 +593,7 @@ class UICheckboxNode(QuantumNode, UILayoutMixin):
|
|
|
587
593
|
|
|
588
594
|
def __init__(self):
|
|
589
595
|
self.bind: Optional[str] = None
|
|
596
|
+
self.checked: Optional[str] = None # "true"/"false" or {expr} (UI-6)
|
|
590
597
|
self.label: Optional[str] = None
|
|
591
598
|
self._init_layout_attrs()
|
|
592
599
|
|
|
@@ -604,6 +611,7 @@ class UIRadioNode(QuantumNode, UILayoutMixin):
|
|
|
604
611
|
|
|
605
612
|
def __init__(self):
|
|
606
613
|
self.bind: Optional[str] = None
|
|
614
|
+
self.value: Optional[str] = None # selected option (UI-6)
|
|
607
615
|
self.options: Optional[str] = None # comma-separated or source ref
|
|
608
616
|
self._init_layout_attrs()
|
|
609
617
|
|
|
@@ -621,6 +629,7 @@ class UISwitchNode(QuantumNode, UILayoutMixin):
|
|
|
621
629
|
|
|
622
630
|
def __init__(self):
|
|
623
631
|
self.bind: Optional[str] = None
|
|
632
|
+
self.checked: Optional[str] = None # "true"/"false" or {expr} (UI-6)
|
|
624
633
|
self.label: Optional[str] = None
|
|
625
634
|
self._init_layout_attrs()
|
|
626
635
|
|
|
@@ -638,6 +647,7 @@ class UISelectNode(QuantumNode, UILayoutMixin):
|
|
|
638
647
|
|
|
639
648
|
def __init__(self):
|
|
640
649
|
self.bind: Optional[str] = None
|
|
650
|
+
self.value: Optional[str] = None # selected option (UI-6)
|
|
641
651
|
self.options: Optional[str] = None
|
|
642
652
|
self.source: Optional[str] = None
|
|
643
653
|
self.children: List[QuantumNode] = [] # UIOptionNode children
|
|
@@ -662,6 +672,7 @@ class UITableNode(QuantumNode, UILayoutMixin):
|
|
|
662
672
|
|
|
663
673
|
def __init__(self):
|
|
664
674
|
self.source: Optional[str] = None
|
|
675
|
+
self.as_var: Optional[str] = None # row variable for column content (UI-5)
|
|
665
676
|
self.children: List[QuantumNode] = [] # UIColumnNode children
|
|
666
677
|
self._init_layout_attrs()
|
|
667
678
|
|
|
@@ -686,6 +697,11 @@ class UIColumnNode(QuantumNode):
|
|
|
686
697
|
self.label: Optional[str] = None
|
|
687
698
|
self.column_width: Optional[str] = None
|
|
688
699
|
self.align: Optional[str] = None # left, center, right
|
|
700
|
+
# UI-5: a column with content draws it once per row (buttons, links).
|
|
701
|
+
self.children: List[QuantumNode] = []
|
|
702
|
+
|
|
703
|
+
def add_child(self, child: QuantumNode):
|
|
704
|
+
self.children.append(child)
|
|
689
705
|
|
|
690
706
|
def to_dict(self) -> Dict[str, Any]:
|
|
691
707
|
return {"type": "ui_column", "key": self.key,
|
|
@@ -1852,3 +1868,20 @@ class UIDatePickerNode(QuantumNode, UILayoutMixin):
|
|
|
1852
1868
|
|
|
1853
1869
|
def validate(self) -> List[str]:
|
|
1854
1870
|
return self._validate_layout()
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
def is_ui_node(node) -> bool:
|
|
1874
|
+
"""A ui:* element (UI-1): markup, drawn by a renderer, never executed."""
|
|
1875
|
+
return type(node).__module__ == __name__
|
|
1876
|
+
|
|
1877
|
+
|
|
1878
|
+
# UI-7: the elements every renderer draws — browser, console and desktop — with
|
|
1879
|
+
# the same meaning, checked by tests/apps/test_ui_paridade.py. The other ui:*
|
|
1880
|
+
# tags work in the browser only; the console says it cannot draw them.
|
|
1881
|
+
CORE_TAGS = frozenset({
|
|
1882
|
+
'window', 'hbox', 'vbox', 'grid', 'panel', 'section', 'scrollbox', 'spacer', 'rule',
|
|
1883
|
+
'header', 'footer', 'card', 'card-header', 'card-body', 'card-footer', 'tabpanel', 'tab',
|
|
1884
|
+
'text', 'badge', 'alert', 'link', 'image', 'progress',
|
|
1885
|
+
'table', 'column', 'list', 'item',
|
|
1886
|
+
'form', 'formitem', 'input', 'checkbox', 'switch', 'radio', 'select', 'option', 'button',
|
|
1887
|
+
})
|
{quantum_framework-0.14.0 → quantum_framework-0.16.0}/quantum/core/features/ui_engine/src/parser.py
RENAMED
|
@@ -31,6 +31,7 @@ from .ast_nodes import (
|
|
|
31
31
|
UICalendarNode, UIDatePickerNode,
|
|
32
32
|
)
|
|
33
33
|
from quantum.core.features.theming.src import UIThemeNode, UIColorNode
|
|
34
|
+
from quantum.core.ast_nodes import TextNode
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
class UIParseError(Exception):
|
|
@@ -41,13 +42,16 @@ class UIParseError(Exception):
|
|
|
41
42
|
class UIParser:
|
|
42
43
|
"""Parser for ui: namespace UI elements."""
|
|
43
44
|
|
|
44
|
-
def __init__(self, parent_parser):
|
|
45
|
+
def __init__(self, parent_parser, page_mode: bool = False):
|
|
45
46
|
"""
|
|
46
47
|
Args:
|
|
47
48
|
parent_parser: The main QuantumParser instance, used to parse
|
|
48
49
|
q: namespace children (q:set, q:function, q:if, etc.)
|
|
49
50
|
"""
|
|
50
51
|
self.parent = parent_parser
|
|
52
|
+
# UI-1: inside a served page, HTML children are content too. In a
|
|
53
|
+
# <q:application type="ui"> build they were (and stay) ignored.
|
|
54
|
+
self.page_mode = page_mode
|
|
51
55
|
|
|
52
56
|
# ------------------------------------------------------------------
|
|
53
57
|
# Dispatch
|
|
@@ -130,7 +134,10 @@ class UIParser:
|
|
|
130
134
|
"""Dispatch a ui: element to the correct parse method."""
|
|
131
135
|
method_name = self.UI_TAG_MAP.get(local_name)
|
|
132
136
|
if method_name is None:
|
|
133
|
-
|
|
137
|
+
import difflib
|
|
138
|
+
parecidas = difflib.get_close_matches(local_name, self.UI_TAG_MAP, n=1)
|
|
139
|
+
dica = f"; did you mean <ui:{parecidas[0]}>?" if parecidas else ""
|
|
140
|
+
raise UIParseError(f"Unknown UI tag: <ui:{local_name}>{dica}")
|
|
134
141
|
method = getattr(self, method_name)
|
|
135
142
|
return method(element)
|
|
136
143
|
|
|
@@ -190,6 +197,14 @@ class UIParser:
|
|
|
190
197
|
node.ui_id = element.get('id')
|
|
191
198
|
node.ui_class = element.get('class')
|
|
192
199
|
node.visible = element.get('visible')
|
|
200
|
+
# UI-2: responsive attributes; a breakpoint is sm, md or lg.
|
|
201
|
+
for attr, campo in (('stack-below', 'stack_below'), ('hide-below', 'hide_below'),
|
|
202
|
+
('hide-above', 'hide_above')):
|
|
203
|
+
valor = element.get(attr)
|
|
204
|
+
if valor is not None and valor not in ('sm', 'md', 'lg'):
|
|
205
|
+
raise UIParseError(f'{attr}="{valor}": use sm (640 px), md (768 px) or lg (1024 px)')
|
|
206
|
+
setattr(node, campo, valor)
|
|
207
|
+
node.grow = element.get('grow')
|
|
193
208
|
|
|
194
209
|
# ------------------------------------------------------------------
|
|
195
210
|
# Animation attributes helper
|
|
@@ -233,16 +248,25 @@ class UIParser:
|
|
|
233
248
|
|
|
234
249
|
if ns == 'ui':
|
|
235
250
|
return self.parse_ui_element(local, child)
|
|
236
|
-
elif ns == 'quantum':
|
|
251
|
+
elif ns == 'quantum' or self.page_mode:
|
|
237
252
|
return self.parent._parse_statement(child)
|
|
238
253
|
return None
|
|
239
254
|
|
|
240
255
|
def _parse_children(self, element: ET.Element, node):
|
|
241
|
-
"""Parse all children of an element, adding them to node.
|
|
256
|
+
"""Parse all children of an element, adding them to node.
|
|
257
|
+
|
|
258
|
+
UI-1: inside a page, a container's own text is content too
|
|
259
|
+
(`<ui:card-header>Resumo</ui:card-header>`); it used to vanish. Nodes
|
|
260
|
+
that keep their text in `content` read it themselves."""
|
|
261
|
+
texto_e_conteudo = self.page_mode and not hasattr(node, 'content')
|
|
262
|
+
if texto_e_conteudo and (element.text or '').strip():
|
|
263
|
+
node.add_child(TextNode(element.text.strip()))
|
|
242
264
|
for child in element:
|
|
243
265
|
parsed = self._parse_child(child)
|
|
244
266
|
if parsed:
|
|
245
267
|
node.add_child(parsed)
|
|
268
|
+
if texto_e_conteudo and (child.tail or '').strip():
|
|
269
|
+
node.add_child(TextNode(child.tail.strip()))
|
|
246
270
|
|
|
247
271
|
# ------------------------------------------------------------------
|
|
248
272
|
# Containers
|
|
@@ -319,6 +343,7 @@ class UIParser:
|
|
|
319
343
|
def _parse_ui_form(self, element: ET.Element) -> UIFormNode:
|
|
320
344
|
node = UIFormNode()
|
|
321
345
|
node.on_submit = element.get('on-submit')
|
|
346
|
+
node.send = element.get('with')
|
|
322
347
|
|
|
323
348
|
# Validation attributes
|
|
324
349
|
node.validation_mode = element.get('validation', 'both')
|
|
@@ -380,6 +405,7 @@ class UIParser:
|
|
|
380
405
|
node = UIButtonNode()
|
|
381
406
|
node.content = (element.text or '').strip()
|
|
382
407
|
node.on_click = element.get('on-click')
|
|
408
|
+
node.send = element.get('with')
|
|
383
409
|
node.variant = element.get('variant')
|
|
384
410
|
node.disabled = self._parse_bool(element.get('disabled'))
|
|
385
411
|
self._apply_layout_attrs(node, element)
|
|
@@ -388,6 +414,7 @@ class UIParser:
|
|
|
388
414
|
def _parse_ui_input(self, element: ET.Element) -> UIInputNode:
|
|
389
415
|
node = UIInputNode()
|
|
390
416
|
node.bind = element.get('bind')
|
|
417
|
+
node.value = element.get('value')
|
|
391
418
|
node.placeholder = element.get('placeholder')
|
|
392
419
|
node.input_type = element.get('type', 'text')
|
|
393
420
|
node.on_change = element.get('on-change')
|
|
@@ -420,6 +447,7 @@ class UIParser:
|
|
|
420
447
|
def _parse_ui_checkbox(self, element: ET.Element) -> UICheckboxNode:
|
|
421
448
|
node = UICheckboxNode()
|
|
422
449
|
node.bind = element.get('bind')
|
|
450
|
+
node.checked = element.get('checked')
|
|
423
451
|
node.label = element.get('label')
|
|
424
452
|
self._apply_layout_attrs(node, element)
|
|
425
453
|
return node
|
|
@@ -427,6 +455,7 @@ class UIParser:
|
|
|
427
455
|
def _parse_ui_radio(self, element: ET.Element) -> UIRadioNode:
|
|
428
456
|
node = UIRadioNode()
|
|
429
457
|
node.bind = element.get('bind')
|
|
458
|
+
node.value = element.get('value')
|
|
430
459
|
node.options = element.get('options')
|
|
431
460
|
self._apply_layout_attrs(node, element)
|
|
432
461
|
return node
|
|
@@ -434,6 +463,7 @@ class UIParser:
|
|
|
434
463
|
def _parse_ui_switch(self, element: ET.Element) -> UISwitchNode:
|
|
435
464
|
node = UISwitchNode()
|
|
436
465
|
node.bind = element.get('bind')
|
|
466
|
+
node.checked = element.get('checked')
|
|
437
467
|
node.label = element.get('label')
|
|
438
468
|
self._apply_layout_attrs(node, element)
|
|
439
469
|
return node
|
|
@@ -441,6 +471,7 @@ class UIParser:
|
|
|
441
471
|
def _parse_ui_select(self, element: ET.Element) -> UISelectNode:
|
|
442
472
|
node = UISelectNode()
|
|
443
473
|
node.bind = element.get('bind')
|
|
474
|
+
node.value = element.get('value')
|
|
444
475
|
node.options = element.get('options')
|
|
445
476
|
node.source = element.get('source')
|
|
446
477
|
self._apply_layout_attrs(node, element)
|
|
@@ -451,6 +482,7 @@ class UIParser:
|
|
|
451
482
|
def _parse_ui_table(self, element: ET.Element) -> UITableNode:
|
|
452
483
|
node = UITableNode()
|
|
453
484
|
node.source = element.get('source')
|
|
485
|
+
node.as_var = element.get('as')
|
|
454
486
|
self._apply_layout_attrs(node, element)
|
|
455
487
|
# Parse child <ui:column> elements
|
|
456
488
|
self._parse_children(element, node)
|
|
@@ -462,6 +494,7 @@ class UIParser:
|
|
|
462
494
|
node.label = element.get('label')
|
|
463
495
|
node.column_width = element.get('width')
|
|
464
496
|
node.align = element.get('align')
|
|
497
|
+
self._parse_children(element, node)
|
|
465
498
|
return node
|
|
466
499
|
|
|
467
500
|
def _parse_ui_list(self, element: ET.Element) -> UIListNode:
|
|
@@ -570,7 +603,7 @@ class UIParser:
|
|
|
570
603
|
Parse <ui:validator> custom validation rule.
|
|
571
604
|
|
|
572
605
|
Examples:
|
|
573
|
-
<ui:validator name="phone" pattern="
|
|
606
|
+
<ui:validator name="phone" pattern="^\\d{10}$" message="Invalid phone" />
|
|
574
607
|
<ui:validator name="confirmPassword" match="password"
|
|
575
608
|
message="Passwords must match" />
|
|
576
609
|
<ui:validator name="custom" expression="value.length > 5"
|