django-cfg 1.3.13__py3-none-any.whl → 1.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/accounts/admin/user_admin.py +39 -16
- django_cfg/apps/accounts/serializers/profile.py +1 -1
- django_cfg/apps/accounts/services/otp_service.py +18 -11
- django_cfg/apps/accounts/signals.py +15 -24
- django_cfg/apps/accounts/utils/notifications.py +217 -358
- django_cfg/apps/accounts/views/otp.py +2 -2
- django_cfg/apps/accounts/views/webhook.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +1 -1
- django_cfg/apps/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- django_cfg/apps/api/commands/views.py +66 -83
- django_cfg/apps/api/health/drf_views.py +269 -0
- django_cfg/apps/api/health/serializers.py +45 -0
- django_cfg/apps/api/health/urls.py +6 -1
- django_cfg/apps/knowbase/admin/actions/__init__.py +13 -0
- django_cfg/apps/knowbase/admin/actions/visibility_actions.py +56 -0
- django_cfg/apps/knowbase/admin/document_admin.py +136 -270
- django_cfg/apps/knowbase/admin/helpers/__init__.py +17 -0
- django_cfg/apps/knowbase/admin/helpers/configs.py +72 -0
- django_cfg/apps/knowbase/admin/helpers/display_helpers.py +156 -0
- django_cfg/apps/knowbase/admin/helpers/statistics.py +108 -0
- django_cfg/apps/knowbase/config/constance_fields.py +1 -1
- django_cfg/apps/knowbase/config/settings.py +2 -2
- django_cfg/apps/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- django_cfg/apps/knowbase/mixins/__init__.py +19 -2
- django_cfg/apps/knowbase/mixins/config/__init__.py +14 -0
- django_cfg/apps/knowbase/mixins/config/defaults.py +75 -0
- django_cfg/apps/knowbase/mixins/config/meta_config.py +120 -0
- django_cfg/apps/knowbase/mixins/creator.py +10 -10
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +105 -403
- django_cfg/apps/knowbase/mixins/generators/__init__.py +16 -0
- django_cfg/apps/knowbase/mixins/generators/content_generator.py +218 -0
- django_cfg/apps/knowbase/mixins/generators/field_analyzer.py +76 -0
- django_cfg/apps/knowbase/mixins/generators/metadata_generator.py +124 -0
- django_cfg/apps/knowbase/mixins/service.py +2 -2
- django_cfg/apps/knowbase/services/archive/__init__.py +1 -0
- django_cfg/apps/knowbase/services/archive/analyzers/__init__.py +17 -0
- django_cfg/apps/knowbase/services/archive/analyzers/complexity_analyzer.py +33 -0
- django_cfg/apps/knowbase/services/archive/analyzers/purpose_detector.py +36 -0
- django_cfg/apps/knowbase/services/archive/analyzers/quality_analyzer.py +39 -0
- django_cfg/apps/knowbase/services/archive/analyzers/tag_generator.py +103 -0
- django_cfg/apps/knowbase/services/archive/chunking/__init__.py +19 -0
- django_cfg/apps/knowbase/services/archive/chunking/base.py +81 -0
- django_cfg/apps/knowbase/services/archive/chunking/json_chunker.py +62 -0
- django_cfg/apps/knowbase/services/archive/chunking/markdown_chunker.py +107 -0
- django_cfg/apps/knowbase/services/archive/chunking/python_chunker.py +248 -0
- django_cfg/apps/knowbase/services/archive/chunking/text_chunker.py +70 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +110 -729
- django_cfg/apps/knowbase/services/archive/context/__init__.py +14 -0
- django_cfg/apps/knowbase/services/archive/context/builders.py +220 -0
- django_cfg/apps/knowbase/services/archive/context/models.py +38 -0
- django_cfg/apps/knowbase/services/embedding/models.py +18 -14
- django_cfg/apps/knowbase/services/embedding/processors.py +6 -3
- django_cfg/apps/knowbase/tasks/document_processing.py +11 -3
- django_cfg/apps/leads/tests.py +1 -1
- django_cfg/apps/payments/admin/api_keys_admin.py +1 -1
- django_cfg/apps/payments/admin/balance_admin.py +1 -1
- django_cfg/apps/payments/admin/currencies_admin.py +1 -1
- django_cfg/apps/payments/admin/payments_admin.py +1 -1
- django_cfg/apps/payments/admin/subscriptions_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +59 -126
- django_cfg/apps/payments/admin_interface/views/api/payments.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/stats.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/users.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +1 -1
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +1 -1
- django_cfg/apps/payments/admin_interface/views/base.py +29 -2
- django_cfg/apps/payments/apps.py +1 -1
- django_cfg/apps/payments/config/django_cfg_integration.py +2 -2
- django_cfg/apps/payments/config/helpers.py +3 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +1 -1
- django_cfg/apps/payments/management/commands/currency_stats.py +1 -1
- django_cfg/apps/payments/management/commands/manage_currencies.py +1 -1
- django_cfg/apps/payments/management/commands/manage_providers.py +1 -1
- django_cfg/apps/payments/management/commands/process_pending_payments.py +1 -1
- django_cfg/apps/payments/management/commands/test_providers.py +1 -1
- django_cfg/apps/payments/middleware/api_access.py +1 -1
- django_cfg/apps/payments/middleware/rate_limiting.py +1 -1
- django_cfg/apps/payments/middleware/usage_tracking.py +1 -1
- django_cfg/apps/payments/models/balance.py +2 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +1 -1
- django_cfg/apps/payments/models/managers/balance_managers.py +1 -1
- django_cfg/apps/payments/models/managers/currency_managers.py +1 -1
- django_cfg/apps/payments/models/managers/payment_managers.py +1 -1
- django_cfg/apps/payments/models/managers/subscription_managers.py +1 -1
- django_cfg/apps/payments/models/payments.py +2 -2
- django_cfg/apps/payments/services/cache_service/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/simple_cache.py +10 -5
- django_cfg/apps/payments/services/core/base.py +1 -1
- django_cfg/apps/payments/services/core/currency/__init__.py +13 -0
- django_cfg/apps/payments/services/core/currency/currency_converter.py +57 -0
- django_cfg/apps/payments/services/core/currency/currency_validator.py +61 -0
- django_cfg/apps/payments/services/core/operations/__init__.py +15 -0
- django_cfg/apps/payments/services/core/operations/payment_canceller.py +100 -0
- django_cfg/apps/payments/services/core/operations/payment_creator.py +196 -0
- django_cfg/apps/payments/services/core/operations/status_checker.py +100 -0
- django_cfg/apps/payments/services/core/payment_service.py +124 -612
- django_cfg/apps/payments/services/core/providers/__init__.py +13 -0
- django_cfg/apps/payments/services/core/providers/provider_client.py +132 -0
- django_cfg/apps/payments/services/core/providers/status_mapper.py +89 -0
- django_cfg/apps/payments/services/core/utils/__init__.py +13 -0
- django_cfg/apps/payments/services/core/utils/data_converter.py +48 -0
- django_cfg/apps/payments/services/core/utils/statistics_calculator.py +69 -0
- django_cfg/apps/payments/services/providers/base.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +3 -3
- django_cfg/apps/payments/services/providers/nowpayments/parsers/__init__.py +9 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/__init__.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/constants.py +23 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/currency_names.py +244 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/data/patterns.py +511 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers/parser.py +168 -0
- django_cfg/apps/payments/services/providers/nowpayments/provider.py +1 -1
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +1 -1
- django_cfg/apps/payments/services/providers/registry.py +1 -1
- django_cfg/apps/payments/services/providers/sync_service.py +1 -1
- django_cfg/apps/payments/signals/__init__.py +1 -1
- django_cfg/apps/payments/signals/api_key_signals.py +1 -1
- django_cfg/apps/payments/signals/balance_signals.py +1 -1
- django_cfg/apps/payments/signals/payment_signals.py +1 -1
- django_cfg/apps/payments/signals/subscription_signals.py +1 -1
- django_cfg/apps/payments/views/api/api_keys.py +1 -1
- django_cfg/apps/payments/views/api/balances.py +1 -1
- django_cfg/apps/payments/views/api/base.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +1 -1
- django_cfg/apps/payments/views/api/payments.py +1 -1
- django_cfg/apps/payments/views/api/subscriptions.py +1 -1
- django_cfg/apps/payments/views/api/webhooks.py +1 -1
- django_cfg/apps/payments/views/serializers/api_keys.py +1 -1
- django_cfg/apps/payments/views/serializers/balances.py +1 -1
- django_cfg/apps/payments/views/serializers/currencies.py +1 -1
- django_cfg/apps/payments/views/serializers/payments.py +1 -1
- django_cfg/apps/payments/views/serializers/subscriptions.py +1 -1
- django_cfg/apps/payments/views/serializers/webhooks.py +1 -1
- django_cfg/apps/support/admin/support_admin.py +21 -13
- django_cfg/apps/support/templates/support/chat/access_denied.html +21 -27
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +183 -254
- django_cfg/apps/support/utils/support_email_service.py +1 -1
- django_cfg/apps/tasks/templates/tasks/layout/base.html +20 -115
- django_cfg/apps/tasks/utils/simulator.py +1 -1
- django_cfg/apps/tasks/views/dashboard.py +33 -3
- django_cfg/apps/urls.py +5 -1
- django_cfg/cli/README.md +57 -471
- django_cfg/cli/commands/create_project.py +140 -529
- django_cfg/cli/main.py +13 -10
- django_cfg/core/__init__.py +63 -6
- django_cfg/core/base/__init__.py +5 -0
- django_cfg/core/base/config_model.py +652 -0
- django_cfg/core/builders/__init__.py +11 -0
- django_cfg/core/builders/apps_builder.py +258 -0
- django_cfg/core/builders/middleware_builder.py +115 -0
- django_cfg/core/builders/security_builder.py +96 -0
- django_cfg/core/config.py +20 -892
- django_cfg/core/constants.py +69 -0
- django_cfg/core/environment/__init__.py +9 -0
- django_cfg/core/exceptions.py +45 -298
- django_cfg/core/generation/__init__.py +51 -0
- django_cfg/core/generation/core_generators/__init__.py +0 -0
- django_cfg/core/generation/core_generators/settings.py +90 -0
- django_cfg/core/generation/core_generators/static.py +82 -0
- django_cfg/core/generation/core_generators/templates.py +141 -0
- django_cfg/core/generation/data_generators/__init__.py +15 -0
- django_cfg/core/generation/data_generators/cache.py +132 -0
- django_cfg/core/generation/data_generators/database.py +117 -0
- django_cfg/core/generation/generation.py +92 -0
- django_cfg/core/generation/integration_generators/__init__.py +21 -0
- django_cfg/core/generation/integration_generators/api.py +237 -0
- django_cfg/core/generation/integration_generators/sessions.py +65 -0
- django_cfg/core/generation/integration_generators/tailwind.py +54 -0
- django_cfg/core/generation/integration_generators/tasks.py +92 -0
- django_cfg/core/generation/integration_generators/third_party.py +144 -0
- django_cfg/core/generation/orchestrator.py +285 -0
- django_cfg/core/generation/protocols.py +30 -0
- django_cfg/core/generation/security_generators/__init__.py +0 -0
- django_cfg/core/generation/utility_generators/__init__.py +24 -0
- django_cfg/core/generation/utility_generators/email.py +58 -0
- django_cfg/core/generation/utility_generators/i18n.py +66 -0
- django_cfg/core/generation/utility_generators/limits.py +58 -0
- django_cfg/core/generation/utility_generators/logging.py +66 -0
- django_cfg/core/generation/utility_generators/security.py +101 -0
- django_cfg/core/generation/utils/__init__.py +0 -0
- django_cfg/core/generation/utils/helpers.py +32 -0
- django_cfg/core/integration/__init__.py +18 -25
- django_cfg/core/integration/display/startup.py +146 -133
- django_cfg/core/integration/url_integration.py +13 -2
- django_cfg/core/services/__init__.py +5 -0
- django_cfg/core/services/config_service.py +121 -0
- django_cfg/core/state/__init__.py +9 -0
- django_cfg/core/state/registry.py +84 -0
- django_cfg/core/types/__init__.py +15 -0
- django_cfg/core/types/aliases.py +15 -0
- django_cfg/core/types/enums.py +49 -0
- django_cfg/dashboard/DEBUG_README.md +105 -0
- django_cfg/dashboard/REFACTORING_SUMMARY.md +237 -0
- django_cfg/dashboard/__init__.py +24 -0
- django_cfg/dashboard/components.py +308 -0
- django_cfg/dashboard/debug.py +176 -0
- django_cfg/dashboard/management/__init__.py +0 -0
- django_cfg/dashboard/management/commands/__init__.py +0 -0
- django_cfg/dashboard/management/commands/debug_dashboard.py +109 -0
- django_cfg/dashboard/sections/__init__.py +1 -0
- django_cfg/dashboard/sections/base.py +128 -0
- django_cfg/dashboard/sections/commands.py +32 -0
- django_cfg/dashboard/sections/overview.py +394 -0
- django_cfg/dashboard/sections/stats.py +48 -0
- django_cfg/dashboard/sections/system.py +73 -0
- django_cfg/management/commands/check_settings.py +6 -2
- django_cfg/management/commands/clear_constance.py +6 -1
- django_cfg/management/commands/create_token.py +5 -4
- django_cfg/management/commands/generate.py +5 -0
- django_cfg/management/commands/list_urls.py +7 -2
- django_cfg/management/commands/migrate_all.py +6 -2
- django_cfg/management/commands/migrator.py +6 -1
- django_cfg/management/commands/rundramatiq.py +6 -1
- django_cfg/management/commands/rundramatiq_simulator.py +11 -4
- django_cfg/management/commands/runserver_ngrok.py +9 -7
- django_cfg/management/commands/script.py +25 -21
- django_cfg/management/commands/show_config.py +6 -1
- django_cfg/management/commands/show_urls.py +8 -3
- django_cfg/management/commands/superuser.py +5 -4
- django_cfg/management/commands/task_clear.py +8 -3
- django_cfg/management/commands/task_status.py +8 -3
- django_cfg/management/commands/test_email.py +6 -1
- django_cfg/management/commands/test_telegram.py +6 -1
- django_cfg/management/commands/test_twilio.py +6 -1
- django_cfg/management/commands/tree.py +7 -4
- django_cfg/models/__init__.py +88 -3
- django_cfg/models/api/__init__.py +27 -0
- django_cfg/models/{api.py → api/config.py} +1 -1
- django_cfg/models/api/drf/__init__.py +21 -0
- django_cfg/models/api/drf/config.py +101 -0
- django_cfg/models/api/drf/redoc.py +31 -0
- django_cfg/models/api/drf/spectacular.py +129 -0
- django_cfg/models/api/drf/swagger.py +59 -0
- django_cfg/models/{api_keys.py → api/keys.py} +16 -6
- django_cfg/models/{limits.py → api/limits.py} +0 -1
- django_cfg/models/base/__init__.py +14 -0
- django_cfg/models/django/__init__.py +16 -0
- django_cfg/models/{constance.py → django/constance.py} +1 -1
- django_cfg/models/{environment.py → django/environment.py} +1 -1
- django_cfg/models/infrastructure/__init__.py +17 -0
- django_cfg/models/{cache.py → infrastructure/cache.py} +3 -2
- django_cfg/models/infrastructure/database/__init__.py +22 -0
- django_cfg/models/infrastructure/database/config.py +265 -0
- django_cfg/models/infrastructure/database/converters.py +91 -0
- django_cfg/models/infrastructure/database/parsers.py +96 -0
- django_cfg/models/infrastructure/database/routing.py +85 -0
- django_cfg/models/infrastructure/database/validators.py +170 -0
- django_cfg/models/{logging.py → infrastructure/logging.py} +1 -1
- django_cfg/models/{security.py → infrastructure/security.py} +2 -2
- django_cfg/models/ngrok/__init__.py +11 -0
- django_cfg/models/ngrok/auth.py +37 -0
- django_cfg/models/ngrok/config.py +77 -0
- django_cfg/models/ngrok/tunnel.py +35 -0
- django_cfg/models/payments/__init__.py +20 -0
- django_cfg/models/payments/api_keys.py +57 -0
- django_cfg/models/{payments.py → payments/config.py} +56 -154
- django_cfg/models/payments/providers/__init__.py +15 -0
- django_cfg/models/payments/providers/base.py +25 -0
- django_cfg/models/payments/providers/nowpayments.py +48 -0
- django_cfg/models/services/__init__.py +18 -0
- django_cfg/models/services/base.py +65 -0
- django_cfg/models/{email.py → services/email.py} +1 -1
- django_cfg/models/services/telegram.py +172 -0
- django_cfg/models/tasks/__init__.py +51 -0
- django_cfg/models/tasks/backends.py +250 -0
- django_cfg/models/tasks/config.py +314 -0
- django_cfg/models/tasks/utils.py +174 -0
- django_cfg/modules/base.py +18 -3
- django_cfg/modules/django_admin/decorators/actions.py +1 -1
- django_cfg/modules/django_admin/decorators/display.py +1 -1
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +1 -1
- django_cfg/modules/django_currency/examples/__init__.py +3 -0
- django_cfg/modules/django_currency/examples/example_database_usage.py +144 -0
- django_cfg/modules/django_drf_theme/CHANGELOG.md +210 -0
- django_cfg/modules/django_drf_theme/EXAMPLE.md +465 -0
- django_cfg/modules/django_drf_theme/IMPLEMENTATION.md +232 -0
- django_cfg/modules/django_drf_theme/README.md +207 -0
- django_cfg/modules/django_drf_theme/TAILWIND_CDN_GUIDE.md +274 -0
- django_cfg/modules/django_drf_theme/__init__.py +23 -0
- django_cfg/modules/django_drf_theme/apps.py +15 -0
- django_cfg/modules/django_drf_theme/renderers.py +58 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/api.html +375 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/base.html +938 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/filter_form.html +132 -0
- django_cfg/modules/django_drf_theme/templates/rest_framework/tailwind/forms/raw_data_form.html +123 -0
- django_cfg/modules/django_drf_theme/templatetags/__init__.py +1 -0
- django_cfg/modules/django_drf_theme/templatetags/tailwind_tags.py +57 -0
- django_cfg/modules/django_email/__init__.py +14 -0
- django_cfg/modules/{django_email.py → django_email/service.py} +78 -113
- django_cfg/modules/django_email/utils.py +40 -0
- django_cfg/modules/django_health/__init__.py +9 -0
- django_cfg/modules/{django_health.py → django_health/service.py} +23 -21
- django_cfg/modules/django_ipc_client/README.md +346 -0
- django_cfg/modules/django_ipc_client/__init__.py +51 -0
- django_cfg/modules/django_ipc_client/client.py +540 -0
- django_cfg/modules/django_ipc_client/config.py +207 -0
- django_cfg/modules/django_ipc_client/dashboard/README.md +517 -0
- django_cfg/modules/django_ipc_client/dashboard/UNFOLD_INTEGRATION.md +439 -0
- django_cfg/modules/django_ipc_client/dashboard/__init__.py +11 -0
- django_cfg/modules/django_ipc_client/dashboard/apps.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/monitor.py +435 -0
- django_cfg/modules/django_ipc_client/dashboard/static/django_ipc_dashboard/js/dashboard.js +373 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/base.html +76 -0
- django_cfg/modules/django_ipc_client/dashboard/templates/django_ipc_dashboard/dashboard.html +200 -0
- django_cfg/modules/django_ipc_client/dashboard/urls.py +22 -0
- django_cfg/modules/django_ipc_client/dashboard/urls_admin.py +9 -0
- django_cfg/modules/django_ipc_client/dashboard/views.py +251 -0
- django_cfg/modules/django_ipc_client/exceptions.py +201 -0
- django_cfg/modules/django_llm/llm/client.py +155 -550
- django_cfg/modules/django_llm/llm/embeddings/__init__.py +13 -0
- django_cfg/modules/django_llm/llm/embeddings/mock_embedder.py +106 -0
- django_cfg/modules/django_llm/llm/embeddings/openai_embedder.py +79 -0
- django_cfg/modules/django_llm/llm/models_api/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/models_api/models_query.py +163 -0
- django_cfg/modules/django_llm/llm/providers/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/providers/config_builder.py +103 -0
- django_cfg/modules/django_llm/llm/providers/provider_manager.py +148 -0
- django_cfg/modules/django_llm/llm/providers/provider_selector.py +60 -0
- django_cfg/modules/django_llm/llm/requests/__init__.py +15 -0
- django_cfg/modules/django_llm/llm/requests/cache_manager.py +170 -0
- django_cfg/modules/django_llm/llm/requests/chat_handler.py +199 -0
- django_cfg/modules/django_llm/llm/requests/embedding_handler.py +113 -0
- django_cfg/modules/django_llm/llm/responses/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/responses/response_builder.py +131 -0
- django_cfg/modules/django_llm/llm/stats/__init__.py +9 -0
- django_cfg/modules/django_llm/llm/stats/stats_manager.py +107 -0
- django_cfg/modules/django_llm/translator/detectors/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/detectors/language_detector.py +90 -0
- django_cfg/modules/django_llm/translator/detectors/script_detector.py +153 -0
- django_cfg/modules/django_llm/translator/stats/__init__.py +11 -0
- django_cfg/modules/django_llm/translator/stats/stats_tracker.py +85 -0
- django_cfg/modules/django_llm/translator/translator.py +150 -603
- django_cfg/modules/django_llm/translator/translators/__init__.py +15 -0
- django_cfg/modules/django_llm/translator/translators/json_translator.py +316 -0
- django_cfg/modules/django_llm/translator/translators/text_translator.py +139 -0
- django_cfg/modules/django_llm/translator/utils/__init__.py +13 -0
- django_cfg/modules/django_llm/translator/utils/prompt_builder.py +110 -0
- django_cfg/modules/django_llm/translator/utils/text_utils.py +114 -0
- django_cfg/modules/django_logging/FIXES_SUMMARY.md +276 -0
- django_cfg/modules/django_logging/LOGGING_GUIDE.md +504 -0
- django_cfg/modules/django_logging/__init__.py +14 -0
- django_cfg/modules/{django_logger.py → django_logging/django_logger.py} +13 -13
- django_cfg/modules/{logger.py → django_logging/logger.py} +14 -4
- django_cfg/modules/django_ngrok/__init__.py +39 -0
- django_cfg/modules/{django_ngrok.py → django_ngrok/service.py} +14 -42
- django_cfg/modules/django_rpc_old/POETRY.md +344 -0
- django_cfg/modules/django_rpc_old/README.md +397 -0
- django_cfg/modules/django_rpc_old/TESTING.md +358 -0
- django_cfg/modules/django_rpc_old/__init__.py +39 -0
- django_cfg/modules/django_rpc_old/client.py +531 -0
- django_cfg/modules/django_rpc_old/config.py +279 -0
- django_cfg/modules/django_rpc_old/exceptions.py +172 -0
- django_cfg/modules/django_tailwind/README.md +478 -0
- django_cfg/modules/django_tailwind/__init__.py +7 -0
- django_cfg/modules/django_tailwind/apps.py +10 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/app.html +5 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/base.html +117 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/navbar.html +124 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/theme_toggle.html +54 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/components/user_menu.html +116 -0
- django_cfg/modules/django_tailwind/templates/django_tailwind/simple.html +46 -0
- django_cfg/modules/django_tailwind/templatetags/__init__.py +1 -0
- django_cfg/modules/django_tailwind/templatetags/tailwind_info.py +185 -0
- django_cfg/modules/django_tasks/__init__.py +29 -0
- django_cfg/modules/django_tasks/factory.py +127 -0
- django_cfg/modules/{django_tasks.py → django_tasks/service.py} +45 -274
- django_cfg/modules/django_tasks/settings.py +107 -0
- django_cfg/modules/django_telegram/__init__.py +29 -0
- django_cfg/modules/{django_telegram.py → django_telegram/service.py} +45 -113
- django_cfg/modules/django_telegram/utils.py +62 -0
- django_cfg/modules/django_twilio/__init__.py +54 -107
- django_cfg/modules/django_twilio/_imports.py +30 -0
- django_cfg/modules/django_twilio/base.py +192 -0
- django_cfg/modules/django_twilio/email_otp.py +227 -0
- django_cfg/modules/django_twilio/sendgrid_service.py +1 -1
- django_cfg/modules/django_twilio/simple_service.py +1 -2
- django_cfg/modules/django_twilio/sms.py +94 -0
- django_cfg/modules/django_twilio/twilio_service.py +2 -3
- django_cfg/modules/django_twilio/unified.py +310 -0
- django_cfg/modules/django_twilio/utils.py +190 -0
- django_cfg/modules/django_twilio/whatsapp.py +137 -0
- django_cfg/modules/django_unfold/callbacks/base.py +198 -7
- django_cfg/modules/django_unfold/callbacks/main.py +102 -10
- django_cfg/modules/django_unfold/dashboard.py +65 -43
- django_cfg/modules/django_unfold/models/config.py +13 -12
- django_cfg/modules/django_unfold/models/navigation.py +8 -3
- django_cfg/modules/django_unfold/models/tabs.py +2 -2
- django_cfg/modules/django_unfold/templates/unfold/helpers/app_list.html +102 -0
- django_cfg/registry/core.py +24 -26
- django_cfg/registry/modules.py +5 -2
- django_cfg/registry/services.py +20 -3
- django_cfg/registry/third_party.py +8 -8
- django_cfg/static/admin/css/dashboard.css +260 -0
- django_cfg/static/admin/js/commands.js +171 -0
- django_cfg/static/admin/js/dashboard.js +126 -0
- django_cfg/templates/admin/components/management_commands.js +375 -0
- django_cfg/templates/admin/components/progress_bar.html +18 -23
- django_cfg/templates/admin/examples/component_class_example.html +156 -0
- django_cfg/templates/admin/index.html +48 -20
- django_cfg/templates/admin/index_new.html +106 -0
- django_cfg/templates/admin/layouts/base_dashboard.html +60 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +1 -20
- django_cfg/templates/admin/sections/commands_section.html +626 -0
- django_cfg/templates/admin/sections/overview_section.html +112 -0
- django_cfg/templates/admin/sections/stats_section.html +35 -0
- django_cfg/templates/admin/sections/system_section.html +99 -0
- django_cfg/templates/admin/snippets/components/CHARTS_GUIDE.md +322 -0
- django_cfg/templates/admin/snippets/components/activity_tracker.html +85 -47
- django_cfg/templates/admin/snippets/components/charts_section.html +154 -64
- django_cfg/templates/admin/snippets/components/django_commands.html +3 -3
- django_cfg/templates/admin/snippets/components/recent_activity_improved.html +25 -0
- django_cfg/templates/admin/snippets/components/recent_users_table.html +1 -1
- django_cfg/templates/admin/snippets/components/system_metrics.html +179 -93
- django_cfg/templates/admin/snippets/zones/zones_table.html +2 -2
- django_cfg/templatetags/django_cfg.py +7 -1
- django_cfg/utils/smart_defaults.py +4 -4
- django_cfg-1.4.3.dist-info/METADATA +533 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/RECORD +432 -195
- django_cfg/apps/accounts/utils/auth_email_service.py +0 -84
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +0 -879
- django_cfg/core/generation.py +0 -621
- django_cfg/management/commands/validate_config.py +0 -189
- django_cfg/models/database.py +0 -480
- django_cfg/models/drf.py +0 -272
- django_cfg/models/ngrok.py +0 -122
- django_cfg/models/services.py +0 -440
- django_cfg/models/tasks.py +0 -550
- django_cfg/modules/django_twilio/service.py +0 -942
- django_cfg/template_archive/django_sample.zip +0 -0
- django_cfg/templates/rest_framework/api.html +0 -12
- django_cfg/utils/toolkit.py +0 -703
- django_cfg-1.3.13.dist-info/METADATA +0 -1029
- /django_cfg/apps/accounts/management/commands/{test_otp.py → otp_test.py} +0 -0
- /django_cfg/core/{environment.py → environment/detector.py} +0 -0
- /django_cfg/models/{cors.py → api/cors.py} +0 -0
- /django_cfg/models/{jwt.py → api/jwt.py} +0 -0
- /django_cfg/models/{base.py → base/config.py} +0 -0
- /django_cfg/models/{cfg.py → base/module.py} +0 -0
- /django_cfg/models/{revolution.py → django/revolution.py} +0 -0
- /django_cfg/modules/{dramatiq_setup.py → django_tasks/dramatiq_setup.py} +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.13.dist-info → django_cfg-1.4.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,358 @@
|
|
1
|
+
# Django RPC Module - Testing Summary
|
2
|
+
|
3
|
+
**Status:** ✅ All Tests Passing (44/44)
|
4
|
+
**Coverage:** Models + Client + Integration
|
5
|
+
**Compliance:** Fully aligned with django-cfg TESTING.md standards
|
6
|
+
|
7
|
+
---
|
8
|
+
|
9
|
+
## Test Summary
|
10
|
+
|
11
|
+
| Category | Tests | Status | Location |
|
12
|
+
|----------|-------|--------|----------|
|
13
|
+
| **Pydantic Models** | 26 | ✅ PASS | `tests/websocket/test_models.py` |
|
14
|
+
| **RPC Client** | 18 | ✅ PASS | `tests/websocket/test_client.py` |
|
15
|
+
| **Total** | **44** | **✅ PASS** | |
|
16
|
+
|
17
|
+
---
|
18
|
+
|
19
|
+
## Running Tests
|
20
|
+
|
21
|
+
### Quick Start
|
22
|
+
|
23
|
+
```bash
|
24
|
+
# From django-cfg root directory
|
25
|
+
cd libs/django_cfg
|
26
|
+
|
27
|
+
# Run all WebSocket RPC tests
|
28
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -v
|
29
|
+
|
30
|
+
# Run with concise output
|
31
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -q
|
32
|
+
|
33
|
+
# Run specific test file
|
34
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/test_models.py -v
|
35
|
+
|
36
|
+
# Run specific test class
|
37
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/test_models.py::TestNotificationModels -v
|
38
|
+
|
39
|
+
# Run specific test
|
40
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/test_models.py::TestNotificationModels::test_notification_request_valid -v
|
41
|
+
```
|
42
|
+
|
43
|
+
### Using Test Markers
|
44
|
+
|
45
|
+
Tests are organized with pytest markers for selective execution:
|
46
|
+
|
47
|
+
```bash
|
48
|
+
# Run only unit tests
|
49
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -m "unit"
|
50
|
+
|
51
|
+
# Run only model tests
|
52
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -m "models"
|
53
|
+
|
54
|
+
# Run only client tests
|
55
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -m "client"
|
56
|
+
```
|
57
|
+
|
58
|
+
---
|
59
|
+
|
60
|
+
## Compliance with Django-CFG Testing Standards
|
61
|
+
|
62
|
+
### ✅ Test Framework Choice
|
63
|
+
|
64
|
+
**Why pytest (not Django TestCase)?**
|
65
|
+
|
66
|
+
According to `TESTING.md`, Django TestCase should be used for:
|
67
|
+
- Django ORM model tests
|
68
|
+
- Database operations
|
69
|
+
- Django-specific features
|
70
|
+
|
71
|
+
**Our implementation uses pytest because:**
|
72
|
+
- ✅ Testing Pydantic 2 models (NOT Django ORM)
|
73
|
+
- ✅ No database operations
|
74
|
+
- ✅ Mocked external services (Redis)
|
75
|
+
- ✅ Pure unit testing of synchronous logic
|
76
|
+
|
77
|
+
This aligns with TESTING.md section "When NOT to Use Django TestCase".
|
78
|
+
|
79
|
+
### ✅ Test Organization
|
80
|
+
|
81
|
+
Our test structure follows django-cfg standards:
|
82
|
+
|
83
|
+
```
|
84
|
+
modules/django_rpc/
|
85
|
+
├── tests/ # ✅ Co-located with module
|
86
|
+
│ ├── __init__.py
|
87
|
+
│ ├── conftest.py # ✅ Shared fixtures
|
88
|
+
│ ├── test_models.py # ✅ Unit tests for models
|
89
|
+
│ └── test_client.py # ✅ Unit tests for client
|
90
|
+
├── client.py
|
91
|
+
├── config.py
|
92
|
+
└── ...
|
93
|
+
```
|
94
|
+
|
95
|
+
Matches TESTING.md pattern:
|
96
|
+
```
|
97
|
+
modules/{module_name}/
|
98
|
+
tests/ # ✅ Unit tests co-located with module
|
99
|
+
conftest.py
|
100
|
+
test_*.py
|
101
|
+
```
|
102
|
+
|
103
|
+
### ✅ Mocking External Services
|
104
|
+
|
105
|
+
Following TESTING.md best practices:
|
106
|
+
|
107
|
+
```python
|
108
|
+
# ✅ GOOD: Mock Redis (external service)
|
109
|
+
@pytest.fixture
|
110
|
+
def mock_redis():
|
111
|
+
with patch("redis.ConnectionPool"):
|
112
|
+
with patch("redis.Redis") as mock_redis_class:
|
113
|
+
mock_redis_instance = MagicMock()
|
114
|
+
mock_redis_instance.ping.return_value = True
|
115
|
+
yield mock_redis_instance
|
116
|
+
```
|
117
|
+
|
118
|
+
### ✅ Test Isolation
|
119
|
+
|
120
|
+
Each test is properly isolated:
|
121
|
+
|
122
|
+
```python
|
123
|
+
@pytest.fixture
|
124
|
+
def rpc_client(mock_redis):
|
125
|
+
"""Fresh client instance for each test."""
|
126
|
+
client = WebSocketRPCClient(...)
|
127
|
+
client._redis = mock_redis
|
128
|
+
return client
|
129
|
+
```
|
130
|
+
|
131
|
+
### ✅ Test Speed
|
132
|
+
|
133
|
+
Performance meets django-cfg expectations:
|
134
|
+
|
135
|
+
| Metric | Expected | Actual | Status |
|
136
|
+
|--------|----------|--------|--------|
|
137
|
+
| Single unit test | < 0.1s | ~0.01s | ✅ |
|
138
|
+
| Full test suite | < 1s | ~0.5s | ✅ |
|
139
|
+
|
140
|
+
### ✅ Test Markers
|
141
|
+
|
142
|
+
Tests use custom markers for organization:
|
143
|
+
|
144
|
+
```python
|
145
|
+
@pytest.mark.unit
|
146
|
+
@pytest.mark.models
|
147
|
+
class TestNotificationModels:
|
148
|
+
"""Tests for notification models."""
|
149
|
+
```
|
150
|
+
|
151
|
+
Markers defined in `conftest.py`:
|
152
|
+
- `unit` - Unit tests for individual components
|
153
|
+
- `models` - Tests for Pydantic models
|
154
|
+
- `client` - Tests for RPC client
|
155
|
+
|
156
|
+
---
|
157
|
+
|
158
|
+
## Test Coverage Breakdown
|
159
|
+
|
160
|
+
### Model Tests (26 tests)
|
161
|
+
|
162
|
+
**`test_models.py`** - Comprehensive Pydantic model validation
|
163
|
+
|
164
|
+
- **BaseModels** (6 tests)
|
165
|
+
- ✅ BaseRPCMessage creation
|
166
|
+
- ✅ Correlation ID handling
|
167
|
+
- ✅ Request validation
|
168
|
+
- ✅ Invalid method rejection
|
169
|
+
- ✅ Response success/error states
|
170
|
+
|
171
|
+
- **RPC Models** (4 tests)
|
172
|
+
- ✅ Generic typed requests
|
173
|
+
- ✅ Generic typed responses
|
174
|
+
- ✅ EchoParams validation
|
175
|
+
|
176
|
+
- **Notification Models** (6 tests)
|
177
|
+
- ✅ Valid notification requests
|
178
|
+
- ✅ Invalid data key rejection
|
179
|
+
- ✅ Expiration validation
|
180
|
+
- ✅ Batch notification creation
|
181
|
+
- ✅ Duplicate user ID rejection
|
182
|
+
- ✅ Batch response totals validation
|
183
|
+
|
184
|
+
- **Broadcast Models** (3 tests)
|
185
|
+
- ✅ Broadcast to all users
|
186
|
+
- ✅ Room ID requirement for ROOM target
|
187
|
+
- ✅ Room ID rejection for non-ROOM targets
|
188
|
+
|
189
|
+
- **Error Models** (3 tests)
|
190
|
+
- ✅ Basic error creation
|
191
|
+
- ✅ Retryable errors
|
192
|
+
- ✅ Validation errors with field details
|
193
|
+
|
194
|
+
- **Connection Models** (4 tests)
|
195
|
+
- ✅ ConnectionInfo creation
|
196
|
+
- ✅ Activity status checking
|
197
|
+
- ✅ Activity updates
|
198
|
+
- ✅ State update validation
|
199
|
+
|
200
|
+
### Client Tests (18 tests)
|
201
|
+
|
202
|
+
**`test_client.py`** - RPC client functionality with mocked Redis
|
203
|
+
|
204
|
+
- **Initialization** (3 tests)
|
205
|
+
- ✅ Successful client init
|
206
|
+
- ✅ Connection error handling
|
207
|
+
- ✅ Custom settings
|
208
|
+
|
209
|
+
- **RPC Call** (4 tests)
|
210
|
+
- ✅ Successful RPC call
|
211
|
+
- ✅ Timeout handling
|
212
|
+
- ✅ Remote error handling
|
213
|
+
- ✅ Custom timeout override
|
214
|
+
|
215
|
+
- **Fire-and-Forget** (1 test)
|
216
|
+
- ✅ Send without waiting for response
|
217
|
+
|
218
|
+
- **Broadcast** (1 test)
|
219
|
+
- ✅ Pub/Sub broadcast
|
220
|
+
|
221
|
+
- **Health Check** (3 tests)
|
222
|
+
- ✅ Successful health check
|
223
|
+
- ✅ Ping failure handling
|
224
|
+
- ✅ Exception handling
|
225
|
+
|
226
|
+
- **Connection Info** (1 test)
|
227
|
+
- ✅ Get connection details
|
228
|
+
|
229
|
+
- **Context Manager** (1 test)
|
230
|
+
- ✅ Proper resource cleanup
|
231
|
+
|
232
|
+
- **Singleton** (2 tests)
|
233
|
+
- ✅ Singleton creation
|
234
|
+
- ✅ Force new instance
|
235
|
+
|
236
|
+
- **Cleanup** (2 tests)
|
237
|
+
- ✅ Pool disconnection
|
238
|
+
- ✅ Cleanup on error
|
239
|
+
|
240
|
+
---
|
241
|
+
|
242
|
+
## Example Test Output
|
243
|
+
|
244
|
+
```bash
|
245
|
+
$ PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/ -v
|
246
|
+
|
247
|
+
======================== test session starts =========================
|
248
|
+
platform darwin -- Python 3.10.18, pytest-8.4.1
|
249
|
+
|
250
|
+
collected 44 items
|
251
|
+
|
252
|
+
test_client.py::TestWebSocketRPCClientInit::test_client_init_success PASSED
|
253
|
+
test_client.py::TestRPCClientCall::test_call_success PASSED
|
254
|
+
test_client.py::TestRPCClientCall::test_call_timeout PASSED
|
255
|
+
...
|
256
|
+
test_models.py::TestNotificationModels::test_notification_request_valid PASSED
|
257
|
+
test_models.py::TestBroadcastModels::test_broadcast_request_all PASSED
|
258
|
+
test_models.py::TestErrorModels::test_rpc_error_basic PASSED
|
259
|
+
...
|
260
|
+
|
261
|
+
====================== 44 passed in 0.45s ========================
|
262
|
+
```
|
263
|
+
|
264
|
+
---
|
265
|
+
|
266
|
+
## Future Testing Enhancements
|
267
|
+
|
268
|
+
### Integration Tests
|
269
|
+
|
270
|
+
Consider adding integration tests in `tests/integration/`:
|
271
|
+
|
272
|
+
```python
|
273
|
+
# tests/integration/test_rpc_with_django.py
|
274
|
+
from django.test import TestCase
|
275
|
+
from django_cfg.modules.django_rpc import get_rpc_client
|
276
|
+
|
277
|
+
class RPCIntegrationTestCase(TestCase):
|
278
|
+
"""Integration tests with Django views/models."""
|
279
|
+
|
280
|
+
def test_rpc_from_django_view(self):
|
281
|
+
"""Test RPC call from actual Django view."""
|
282
|
+
# Test with real Django request/response
|
283
|
+
pass
|
284
|
+
```
|
285
|
+
|
286
|
+
### End-to-End Tests
|
287
|
+
|
288
|
+
For complete flow testing:
|
289
|
+
|
290
|
+
```python
|
291
|
+
# tests/e2e/test_websocket_flow.py
|
292
|
+
class WebSocketE2ETestCase(TestCase):
|
293
|
+
"""E2E tests with real Redis and WebSocket server."""
|
294
|
+
|
295
|
+
@pytest.mark.slow
|
296
|
+
def test_complete_notification_flow(self):
|
297
|
+
"""Test complete flow: Django → Redis → WebSocket → User"""
|
298
|
+
# Requires running Redis and WebSocket server
|
299
|
+
pass
|
300
|
+
```
|
301
|
+
|
302
|
+
---
|
303
|
+
|
304
|
+
## Common Issues and Solutions
|
305
|
+
|
306
|
+
### Issue: `ModuleNotFoundError: No module named 'django_cfg'`
|
307
|
+
|
308
|
+
**Solution:** Set PYTHONPATH when running tests:
|
309
|
+
|
310
|
+
```bash
|
311
|
+
PYTHONPATH=src:$PYTHONPATH pytest src/django_cfg/tests/websocket/
|
312
|
+
```
|
313
|
+
|
314
|
+
### Issue: Redis connection errors
|
315
|
+
|
316
|
+
**Solution:** Tests use mocked Redis - no real Redis required!
|
317
|
+
|
318
|
+
All external dependencies (Redis, WebSocket servers) are mocked for unit tests.
|
319
|
+
|
320
|
+
---
|
321
|
+
|
322
|
+
## Test Development Guidelines
|
323
|
+
|
324
|
+
When adding new tests:
|
325
|
+
|
326
|
+
1. **Follow naming convention**: `test_*.py`
|
327
|
+
2. **Use descriptive test names**: `test_notification_request_valid`
|
328
|
+
3. **Add proper markers**: `@pytest.mark.unit`, `@pytest.mark.models`
|
329
|
+
4. **Mock external services**: Never hit real Redis/APIs
|
330
|
+
5. **Keep tests fast**: < 0.1s per test
|
331
|
+
6. **Document test purpose**: Clear docstrings
|
332
|
+
|
333
|
+
Example:
|
334
|
+
|
335
|
+
```python
|
336
|
+
@pytest.mark.unit
|
337
|
+
@pytest.mark.models
|
338
|
+
class TestMyNewModel:
|
339
|
+
"""Tests for MyNewModel Pydantic validation."""
|
340
|
+
|
341
|
+
def test_valid_creation(self):
|
342
|
+
"""Test model can be created with valid data."""
|
343
|
+
model = MyNewModel(field="value")
|
344
|
+
assert model.field == "value"
|
345
|
+
|
346
|
+
def test_invalid_field_rejection(self):
|
347
|
+
"""Test model rejects invalid field values."""
|
348
|
+
with pytest.raises(ValidationError):
|
349
|
+
MyNewModel(field="") # Empty not allowed
|
350
|
+
```
|
351
|
+
|
352
|
+
---
|
353
|
+
|
354
|
+
**Last Updated:** 2025-10-03
|
355
|
+
**Maintainer:** Django-CFG Team
|
356
|
+
**Status:** ✅ Production Ready
|
357
|
+
|
358
|
+
For questions about testing, see main [TESTING.md](../../TESTING.md)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"""
|
2
|
+
Django RPC Module for WebSocket Communication.
|
3
|
+
|
4
|
+
Provides synchronous RPC client for Django applications to communicate
|
5
|
+
with external WebSocket servers via Redis.
|
6
|
+
|
7
|
+
Example:
|
8
|
+
>>> from django_cfg.modules.django_rpc import get_rpc_client
|
9
|
+
>>> from django_cfg.models.websocket import NotificationRequest, NotificationResponse
|
10
|
+
>>>
|
11
|
+
>>> rpc = get_rpc_client()
|
12
|
+
>>> result: NotificationResponse = rpc.call(
|
13
|
+
... method="send_notification",
|
14
|
+
... params=NotificationRequest(user_id="123", message="Hello"),
|
15
|
+
... result_model=NotificationResponse
|
16
|
+
... )
|
17
|
+
"""
|
18
|
+
|
19
|
+
from .client import WebSocketRPCClient, get_rpc_client
|
20
|
+
from .config import WebSocketRPCConfig
|
21
|
+
from .exceptions import (
|
22
|
+
RPCTimeoutError,
|
23
|
+
RPCRemoteError,
|
24
|
+
RPCConnectionError,
|
25
|
+
RPCConfigurationError,
|
26
|
+
)
|
27
|
+
|
28
|
+
__all__ = [
|
29
|
+
# Client
|
30
|
+
"WebSocketRPCClient",
|
31
|
+
"get_rpc_client",
|
32
|
+
# Configuration
|
33
|
+
"WebSocketRPCConfig",
|
34
|
+
# Exceptions
|
35
|
+
"RPCTimeoutError",
|
36
|
+
"RPCRemoteError",
|
37
|
+
"RPCConnectionError",
|
38
|
+
"RPCConfigurationError",
|
39
|
+
]
|