ascender-framework 2.1.0__tar.gz → 2.1.0a2__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.
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/PKG-INFO +3 -4
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/builder/build_service.py +28 -28
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/__init__.py +5 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/_transport.py +1 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/awaitables/awaitable.py +6 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/client.py +81 -20
- ascender_framework-2.1.0a2/ascender/common/http/types/file.py +15 -0
- ascender_framework-2.1.0a2/ascender/common/http/types/formdata.py +87 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/types/interceptors.py +2 -2
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/rpc.py +7 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/rpc.py +6 -1
- ascender_framework-2.1.0a2/ascender/core/_config/interface/runtime.py +101 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_config/stub.json +1 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/_create_internal.py +14 -9
- ascender_framework-2.1.0a2/ascender/core/applications/_lifespan.py +19 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/application.py +67 -30
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/create_application.py +20 -17
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/async_module.py +11 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/main.py +2 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/engine.py +70 -39
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/utils/metadata_from_class.py +2 -10
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/utils/valiidator.py +1 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/engine.py +16 -8
- ascender_framework-2.1.0a2/ascender/core/database/orms/tortoise.py +26 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/overrider.py +3 -3
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/injection_def.py +18 -8
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/logger/_logger.py +25 -21
- ascender_framework-2.1.0a2/ascender/core/logger/formatter.py +56 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/registries/service.py +1 -1
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/ascender.json.asctpl +2 -0
- ascender_framework-2.1.0a2/ascender/schematics/workspace/create.py +81 -0
- ascender_framework-2.1.0a2/ascender/schematics/workspace/files/main.py.asctpl +6 -0
- ascender_framework-2.1.0a2/ascender/schematics/workspace/files/workspace.json.asctpl +5 -0
- ascender_framework-2.1.0a2/ascender/workspaces/__init__.py +3 -0
- ascender_framework-2.1.0a2/ascender/workspaces/_configs/workspace.py +11 -0
- ascender_framework-2.1.0a2/ascender/workspaces/_configs/workspace_project.py +16 -0
- ascender_framework-2.1.0a2/ascender/workspaces/_configs/workspace_script.py +7 -0
- ascender_framework-2.1.0a2/ascender/workspaces/pkg_managers/__init__.py +11 -0
- ascender_framework-2.1.0a2/ascender/workspaces/pkg_managers/base.py +17 -0
- ascender_framework-2.1.0a2/ascender/workspaces/pkg_managers/detector.py +33 -0
- ascender_framework-2.1.0a2/ascender/workspaces/pkg_managers/poetry.py +66 -0
- ascender_framework-2.1.0a2/ascender/workspaces/pkg_managers/uv.py +15 -0
- ascender_framework-2.1.0a2/ascender/workspaces/projects/manager.py +215 -0
- ascender_framework-2.1.0a2/ascender/workspaces/provider.py +8 -0
- ascender_framework-2.1.0a2/ascender/workspaces/scripts/builtin/projects.py +261 -0
- ascender_framework-2.1.0a2/ascender/workspaces/scripts/scripts.py +24 -0
- ascender_framework-2.1.0a2/ascender/workspaces/utils/__init__.py +31 -0
- ascender_framework-2.1.0a2/ascender/workspaces/utils/detector.py +87 -0
- ascender_framework-2.1.0a2/ascender/workspaces/utils/project_toml.py +52 -0
- ascender_framework-2.1.0a2/ascender/workspaces/utils/workspace_json.py +70 -0
- ascender_framework-2.1.0a2/ascender/workspaces/workspace.py +51 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/pyproject.toml +3 -4
- ascender_framework-2.1.0/ascender/core/_builder/minifier.py +0 -55
- ascender_framework-2.1.0/ascender/core/_config/interface/runtime.py +0 -62
- ascender_framework-2.1.0/ascender/core/database/orms/tortoise.py +0 -19
- ascender_framework-2.1.0/ascender/core/logger/formatter.py +0 -36
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/LICENSE +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/README.md +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/abc/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/abc/middleware.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/builder/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/builder/build_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/builder/build_message_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/generator/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/generator/create_generator_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/generator/edit_generator_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/generator/generator_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/new/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/new/new_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/new/new_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/run/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/run/run_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/serve/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/serve/serve_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/serve/serve_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/tests/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/tests/tests_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/tests/tests_cli_service.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/version/version_app.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/api/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/api/base_http_middleware.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/api/cors_middleware.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/api/relational_middleware.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/api_docs.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/base/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/base/dto.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/base/response.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/types/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/types/http_options.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/injectable.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/client_proxy.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/context.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/event_bus.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/event_transport.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/rpc_transport.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/abc/transporter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/callback_manager.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/exceptions/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/exceptions/rpc_exception.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/bus.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/client_factory.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/client_proxy.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/client.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/context.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/event.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/metadata.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/kafka/transporter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/client.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/context.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/event.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/rpc.old.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/redis/transporter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/client.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/context.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/event.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/rpc.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/tcp/transporter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/instances/transport.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/patterns/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/patterns/event_pattern.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/patterns/message_pattern.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/transport_manager.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/types/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/types/consumer_metadata.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/types/ctx.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/types/options.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/types/transport.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/utils/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/utils/consumers.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/utils/data_parser.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/utils/defer_mapping.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/microservices/utils/redis_tools.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/serializer.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/contrib/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/contrib/middlewares.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_builder/build.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_builder/dockerfile_generator.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_builder/file_builder.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_builder/obfuscator.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_config/asc_config.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_config/interface/environment.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_config/interface/main.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/_config/static_files.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/configure_imports.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/lifecycle.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/applications/root_injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/application.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/injectable.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/loaders/base_loader.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/loaders/generic_loader.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/models.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/processor.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/decorators/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/decorators/command.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/decorators/handler.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/parameters/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/parameters/boolean.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/parameters/const.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/parameters/parameter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/protos/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/protos/basic_cli.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/protos/generic_cli.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/command_metadata.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/handler_metadata.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/parameter.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/parameter_kind.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/types/undefined.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/utils/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/utils/argparser.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/cli_engine/utils/signature_from_callable.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/constructor.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/dbcontext.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/entity.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/errors/wrong_orm.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/orms/sqlalchemy.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/types/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/types/orm_enum.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/types/sqlalchemy_configuration.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/database/types/tortoise_configuration.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/abc/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/abc/base_injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/forward_ref.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/inject.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/injectfn.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/consts.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/injection_metadata.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/provider.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/interface/record.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/none_injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/test_injector.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/forward_ref.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/graph.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/providers.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/di/utils/record.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/authentication.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/base.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/config_error.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/lifecycle_error.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/not_standalone.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/errors/scope_error.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/logger/rotation.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/registries/container.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/repositories.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/root.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/graph.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/interface/route.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/provide.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/router.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/router_module.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/utils/controller.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/router/utils/from_controllers.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/services.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/controller.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/controller_hook.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/controller_ref.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/module.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/module_ref.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/struct/routes.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/types.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/utils/hydrate_consumer.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/utils/module.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/core/utils/repository.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/guards/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/guards/guard.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/guards/paramguard.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/guards/use_guards.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/base/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/base/edit.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/controller/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/controller/files/controller.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/guard/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/guard/files/guard.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/guard/files/param-guard.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/module/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/module/edit.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/module/files/module.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/module/files/update-module.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/.gitignore +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/LICENSE +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/README.md +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/app_module.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/bootstrap.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/main.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/routes.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/settings-connectiontypes/sqlalchemy.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/settings-connectiontypes/tortoise.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/project/files/settings.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/repository/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/repository/edit.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/repository/files/repository.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/repository/files/sa-repository-record.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/repository/files/to-repository-record.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/service/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/service/files/service.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/tests/create.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/tests/files/pytest.ini.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/tests/files/tests/conftest.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/tests/files/tests/test_initial.py.asctpl +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/utilities/case_filters.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/utilities/entity_filters.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/schematics/utilities/namespace_maker.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/start.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/lifecycle.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/mixer.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/mock_dependency.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/test_client.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/utils/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/utils/metadata/__init__.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/testing/utils/metadata/faker_field.py +0 -0
- {ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/logo.png +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ascender-framework
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.0a2
|
|
4
4
|
Summary: The Ascender Framework is a sophisticated and structured FastAPI-based framework, inspired by the principles of NestJS. It stands out for its modular and organized architecture, offering developers a streamlined and efficient way to build web applications
|
|
5
5
|
Author: AscenderTeam
|
|
6
|
-
Requires-Python: >=3.11,<3.
|
|
6
|
+
Requires-Python: >=3.11,<3.15
|
|
7
7
|
Classifier: Programming Language :: Python :: 3
|
|
8
8
|
Classifier: Programming Language :: Python :: 3.11
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
11
11
|
Requires-Dist: aerich (>=0.7.2,<0.8.0)
|
|
12
12
|
Requires-Dist: chardet (>=5.2.0,<6.0.0)
|
|
13
13
|
Requires-Dist: click (>=8.1.7,<9.0.0)
|
|
14
|
-
Requires-Dist: fastapi (>=0.115)
|
|
14
|
+
Requires-Dist: fastapi (>=0.115,<0.135.3)
|
|
15
15
|
Requires-Dist: httpx (>=0.28.1,<0.29.0)
|
|
16
16
|
Requires-Dist: inflection (>=0.5.1,<0.6.0)
|
|
17
17
|
Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
|
|
@@ -20,7 +20,6 @@ Requires-Dist: pydantic[email] (>=2.7.4)
|
|
|
20
20
|
Requires-Dist: pyinstaller (>=6.11.1,<7.0.0)
|
|
21
21
|
Requires-Dist: pytest (>=8.4.2,<9.0.0)
|
|
22
22
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
|
23
|
-
Requires-Dist: python-minifier (>=2.11.3,<3.0.0)
|
|
24
23
|
Requires-Dist: reactivex (>=4.0.4)
|
|
25
24
|
Requires-Dist: readchar (>=4.0.5,<5.0.0)
|
|
26
25
|
Requires-Dist: requests (>=2.31.0)
|
{ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/clis/builder/build_service.py
RENAMED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import os
|
|
2
|
+
|
|
3
|
+
from rich import print as rprint
|
|
4
|
+
|
|
2
5
|
from ascender.clis.builder.build_message_service import BuildMessageService
|
|
3
|
-
from ascender.core import Service
|
|
4
6
|
from ascender.common import Injectable
|
|
7
|
+
from ascender.core import Service
|
|
5
8
|
from ascender.core._builder.file_builder import build_file_manager
|
|
6
|
-
from ascender.core._builder.minifier import minify_project
|
|
7
9
|
from ascender.core._builder.obfuscator import obfuscate_project
|
|
8
10
|
from ascender.core._config.asc_config import _AscenderConfig
|
|
9
|
-
from rich import print as rprint
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
@Injectable(provided_in="root")
|
|
@@ -24,50 +25,49 @@ class BuildService(Service):
|
|
|
24
25
|
build_configs = configs.build
|
|
25
26
|
|
|
26
27
|
# display start message using rich print
|
|
27
|
-
rprint(
|
|
28
|
+
rprint(
|
|
29
|
+
f"[green]INFO[/green] Building {configs.project['name']} - Ascender Framework Project"
|
|
30
|
+
)
|
|
28
31
|
rprint("[cyan]Preparing configuration files for build[/cyan]")
|
|
29
32
|
|
|
30
33
|
if build_configs.obfuscate:
|
|
31
|
-
rprint(
|
|
34
|
+
rprint(
|
|
35
|
+
"[green]INFO[/] [yellow]`Obfuscation` detected in `ascender.json`[/]"
|
|
36
|
+
)
|
|
32
37
|
rprint("[green]INFO[/] Using [cyan bold]PyInstaller[/] to build project...")
|
|
33
38
|
rprint("[green]INFO[/] Using [cyan bold]PyInstaller[/] to build project...")
|
|
34
39
|
self.build_file_manager(False)
|
|
35
40
|
|
|
36
41
|
obfuscate_project(
|
|
37
|
-
configs.project["name"],
|
|
42
|
+
configs.project["name"],
|
|
43
|
+
configs.paths.output,
|
|
44
|
+
configs.paths.source,
|
|
45
|
+
configs.build.packages,
|
|
46
|
+
configs.build.importMetadata,
|
|
38
47
|
)
|
|
39
48
|
|
|
40
|
-
rprint(
|
|
41
|
-
|
|
49
|
+
rprint(
|
|
50
|
+
"[green]INFO[/] [cyan]Obfuscation finished, build has been completed...[cyan]"
|
|
51
|
+
)
|
|
52
|
+
rprint(
|
|
53
|
+
f"[green]INFO[/] [cyan]Build distribution is available in {configs.paths.output}/{configs.project['name']}[cyan]"
|
|
54
|
+
)
|
|
42
55
|
# display_obfuscated_instructions had no implementation in the message service, skipping.
|
|
43
56
|
return
|
|
44
57
|
|
|
45
|
-
if build_configs.minify:
|
|
46
|
-
rprint("[green]INFO[/] [yellow]`minify` detected in `ascender.json`[/]")
|
|
47
|
-
rprint("[green]INFO[/] Using [cyan bold]python-minifier[/] to build project...")
|
|
48
|
-
rprint("[green]INFO[/] Using [cyan bold]python-minifier[/] to build project...")
|
|
49
|
-
self.build_file_manager(False)
|
|
50
|
-
minify_project(
|
|
51
|
-
configs.project["name"],
|
|
52
|
-
configs.paths.output,
|
|
53
|
-
configs.paths.source,
|
|
54
|
-
build_configs.stripComments
|
|
55
|
-
)
|
|
56
|
-
rprint("[green]INFO[/] [cyan]Minification finished, build has been completed...[cyan]")
|
|
57
|
-
rprint(f"[green]INFO[/] [cyan]Build distribution is available in {configs.paths.output}/{configs.project['name']}[cyan]")
|
|
58
|
-
return
|
|
59
|
-
|
|
60
58
|
self.build_file_manager(True)
|
|
61
|
-
rprint(
|
|
59
|
+
rprint(
|
|
60
|
+
f"[yellow]Classic build has been finished, check out {configs.paths.output}/{configs.project['name']}...[/]"
|
|
61
|
+
)
|
|
62
62
|
|
|
63
63
|
def build_file_manager(self, use_source: bool = True):
|
|
64
64
|
configs = self.get_configs()
|
|
65
65
|
build_configs = configs.build
|
|
66
66
|
|
|
67
67
|
return build_file_manager(
|
|
68
|
-
configs.project["name"],
|
|
69
|
-
|
|
70
|
-
),
|
|
68
|
+
configs.project["name"],
|
|
69
|
+
configs.paths.output,
|
|
70
|
+
configs.project.get("version", "0.1.0"),
|
|
71
71
|
None if not use_source else configs.paths.source,
|
|
72
|
-
configs.paths.static if build_configs.includeStatic else None
|
|
72
|
+
configs.paths.static if build_configs.includeStatic else None,
|
|
73
73
|
)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from .types.file import FileData
|
|
2
|
+
from .types.formdata import FormData
|
|
1
3
|
from .client import HTTPClient
|
|
2
4
|
from .provider import provideHTTPClient
|
|
3
5
|
from .types.http_options import HTTPOptions, HeaderTypes
|
|
@@ -12,5 +14,7 @@ __all__ = [
|
|
|
12
14
|
"_await",
|
|
13
15
|
"Interceptor",
|
|
14
16
|
"InterceptorFn",
|
|
15
|
-
"InterceptorIn"
|
|
17
|
+
"InterceptorIn",
|
|
18
|
+
"FormData",
|
|
19
|
+
"FileData"
|
|
16
20
|
]
|
|
@@ -58,7 +58,7 @@ class AscHTTPTransport(AsyncBaseTransport):
|
|
|
58
58
|
modified_request = request
|
|
59
59
|
# Handle class interceptors based on dependency injection
|
|
60
60
|
class_interceptors: list[Interceptor] | Interceptor = RootInjector().get(
|
|
61
|
-
"HTTP_INTERCEPTOR", not_found_value=[], options={"optional": True})
|
|
61
|
+
"HTTP_INTERCEPTOR", not_found_value=[], options={"optional": True}) # type: ignore
|
|
62
62
|
|
|
63
63
|
modified_request = await self.request_class_interceptors(modified_request, class_interceptors)
|
|
64
64
|
|
{ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/awaitables/awaitable.py
RENAMED
|
@@ -6,7 +6,12 @@ def _await(coro: Coroutine):
|
|
|
6
6
|
"""
|
|
7
7
|
Runs any coroutine in sync function, especially of the RxPY's Observable's `on_next` and `on_error` functions
|
|
8
8
|
"""
|
|
9
|
-
|
|
9
|
+
try:
|
|
10
|
+
loop = asyncio.get_event_loop()
|
|
11
|
+
except RuntimeError:
|
|
12
|
+
loop = asyncio.new_event_loop()
|
|
13
|
+
asyncio.set_event_loop(loop)
|
|
14
|
+
|
|
10
15
|
return loop.run_until_complete(coro)
|
|
11
16
|
|
|
12
17
|
__all__ = ["_await"]
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
from
|
|
4
|
-
from
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
from contextlib import _AsyncGeneratorContextManager
|
|
4
|
+
from typing import Any, Literal, TypeVar, cast, overload
|
|
5
|
+
from httpx import AsyncClient, Response
|
|
5
6
|
from pydantic import BaseModel
|
|
6
7
|
from reactivex import create, Observer, abc, Observable
|
|
7
8
|
|
|
9
|
+
from ascender.common.http.types.formdata import FormData
|
|
10
|
+
|
|
8
11
|
from ._transport import AscHTTPTransport
|
|
9
12
|
from .types.http_options import HTTPOptions
|
|
10
13
|
|
|
@@ -54,7 +57,7 @@ class HTTPClient:
|
|
|
54
57
|
_resp: type[T] | T = dict,
|
|
55
58
|
*,
|
|
56
59
|
url: str,
|
|
57
|
-
content: Any | BaseModel | None,
|
|
60
|
+
content: Any | BaseModel | FormData | None,
|
|
58
61
|
options: HTTPOptions | None = None
|
|
59
62
|
) -> T:
|
|
60
63
|
"""Send a POST request to a desired endpoint.
|
|
@@ -83,7 +86,7 @@ class HTTPClient:
|
|
|
83
86
|
_resp: type[T] | T = dict,
|
|
84
87
|
*,
|
|
85
88
|
url: str,
|
|
86
|
-
content: Any | BaseModel | None,
|
|
89
|
+
content: Any | BaseModel | FormData | None,
|
|
87
90
|
options: HTTPOptions | None = None
|
|
88
91
|
) -> T:
|
|
89
92
|
"""Send a PUT request to a desired endpoint.
|
|
@@ -112,7 +115,7 @@ class HTTPClient:
|
|
|
112
115
|
_resp: type[T] | T = dict,
|
|
113
116
|
*,
|
|
114
117
|
url: str,
|
|
115
|
-
content: Any | BaseModel | None,
|
|
118
|
+
content: Any | BaseModel | FormData | None,
|
|
116
119
|
options: HTTPOptions | None = None
|
|
117
120
|
) -> T:
|
|
118
121
|
"""Send a PATCH request to a desired endpoint.
|
|
@@ -163,15 +166,42 @@ class HTTPClient:
|
|
|
163
166
|
|
|
164
167
|
return cast(T, self.__handle_response(_resp, response=response))
|
|
165
168
|
|
|
169
|
+
@overload
|
|
166
170
|
def stream(
|
|
167
171
|
self,
|
|
168
172
|
_resp: type[T] | T = dict,
|
|
169
173
|
*,
|
|
170
174
|
method: Literal["GET", "POST", "PUT", "DELETE", "PATCH"],
|
|
171
175
|
url: str,
|
|
172
|
-
content: Any | BaseModel | None = None,
|
|
173
|
-
options: HTTPOptions | None = None
|
|
176
|
+
content: Any | BaseModel | FormData | None = None,
|
|
177
|
+
options: HTTPOptions | None = None,
|
|
178
|
+
as_observable: Literal[True] = True,
|
|
174
179
|
) -> Observable[T]:
|
|
180
|
+
...
|
|
181
|
+
|
|
182
|
+
@overload
|
|
183
|
+
def stream(
|
|
184
|
+
self,
|
|
185
|
+
_resp: type[T] | T = dict,
|
|
186
|
+
*,
|
|
187
|
+
method: Literal["GET", "POST", "PUT", "DELETE", "PATCH"],
|
|
188
|
+
url: str,
|
|
189
|
+
content: Any | BaseModel | FormData | None = None,
|
|
190
|
+
options: HTTPOptions | None = None,
|
|
191
|
+
as_observable: Literal[False],
|
|
192
|
+
) -> _AsyncGeneratorContextManager[Response]:
|
|
193
|
+
...
|
|
194
|
+
|
|
195
|
+
def stream(
|
|
196
|
+
self,
|
|
197
|
+
_resp: type[T] | T = dict,
|
|
198
|
+
*,
|
|
199
|
+
method: Literal["GET", "POST", "PUT", "DELETE", "PATCH"],
|
|
200
|
+
url: str,
|
|
201
|
+
content: Any | BaseModel | FormData | None = None,
|
|
202
|
+
options: HTTPOptions | None = None,
|
|
203
|
+
as_observable: bool = True,
|
|
204
|
+
) -> Observable[T] | _AsyncGeneratorContextManager[Response]:
|
|
175
205
|
"""Send a streaming request to a desired endpoint.
|
|
176
206
|
|
|
177
207
|
Args:
|
|
@@ -180,9 +210,10 @@ class HTTPClient:
|
|
|
180
210
|
url (str): The URL to send the request to.
|
|
181
211
|
content (Any | BaseModel | None, optional): The content to include in the request body (supports pydantic models). Defaults to None.
|
|
182
212
|
options (HTTPOptions | None, optional): Additional options for the request. Defaults to None.
|
|
213
|
+
as_observable (bool, optional): When True (default), returns an Observable; when False, returns an async context manager for manual streaming.
|
|
183
214
|
|
|
184
215
|
Returns:
|
|
185
|
-
Observable[T]:
|
|
216
|
+
Observable[T] | _AsyncGeneratorContextManager[Response]: Stream subscription helper or the raw streaming context manager.
|
|
186
217
|
|
|
187
218
|
Raises:
|
|
188
219
|
httpx.HTTPError: If an error occurs during the HTTP request.
|
|
@@ -190,9 +221,12 @@ class HTTPClient:
|
|
|
190
221
|
payload_options = {} if not options else options
|
|
191
222
|
request_payload = self.__prepare_request_body(content)
|
|
192
223
|
|
|
193
|
-
|
|
224
|
+
response_ctx = self.client.stream(method, url, **request_payload, **cast(HTTPOptions, payload_options)) # type: ignore
|
|
194
225
|
|
|
195
|
-
|
|
226
|
+
if not as_observable:
|
|
227
|
+
return response_ctx
|
|
228
|
+
|
|
229
|
+
return create(cast(abc.Subscription[T], self.__handle_streaming(_resp, response=response_ctx)))
|
|
196
230
|
|
|
197
231
|
def __prepare_request_body(
|
|
198
232
|
self,
|
|
@@ -203,26 +237,53 @@ class HTTPClient:
|
|
|
203
237
|
|
|
204
238
|
if isinstance(content, BaseModel):
|
|
205
239
|
return {"json": cast(BaseModel, content).model_dump(mode="json")}
|
|
206
|
-
|
|
240
|
+
|
|
241
|
+
if isinstance(content, FormData):
|
|
242
|
+
return content._construct()
|
|
243
|
+
|
|
207
244
|
return {"json": content}
|
|
208
245
|
|
|
209
246
|
def __handle_streaming(
|
|
210
247
|
self,
|
|
211
248
|
_resp: type[T] | T = dict,
|
|
212
249
|
*,
|
|
213
|
-
response:
|
|
250
|
+
response: _AsyncGeneratorContextManager[Response]
|
|
214
251
|
):
|
|
215
252
|
def observable_response(observer: Observer[T], _):
|
|
216
|
-
def handle_request():
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
253
|
+
async def handle_request():
|
|
254
|
+
try:
|
|
255
|
+
async with response as item:
|
|
256
|
+
async for line in item.aiter_text():
|
|
257
|
+
parsed = self.__parse_stream_chunk(_resp, line)
|
|
258
|
+
observer.on_next(parsed)
|
|
259
|
+
|
|
221
260
|
observer.on_completed()
|
|
261
|
+
except Exception as exc:
|
|
262
|
+
observer.on_error(exc)
|
|
222
263
|
|
|
223
|
-
|
|
264
|
+
asyncio.create_task(handle_request())
|
|
224
265
|
return observable_response
|
|
225
266
|
|
|
267
|
+
def __parse_stream_chunk(self, _resp: type[T] | T, chunk: str) -> T:
|
|
268
|
+
if isinstance(_resp, BaseModel):
|
|
269
|
+
return cast(T, type(_resp).model_validate_json(chunk))
|
|
270
|
+
|
|
271
|
+
if isinstance(_resp, type) and issubclass(_resp, BaseModel):
|
|
272
|
+
return cast(T, cast(type[BaseModel], _resp).model_validate_json(chunk))
|
|
273
|
+
|
|
274
|
+
try:
|
|
275
|
+
data = json.loads(chunk)
|
|
276
|
+
except Exception:
|
|
277
|
+
return cast(T, chunk)
|
|
278
|
+
|
|
279
|
+
if isinstance(_resp, type):
|
|
280
|
+
try:
|
|
281
|
+
return cast(T, _resp(data)) # type: ignore[arg-type]
|
|
282
|
+
except Exception:
|
|
283
|
+
return cast(T, data)
|
|
284
|
+
|
|
285
|
+
return cast(T, data)
|
|
286
|
+
|
|
226
287
|
def __handle_response(
|
|
227
288
|
self,
|
|
228
289
|
_resp: type[T] | T = dict,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class FileData:
|
|
5
|
+
def __init__(self, filename: str, content: bytes | BytesIO, content_type: str) -> None:
|
|
6
|
+
self.filename = filename
|
|
7
|
+
self.content = content
|
|
8
|
+
self.content_type = content_type
|
|
9
|
+
|
|
10
|
+
def seek(self, position: int) -> None:
|
|
11
|
+
if isinstance(self.content, BytesIO):
|
|
12
|
+
self.content.seek(position)
|
|
13
|
+
|
|
14
|
+
def construct(self) -> tuple[str, bytes | BytesIO, str]:
|
|
15
|
+
return (self.filename, self.content, self.content_type)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
from typing import Any, Iterable
|
|
3
|
+
|
|
4
|
+
from fastapi import UploadFile
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from ascender.common.http.types.file import FileData
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FormData:
|
|
11
|
+
"""A form data container for HTTP multipart/form-data requests.
|
|
12
|
+
|
|
13
|
+
This class provides an interface similar to the JavaScript FormData API for building
|
|
14
|
+
multipart form data. It supports string values and file uploads via FileData.
|
|
15
|
+
|
|
16
|
+
Note:
|
|
17
|
+
UploadFile values cannot be passed directly to the constructor. They must be added
|
|
18
|
+
using the append() or set() methods, which handle the conversion to FileData internally.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, **entries: str | FileData) -> None:
|
|
22
|
+
"""Initialize FormData with key-value pairs.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
**entries: Key-value pairs where values can be strings or FileData objects.
|
|
26
|
+
Note: UploadFile values are not accepted here. Use append() or set() instead.
|
|
27
|
+
"""
|
|
28
|
+
self.fields = entries
|
|
29
|
+
|
|
30
|
+
def append_from_dto(self, data: BaseModel) -> None:
|
|
31
|
+
self.fields.update(data.model_dump(mode="json"))
|
|
32
|
+
|
|
33
|
+
def append(self, name: str, value: str | FileData | UploadFile) -> None:
|
|
34
|
+
if isinstance(value, UploadFile):
|
|
35
|
+
if not value.content_type or not value.filename:
|
|
36
|
+
raise ValueError("UploadFile must have content_type and filename")
|
|
37
|
+
|
|
38
|
+
file_content = value.file.read()
|
|
39
|
+
file_data = FileData(
|
|
40
|
+
filename=value.filename,
|
|
41
|
+
content_type=value.content_type,
|
|
42
|
+
content=BytesIO(file_content)
|
|
43
|
+
)
|
|
44
|
+
self.fields[name] = file_data
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
self.fields[name] = value
|
|
48
|
+
|
|
49
|
+
def entries(self) -> Iterable[tuple[str, Any]]:
|
|
50
|
+
return iter(self.fields.items())
|
|
51
|
+
|
|
52
|
+
def get(self, name: str) -> str | FileData | None:
|
|
53
|
+
return self.fields.get(name)
|
|
54
|
+
|
|
55
|
+
def get_all(self) -> dict[str, str | FileData]:
|
|
56
|
+
return self.fields.copy()
|
|
57
|
+
|
|
58
|
+
def has(self, name: str) -> bool:
|
|
59
|
+
return name in self.fields
|
|
60
|
+
|
|
61
|
+
def keys(self) -> Iterable[str]:
|
|
62
|
+
return self.fields.keys()
|
|
63
|
+
|
|
64
|
+
def set(self, name: str, value: str | FileData | UploadFile) -> None:
|
|
65
|
+
self.append(name, value)
|
|
66
|
+
|
|
67
|
+
def values(self) -> Iterable[Any]:
|
|
68
|
+
return self.fields.values()
|
|
69
|
+
|
|
70
|
+
def delete(self, name: str) -> None:
|
|
71
|
+
if name in self.fields:
|
|
72
|
+
del self.fields[name]
|
|
73
|
+
|
|
74
|
+
def _construct(self):
|
|
75
|
+
files: dict[str, Any] = {}
|
|
76
|
+
data: dict[str, Any] = {}
|
|
77
|
+
|
|
78
|
+
for key, value in self.fields.items():
|
|
79
|
+
if isinstance(value, FileData):
|
|
80
|
+
files[key] = value.construct()
|
|
81
|
+
else:
|
|
82
|
+
data[key] = str(value)
|
|
83
|
+
|
|
84
|
+
return {
|
|
85
|
+
"data": data,
|
|
86
|
+
"files": files
|
|
87
|
+
}
|
{ascender_framework-2.1.0 → ascender_framework-2.1.0a2}/ascender/common/http/types/interceptors.py
RENAMED
|
@@ -3,7 +3,7 @@ from typing import Awaitable, Callable
|
|
|
3
3
|
from httpx import Request, Response
|
|
4
4
|
|
|
5
5
|
InterceptorIn = Request
|
|
6
|
-
InterceptorFn =
|
|
6
|
+
InterceptorFn = Callable[[Request], Awaitable[Request]]
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class Interceptor(ABC):
|
|
@@ -13,4 +13,4 @@ class Interceptor(ABC):
|
|
|
13
13
|
raise NotImplementedError("Handle request is not implemented")
|
|
14
14
|
|
|
15
15
|
async def handle_response(self, response: Response):
|
|
16
|
-
return response
|
|
16
|
+
return response
|
|
@@ -108,7 +108,13 @@ class KafkaRPCTransport(RPCTransport):
|
|
|
108
108
|
|
|
109
109
|
Instead it returns Reactivex observable object with
|
|
110
110
|
"""
|
|
111
|
-
|
|
111
|
+
try:
|
|
112
|
+
loop = asyncio.get_event_loop()
|
|
113
|
+
except RuntimeError:
|
|
114
|
+
loop = asyncio.new_event_loop()
|
|
115
|
+
asyncio.set_event_loop(loop)
|
|
116
|
+
|
|
117
|
+
asyncio_scheduler = AsyncIOScheduler(loop)
|
|
112
118
|
correlation_id = str(uuid4())
|
|
113
119
|
|
|
114
120
|
data = parse_data(data).encode()
|
|
@@ -74,7 +74,12 @@ class RedisRPCTransport(RPCTransport):
|
|
|
74
74
|
return await response
|
|
75
75
|
|
|
76
76
|
async def send_nack_request(self, pattern, data, timeout):
|
|
77
|
-
|
|
77
|
+
try:
|
|
78
|
+
loop = asyncio.get_event_loop()
|
|
79
|
+
except RuntimeError:
|
|
80
|
+
loop = asyncio.new_event_loop()
|
|
81
|
+
asyncio.set_event_loop(loop)
|
|
82
|
+
|
|
78
83
|
asyncio_scheduler = AsyncIOScheduler(loop)
|
|
79
84
|
correlation_id = str(uuid4())
|
|
80
85
|
payload = {
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from typing import Literal, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class OverrideConfig(BaseModel):
|
|
7
|
+
enabled: bool = Field(
|
|
8
|
+
True, description="Whether dependency injection overrides are enabled."
|
|
9
|
+
)
|
|
10
|
+
injector: Optional[str] = Field(
|
|
11
|
+
None,
|
|
12
|
+
description="Custom injector class to use for dependency injection overrides.",
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LoggingRotationConfig(BaseModel):
|
|
17
|
+
enabled: bool = Field(True, description="Whether log rotation is enabled.")
|
|
18
|
+
max_size: str = Field(
|
|
19
|
+
"10MB", description="Maximum size of a log file before rotation."
|
|
20
|
+
)
|
|
21
|
+
backup_count: int = Field(5, ge=1, description="Number of backup files to keep.")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LoggingConfig(BaseModel):
|
|
25
|
+
level: Literal["debug", "info", "warn", "error", "critical"] = Field(
|
|
26
|
+
"info", description="Logging level."
|
|
27
|
+
)
|
|
28
|
+
file: Optional[str] = Field(None, description="Path to the log file.")
|
|
29
|
+
console: bool = Field(True, description="Whether to enable console logging.")
|
|
30
|
+
console_format: Literal["rich", "json"] = Field(
|
|
31
|
+
"rich", description="Console log format."
|
|
32
|
+
)
|
|
33
|
+
file_format: Literal["rich", "json"] = Field("json", description="File log format.")
|
|
34
|
+
rotation: Optional[LoggingRotationConfig] = Field(
|
|
35
|
+
None, description="Log rotation settings."
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BuildConfig(BaseModel):
|
|
40
|
+
target: Literal["development", "production", "test"] = Field(
|
|
41
|
+
..., description="Build target environment."
|
|
42
|
+
)
|
|
43
|
+
minify: bool = Field(True, description="Whether to minify the code.")
|
|
44
|
+
obfuscate: bool = Field(True, description="Whether to obfuscate the code.")
|
|
45
|
+
stripComments: bool = Field(
|
|
46
|
+
True, description="Whether to strip comments from the code."
|
|
47
|
+
)
|
|
48
|
+
includeStatic: bool = Field(
|
|
49
|
+
True, description="Whether to include static files in the build."
|
|
50
|
+
)
|
|
51
|
+
includeLogs: bool = Field(True, description="Whether to include logs in the build.")
|
|
52
|
+
maxBuildSizeMB: int = Field(
|
|
53
|
+
50, ge=1, description="Maximum allowed build size in MB."
|
|
54
|
+
)
|
|
55
|
+
packages: list[str] = Field(
|
|
56
|
+
[], description="Additional packages and imports will be included during build"
|
|
57
|
+
)
|
|
58
|
+
importMetadata: list[str] = Field(
|
|
59
|
+
[], description="Additional import metadatas will be included during build"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class ServerConfig(BaseModel):
|
|
64
|
+
workers: int = Field(4, ge=1, description="Number of worker processes.")
|
|
65
|
+
reload: bool = Field(
|
|
66
|
+
True, description="Whether to enable hot-reload for development."
|
|
67
|
+
)
|
|
68
|
+
timeout: int = Field(60, ge=1, description="Request timeout in seconds.")
|
|
69
|
+
requestLogging: bool = Field(
|
|
70
|
+
True, description="Whether to enable detailed request logging."
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DependencyInjectionConfig(BaseModel):
|
|
75
|
+
strictMode: bool = Field(
|
|
76
|
+
True, description="Whether to enforce strict mode for dependency injection."
|
|
77
|
+
)
|
|
78
|
+
circularDependencyHandling: Literal["warn", "error"] = Field(
|
|
79
|
+
"warn", description="Action to take when circular dependencies are detected."
|
|
80
|
+
)
|
|
81
|
+
overrides: OverrideConfig = Field(
|
|
82
|
+
OverrideConfig(
|
|
83
|
+
enabled=False, injector="ascender.core.di.injector.AscenderInjector"
|
|
84
|
+
),
|
|
85
|
+
description="Dependency injection settings for this environment.",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class FeaturesConfig(BaseModel):
|
|
90
|
+
dependencyInjection: DependencyInjectionConfig = Field(
|
|
91
|
+
..., description="Dependency injection settings."
|
|
92
|
+
)
|
|
93
|
+
runtimeMonitoring: bool = Field(
|
|
94
|
+
True, description="Whether to enable runtime monitoring."
|
|
95
|
+
)
|
|
96
|
+
autoMigrations: bool = Field(
|
|
97
|
+
False, description="Whether to enable automatic migrations."
|
|
98
|
+
)
|
|
99
|
+
staticFileServing: bool = Field(
|
|
100
|
+
True, description="Whether to enable serving of static files."
|
|
101
|
+
)
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
+
|
|
2
3
|
import os
|
|
3
4
|
from typing import TYPE_CHECKING
|
|
4
5
|
|
|
5
6
|
from ascender.clis.tests.tests_app import TestRunnerCLI
|
|
7
|
+
from ascender.workspaces.provider import provideWorkspaces
|
|
6
8
|
|
|
7
9
|
from .root_injector import RootInjector
|
|
8
10
|
|
|
@@ -13,21 +15,19 @@ if TYPE_CHECKING:
|
|
|
13
15
|
def createInternalApplication():
|
|
14
16
|
"""
|
|
15
17
|
Runs application in CLI mode
|
|
16
|
-
|
|
18
|
+
|
|
17
19
|
Args:
|
|
18
20
|
config: An optional list of providers for root-level configuration.
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
Returns:
|
|
21
23
|
An initialized Application instance.
|
|
22
24
|
"""
|
|
25
|
+
from ascender.clis.generator.generator_app import GeneratorCLI
|
|
23
26
|
from ascender.clis.new.new_app import NewCLI
|
|
24
27
|
from ascender.clis.run.run_app import RunCLI
|
|
25
28
|
from ascender.clis.version.version_app import VersionCLI
|
|
26
|
-
from ascender.clis.generator.generator_app import GeneratorCLI
|
|
27
|
-
|
|
28
29
|
from ascender.core.cli_engine import CLIEngine, useCLI
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
os.environ["ASC_MODE"] = "cli"
|
|
32
32
|
# Initialize the root injector
|
|
33
33
|
root_injector = RootInjector()
|
|
@@ -38,15 +38,20 @@ def createInternalApplication():
|
|
|
38
38
|
useCLI(NewCLI),
|
|
39
39
|
useCLI(RunCLI),
|
|
40
40
|
useCLI(VersionCLI),
|
|
41
|
+
provideWorkspaces(),
|
|
41
42
|
useCLI(TestRunnerCLI),
|
|
42
43
|
{
|
|
43
44
|
"provide": CLIEngine,
|
|
44
|
-
"use_factory": lambda commands: CLIEngine(
|
|
45
|
-
|
|
45
|
+
"use_factory": lambda commands: CLIEngine(
|
|
46
|
+
commands,
|
|
47
|
+
usage="ascender <command> [options]",
|
|
48
|
+
description="🚀 Ascender Framework - Modern Python Web Framework",
|
|
49
|
+
),
|
|
50
|
+
"deps": ["ASC_CLI_COMMAND"],
|
|
46
51
|
},
|
|
47
52
|
]
|
|
48
53
|
|
|
49
54
|
# Configuration-based application creation
|
|
50
55
|
root_injector.create(internal_providers)
|
|
51
56
|
|
|
52
|
-
return root_injector.get(CLIEngine)
|
|
57
|
+
return root_injector.get(CLIEngine) # type: ignore
|