lex-app 2.3.2__tar.gz → 2.3.4__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.
- {lex_app-2.3.2/lex_app.egg-info → lex_app-2.3.4}/PKG-INFO +1 -1
- lex_app-2.3.4/lex/_version.py +1 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/config.py +49 -0
- lex_app-2.3.4/lex/test_project/tests/init/test_1at_reflex_single_port_proxy.py +268 -0
- {lex_app-2.3.2 → lex_app-2.3.4/lex_app.egg-info}/PKG-INFO +1 -1
- {lex_app-2.3.2 → lex_app-2.3.4}/lex_app.egg-info/SOURCES.txt +1 -0
- lex_app-2.3.2/lex/_version.py +0 -1
- {lex_app-2.3.2 → lex_app-2.3.4}/LICENSE.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/MANIFEST.in +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/README.md +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/generate_pycharm_configs.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/__main__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/BackendHealthConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/CalculationLogConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/CalculationsConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/LogConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/ModelDataUpdateConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/UpdateCalculationStatusConsumer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/consumers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/filters/FilterTreeNode.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/filters/GenericFilters.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/filters/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/middleware/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/middleware/keycloak_permissions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/serializers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/serializers/base_serializers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/serializers/sensitive_fields.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/Context.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/api_key_requests.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/collection_utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/converters.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/helpers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/utils/temporal.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/LexLoggerView/LexLoggerView.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/LexLoggerView/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/ModelStructureObtainView.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/authentication/KeycloakManager.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/authentication/UserAPIView.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/authentication/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/calculations/ActiveCalculations.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/calculations/CleanCalculations.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/calculations/DownloadMarkdownPdf.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/calculations/InitCalculationLogs.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/calculations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/file_operations/FileDownload.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/file_operations/ModelExport.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/file_operations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/global_search_for_models/Search.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/global_search_for_models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/lex_api/LexAPI.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/lex_api/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/CalculationLogTreeView.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/History.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/List.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/Many.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/One.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/filter_backends.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/serializers/CalculationLogTreeSerializer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/serializers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_info/Fields.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_info/Widgets.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_info/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/pagination.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/permissions/ModelPermissions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/permissions/UserPermission.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/permissions/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/process_flow/CreateOrUpdate.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/process_flow/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/project_info/ProjectInfo.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/project_info/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/rbac/RBACInfo.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/rbac/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/sharepoint/DeleteUnusedFiles.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/sharepoint/SharePointFileDownload.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/sharepoint/SharePointPreview.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/sharepoint/SharePointShareLink.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/sharepoint/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/streamlit/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/dark-lex-logo.svg +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-bg.jpg +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-logo.png +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-logo.svg +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-test-report/email.html +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-test-report/lex-icon.png +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-test-report/lex-logo.png +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/assets/lex-test-report/pdf.html +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/handlers/ConsoleHandler.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/handlers/LexLogger.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/handlers/WebSocketHandler.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/handlers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0001_initial.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0002_auditlog_created_at_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0003_alter_auditlog_created_at_alter_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0004_remove_auditlog_audit_fields.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0005_calculationlog_calculationid_index.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0006_alter_auditlog_calculation_id.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/0007_calculationlog_heading.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/mixins/AuditLogMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/mixins/BulkAuditLogMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/mixins/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/models/AuditLog.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/models/AuditLogStatus.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/models/CalculationLog.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/serializers/AuditLogMixinSerializer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/serializers/AuditLogSerializer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/serializers/CalculationLogSerializer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/serializers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/CacheManager.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/ContextResolver.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/DataModels.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/InitialDataAuditLogger.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/ModelContext.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/WebSocketNotifier.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/calculation_audit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/content_types.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/latest_calculation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/utils/legacy_audit_payload.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/audit_logging/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/authentication_backends/BearerMiddlewareAuthentication.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/authentication_backends/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/createprofiles.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/delete_keycloak_resources.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/keycloak_backup.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/keycloak_init_bak.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/keycloak_rollback_bak.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/management/commands/register_keycloak_resources.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/middleware.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/migrations/0001_initial.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/models/Profile.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/utils/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/utils/lex_authentication.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/views/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/views/permissions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/views/token_views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/authentication/views/user_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/backfill_history_sql.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/bin/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/bin/lex.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/calculated_updates/ObjectsToRecalculateStore.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/calculated_updates/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/calculated_updates/update_handler.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/cancellation/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/cancellation/cluster_cancel_index.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/exceptions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/fields/PDF_field.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/fields/XLSX_field.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/fields/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/management/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/management/commands/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/management/commands/bootstrap_callback_server.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/middleware/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/middleware/embed_token_auth.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/middleware/embed_xframe.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/migrations/0001_bitemporal_activation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/mixins/CalculatedModelMixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/mixins/ModelModificationRestriction.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/mixins/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models/CalculationModel.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models/HTMLReport.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models/LexModel.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models/Process.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/Bitemporal.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/MetaHistory.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/StandardHistory.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/activation_applier.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/bitemporal_signals.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/services/signal_registry.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/signals/ActiveCalculationStateStore.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/signals/CalculationSignals.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/signals/ModelMutationSignal.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/signals/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/sql/bitemporal_activation.sql +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tasks/CeleryTaskDispatcher.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tasks/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tests/_bitemporal_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tests/bitemporal_test_settings.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tests/check_schema.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/tests/test_calculation_history_transitions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/transactions/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/transactions/transactions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/core/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/extract_legacy_logs.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/fix_v1_migration.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/full_migration_workflow.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/helpers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/helpers/cache_tables.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/legacy_calculation_id_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/legacy_calculation_log_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/legacy_log_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/legacy_user_change_log_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/admin/read_only_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/migrations/0001_initial.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/migrations/0002_alter_legacycalculationid_options_and_more.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/migrations/0003_legacylog.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/models/legacy_calculation_id.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/models/legacy_calculation_log.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/models/legacy_log.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/models/legacy_user_change_log.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/serializers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/legacy_data/serializers/legacy_data_serializers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/asgi.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/entrypoint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/exceptions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/heartbeat.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/redis_keys.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/registry.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_recovery/supervisor.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/celery_tasks.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/design_system/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/design_system/lex_tokens.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/fast_health.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/keycloak_exclusions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/Init2.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/backfill_audit_logging.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/backfill_bitemporal_history.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/bootstrap_keycloak.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/capture_db_tables.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/capture_migration_state.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/create_db.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/detect_model_changes.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/full_migration_workflow.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/generate_legacy_freeze_manifest.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/init.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/lex_migrate.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/normalize_is_calculated.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/rebase_incident_datetimes.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/rollback_migration_state.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/run_recovery_supervisor.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/sync_keycloak.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_command.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_payload.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_bootstrap_callback_server.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_init_command.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_lex_pytest_report_flags.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/management/commands/tests/test_migration_workflow_commands.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/migrations/0001_initial.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/migrations/0002_delete_asoftestmodel_and_more.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/Reflex.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/app.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/auth.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/dashboards.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/django_orm.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/examples/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/reflex/examples/_reflex_structure.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/routing.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/runtime_health.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/settings.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/simple_history_config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/Streamlit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/_lex_view_component/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/_lex_view_component/frontend/index.html +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/_widget_host_component/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/_widget_host_component/frontend/index.html +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/eager_frames.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/embed.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/examples/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/examples/_streamlit_structure.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/quackback.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/sidebar.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/theme/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/theme/config_writer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/theme/mapping.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/theme/tokens.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/widgets/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/widgets/host.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/widgets/keys.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/streamlit/widgets/spec.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/tests/ProcessAdminTestCase.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/tests/create_db.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/urls.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/lex_app/wsgi.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/manage.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/mcp_server/tools/embed.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/ModelCollection.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/ModelContainer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/ModelProcessAdmin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/constants.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models/utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/settings/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/settings/process_admin_settings.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/sites/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/sites/process_admin_site.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/tests/django_test_settings.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/tests/urls.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/bitemporal_sync.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/local_scheduler.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/model_registration.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/model_structure.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/utils/model_structure_builder.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/views/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/views/model_relation_views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/process_admin/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/proxy.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/tests.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/react/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/reflex_app.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/restore_legacy_logs.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/runtime_config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/sanitize_v2_migrations.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/streamlit_app.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/streamlit_theme.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/lex_config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/_e2e_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10a_crud_endpoints.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10b_history_endpoint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10c_many_endpoint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10d_reflex_search_exclusion.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10e_schema_introspection.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10f_global_search.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10g_one_endpoint_lifecycle.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10h_lex_api_sdk.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10i_fields_view_and_list_ui.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10j_filter_backends_and_storage.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10k_destroy_with_payload_mixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10l_file_download_view.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10m_calculation_log_tree.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/api_layer/test_10n_active_calculations_endpoint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/extra_models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6a_api_audit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6b_calculation_audit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6c_actor_resolution.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6d_payload_and_gfk.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6e_bulk_audit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6f_resilience.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6g_immutability.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6h_cache_manager.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6i_calculation_via_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6j_audit_utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6k_model_contracts.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6l_context_and_gfk_resolution.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6m_lexlogger_and_websocket.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6n_audit_log_serializers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6o_bulk_audit_normalize.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/audit_logging/test_6q_root_detection_with_headings.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15a_builder_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15b_child_node_creation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15c_silent_and_mixed.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15d_three_level_chain.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15e_combinatorial_pipeline.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15f_save_boundary.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15g_heading_context.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15h_pdf_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15i_latest_run_on_the_row.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculation_logging/test_15j_failed_run_keeps_its_log.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7a_atomic.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7b_non_atomic.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7c_hierarchy.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7d_state_guards.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7e_persistence_internals.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7f_combination_engine.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7g_create_pipeline.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7h_celery_dispatch.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7i_atomicity_matrix.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7j_three_level_matrix.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7k_exceptions_restrictions_xlsx.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7l_recalc_queue.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7m_calc_signals.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7n_cancellation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7o_fk_violation_abort.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7p_streaming_expansion.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7q_worker_default_dispatch.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/calculations/test_7s_calculation_audit_columns.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8a_sync_fallback.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8aa_postrun_shutdown_guard.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8ab_dispatcher_join_worker_safe.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8ac_sync_fallback_idempotent.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8ad_dispatched_task_cancel_marker.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8b_dispatch_context.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8c_calculation_audit_columns.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8g_task_infrastructure.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8h_eager_end_to_end.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8i_scope_contracts.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8j_task_bodies.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8k_redis_broker_integration.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8l_celery_dispatcher.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8m_undecorated_dispatch.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8u_cancel_revoke.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8v_cluster_cascade_cancel.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8w_recovery_terminal_guard.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8x_startup_reset_recovery_handoff.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/celery_async/test_8y_beat_recovery_driver.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2a_create.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2b_read.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2c_update.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2d_delete.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2e_bulk.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2f_missing_scenarios.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2f_ordering.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2g_filtering.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2i_cancel_endpoint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/crud_api/test_2j_instance_api_key.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/design_system/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/design_system/test_lex_tokens.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13a_legacy_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13b_ag_grid_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13c_grouped_selected.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13d_auth_edge.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13e_streaming_fast_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13f_export_timezone.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13g_xlsx_field_timezone.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/exports/test_13h_xlsx_field_binding.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/fixtures/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/gate_selftest/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/gate_selftest/test_gate_selftest.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5_11_fallback_snapshot.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5a_basic_history.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5b_calculation_history.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5c_history_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5g_valid_to_chaining.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5h_suppression_toolkit.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5i_api_contract.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5j_snapshot_actor.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5k_metahistory.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5l_future_valid_from.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5m_asof_edit_time.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/history/test_5o_activation_applier.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/initial_data/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/initial_data/test_1c_initial_data.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/initial_data/test_1f_seed_idempotency.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/initial_data/test_1i_initial_data_journey.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1a_lex_setup.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1aa_embedded_token_renewal.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ab_ignored_role_policy_cleanup.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ac_streamlit_session_survival.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ac_widget_host_manifest.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ad_proxy_assets_and_session_durability.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ad_streamlit_theme_follower.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ae_streamlit_theme.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1af_theme_switch_preserves_brand.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ag_spa_asset_caching.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ah_metadata_cache_headers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ai_eager_component_frames.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1aj_streamlit_sidebar_chrome.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ak_widget_keys_and_flow.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1al_example_dashboard.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1am_quackback_launcher.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1an_proxy_http2_safe_headers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ao_flow_composable_steps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ao_frontend_resolution.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ap_reflex_cli.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1aq_reflex_dashboards.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1ar_reflex_automatic_sign_in.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1as_reflex_token_cookie_compression.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1b_default_authz.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1b_lex_init.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1d_init_helpers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1e_keycloak_sync_manager.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1f_keycloak_drift.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1g_sync_manager_admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1h_bootstrap_flow.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1i_rebase_incident_datetimes.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1j_client_preflight.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1k_client_preflight_integration.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1l_full_pipeline_integration.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1m_cli_commands.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1n_init_helper_paths.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1o_lazy_imports_and_helpers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1p_settings_urls_views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1q_migration_files_complete.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1r_fetched_datetime_zone.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1s_log_cleanup_and_lex_debug.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1t_disable_server_side_cursors.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1u_fast_health_asgi.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1v_scheduler_tz_invariant.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1w_recovery_default_deployment_target.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1x_runtime_health_metadata.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1y_ide_run_configs.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/init/test_1z_proxy_iframe_breakout.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/test_journey_a_invoice_lifecycle.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/test_journey_b_portfolio_calculation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/test_journey_c_role_aware_visibility.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/test_journey_d_audit_trail.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/journeys/test_journey_e_validation_gate.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4a_field_level.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4b_action_level.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4c_keycloak_fallback.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4d_user_context.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4e_filter_backend.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4f_serializer_mixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4g_user_permissions_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4h_full_deny_matrix.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4i_permission_helpers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4j_filter_backends.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4m_api_key_middleware.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/permissions/test_4n_reflex_permissions.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/test_14a_query_params.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/test_14b_ag_post_filter_model.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/test_14c_ag_post_group_pivot.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/test_14e_secondary_branches.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/queries/test_14h_list_query_paths.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12a_history_meta_scopes.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12a_read_contract.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12b_type_roundtrip.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12c_list_and_many.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12d_audit_log_payload.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12e_factory.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12f_write_paths.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12g_datetime_tz_ambiguity.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12h_filefield_clear.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12i_fk_display_names.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12j_datetime_roundtrip_convention.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/serializers/test_12k_sensitive_field_denylist.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9_7_suppression_guards.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9a_state_and_broadcast.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9c_cache_cleanup.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9d_active_calculation_state_store.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9e_model_mutation_broadcast.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/signals_ws/test_9f_core_consumers.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/_stress_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11a_seed_baseline.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11b_list.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11c_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11d_period_calc.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11e_bulk_api.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11f_growth_and_scale.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11g_fk_heavy_export.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11h_calc_log_overhead.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/stress/test_11i_save_fingerprint.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3a_pre_validation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3b_post_validation.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3c_hook_ordering.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3d_recursion_guard.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3e_snapshot_lifecycle.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3f_lean_initial_state.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/test_project/tests/validation_hooks/test_3g_aware_datetime_assignment.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/e2e/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/e2e/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/e2e/_e2e_test_case.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/calculation/test_calculated_model_mixin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/calculation/test_calculation_wait_contexts.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_ai_asset_mode_sync.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_ai_update_bootstrap.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_ai_windows_parity.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_celery_recovery.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_mcp_server_sdk_compat.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tests/unit/infra/test_worker_self_termination.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/ai_dashboard.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/ai_faq.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/ai_issue_report.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/ai_worktree.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/django_bootstrap.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/mcp_mode_invoke.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/project_root.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/setup_with_ai.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/test_groups.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/tools/verify_ai_assets.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/admin.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/apps.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/channel_layer.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/config/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/config/generic_app_config.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/decorators/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/decorators/singleton.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/import_system/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/import_system/import_utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/import_system/model_loader.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/import_system/module_finder.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/migrations/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/models.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/storage/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/storage/custom_storage.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/utils/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/utils/gcs_utils.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex/utilities/views.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex_app.egg-info/dependency_links.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex_app.egg-info/entry_points.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex_app.egg-info/requires.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/lex_app.egg-info/top_level.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/migrations_logic/__init__.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/migrations_logic/fix_migrations.py +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/pyproject.toml +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/requirements.txt +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/setup.cfg +0 -0
- {lex_app-2.3.2 → lex_app-2.3.4}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.3.4"
|
|
@@ -80,6 +80,51 @@ def _make_app_module_findable() -> None:
|
|
|
80
80
|
sys.path.append(parent)
|
|
81
81
|
|
|
82
82
|
|
|
83
|
+
def _repair_single_port_proxy() -> None:
|
|
84
|
+
"""Mount Reflex Enterprise's single-port proxy on the Reflex backend itself.
|
|
85
|
+
|
|
86
|
+
``use_single_port`` (``REFLEX_USE_SINGLE_PORT``) has the backend answer its
|
|
87
|
+
own routes and pass every other request to the frontend server, so that a
|
|
88
|
+
development run -- two servers -- works behind the one port a pod exposes.
|
|
89
|
+
reflex-enterprise 0.9.6 never manages it on Reflex 0.9.12:
|
|
90
|
+
|
|
91
|
+
* its lifespan task names its parameter ``app``, and Reflex passes the
|
|
92
|
+
*Reflex* app under that name (the Starlette app only as
|
|
93
|
+
``starlette_app``), so it logs "Unable to find the base Starlette app";
|
|
94
|
+
* given the Starlette app, it mounts on the outermost one, and Reflex
|
|
95
|
+
reaches its backend through a catch-all ``Mount("")`` there. Behind an
|
|
96
|
+
``api_transformer`` that wraps the backend in ASGI middleware (RFDS's
|
|
97
|
+
security headers do), the proxy lands after that mount and is never
|
|
98
|
+
reached. Every page 404s either way.
|
|
99
|
+
|
|
100
|
+
So the replacement takes the Reflex app and hands the proxy its backend,
|
|
101
|
+
``app._api`` -- where Reflex itself mounts a compiled frontend -- inside
|
|
102
|
+
every wrapper, after every backend route. Reflex Enterprise imports the
|
|
103
|
+
proxy when it builds the app, after ``rxconfig.py`` has run, so replacing
|
|
104
|
+
the module's function is enough. The stand-in Reflex Enterprise defines
|
|
105
|
+
when asgiproxy is missing, which names no parameter, is left alone, and so
|
|
106
|
+
is this replacement itself.
|
|
107
|
+
"""
|
|
108
|
+
import contextlib
|
|
109
|
+
import inspect
|
|
110
|
+
|
|
111
|
+
from reflex_enterprise import proxy
|
|
112
|
+
|
|
113
|
+
upstream = proxy.proxy_middleware
|
|
114
|
+
if getattr(upstream, "lex_mounts_on_backend", False):
|
|
115
|
+
return
|
|
116
|
+
if not {"app", "starlette_app"} & set(inspect.signature(upstream).parameters):
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
@contextlib.asynccontextmanager
|
|
120
|
+
async def proxy_middleware(app):
|
|
121
|
+
async with upstream(app._api):
|
|
122
|
+
yield
|
|
123
|
+
|
|
124
|
+
proxy_middleware.lex_mounts_on_backend = True
|
|
125
|
+
proxy.proxy_middleware = proxy_middleware
|
|
126
|
+
|
|
127
|
+
|
|
83
128
|
def lex_auth_plugin(**options: Any):
|
|
84
129
|
"""``rxe.AuthPlugin``, signing users in against lex-app's Keycloak.
|
|
85
130
|
|
|
@@ -91,6 +136,10 @@ def lex_auth_plugin(**options: Any):
|
|
|
91
136
|
"""
|
|
92
137
|
import reflex_enterprise as rxe
|
|
93
138
|
|
|
139
|
+
# Here because every project's rxconfig.py calls this -- `lex_config()`
|
|
140
|
+
# does, and so does a hand-written one that keeps lex-app's sign-in -- and
|
|
141
|
+
# Reflex reads rxconfig.py before it builds the app.
|
|
142
|
+
_repair_single_port_proxy()
|
|
94
143
|
options.setdefault("auth_providers", [AUTH_PROVIDER])
|
|
95
144
|
options.setdefault("login_page", LOGIN_PAGE)
|
|
96
145
|
return rxe.AuthPlugin(**options)
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""Cluster 1at: one port serves a Reflex development run -- the backend and the pages.
|
|
2
|
+
|
|
3
|
+
Intent
|
|
4
|
+
------
|
|
5
|
+
A pod exposes one port, and a Reflex development run has two servers: Vite for
|
|
6
|
+
the pages, and the backend for ``/_event``, ``/_upload``, ``/ping`` and the
|
|
7
|
+
sign-in routes. Reflex Enterprise's single-port mode (``use_single_port``,
|
|
8
|
+
``REFLEX_USE_SINGLE_PORT``) joins them -- the backend answers its own routes and
|
|
9
|
+
passes every other request on to the frontend server -- and that is how the
|
|
10
|
+
platform starts a project's dashboards. On reflex-enterprise 0.9.6 with Reflex
|
|
11
|
+
0.9.12 the mode did nothing but log "Unable to find the base Starlette app":
|
|
12
|
+
Reflex passes a lifespan task the Reflex app under a parameter named ``app`` and
|
|
13
|
+
the Starlette app only as ``starlette_app``, and the proxy names its parameter
|
|
14
|
+
``app``. Handed the Starlette app, it mounts on the outermost one, where Reflex
|
|
15
|
+
reaches its backend through a catch-all mount -- behind an ``api_transformer``
|
|
16
|
+
that wraps the backend in middleware, as RFDS's security headers do, the proxy
|
|
17
|
+
is never reached. lex-app mounts it on the Reflex backend itself, so:
|
|
18
|
+
|
|
19
|
+
* a project's ``rxconfig.py`` repairs the proxy as Reflex loads it --
|
|
20
|
+
``lex_config()`` in the one ``lex reflex`` writes, ``lex_auth_plugin()`` in a
|
|
21
|
+
hand-written one -- and the configuration is still the project's;
|
|
22
|
+
* run the way Reflex runs it, with or without middleware around the backend,
|
|
23
|
+
the backend's port answers the backend's routes itself and every other path,
|
|
24
|
+
query string included, from the frontend server;
|
|
25
|
+
* repairing again changes nothing, and the stand-in Reflex Enterprise defines
|
|
26
|
+
without asgiproxy is left exactly as it is.
|
|
27
|
+
|
|
28
|
+
A regression reads as "the dashboard's URL answers /ping and 404s every page".
|
|
29
|
+
|
|
30
|
+
Cluster 1at -- scenarios 1.381-1.383. Type: U.
|
|
31
|
+
Covers: lex/lex_app/reflex/config.py (``lex_auth_plugin``, ``_repair_single_port_proxy``).
|
|
32
|
+
Run: python -m lex pytest lex/test_project/tests/init/test_1at_reflex_single_port_proxy.py -v
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import contextlib
|
|
38
|
+
import importlib
|
|
39
|
+
import inspect
|
|
40
|
+
import os
|
|
41
|
+
import subprocess
|
|
42
|
+
import sys
|
|
43
|
+
import tempfile
|
|
44
|
+
import threading
|
|
45
|
+
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
from unittest import TestCase
|
|
48
|
+
from unittest.mock import patch
|
|
49
|
+
|
|
50
|
+
import pytest
|
|
51
|
+
import reflex_enterprise as rxe
|
|
52
|
+
from reflex.app_mixins.lifespan import LifespanMixin
|
|
53
|
+
from reflex_enterprise import proxy
|
|
54
|
+
from reflex_enterprise.app import AppEnterprise
|
|
55
|
+
from starlette.applications import Starlette
|
|
56
|
+
from starlette.responses import PlainTextResponse
|
|
57
|
+
from starlette.routing import Route
|
|
58
|
+
from starlette.testclient import TestClient
|
|
59
|
+
|
|
60
|
+
from lex.lex_app.reflex.config import lex_auth_plugin
|
|
61
|
+
|
|
62
|
+
pytestmark = pytest.mark.init
|
|
63
|
+
|
|
64
|
+
#: Variables that would change the configuration under test, cleared so the host's own cannot leak in.
|
|
65
|
+
_REFLEX_ENV = (
|
|
66
|
+
"REFLEX_USE_SINGLE_PORT", "REFLEX_FRONTEND_PORT", "REFLEX_BACKEND_PORT", "REFLEX_BACKEND_ONLY",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
#: A hand-written rxconfig.py that keeps lex-app's sign-in, as a project with its own app module has.
|
|
70
|
+
_HAND_WRITTEN_RXCONFIG = '''
|
|
71
|
+
import reflex_enterprise as rxe
|
|
72
|
+
|
|
73
|
+
from lex.lex_app.reflex import lex_auth_plugin
|
|
74
|
+
|
|
75
|
+
config = rxe.Config(app_name="hand_written", plugins=[lex_auth_plugin()])
|
|
76
|
+
'''
|
|
77
|
+
|
|
78
|
+
#: What a fresh Reflex process reports once it has loaded the project's configuration.
|
|
79
|
+
_LOAD_CONFIG = (
|
|
80
|
+
"import inspect\n"
|
|
81
|
+
"from reflex.config import get_config\n"
|
|
82
|
+
"config = get_config()\n"
|
|
83
|
+
"from reflex_enterprise import proxy\n"
|
|
84
|
+
"print(config.app_name, config.module,\n"
|
|
85
|
+
" getattr(proxy.proxy_middleware, 'lex_mounts_on_backend', False))\n"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _parameters(function) -> list[str]:
|
|
90
|
+
"""The parameter names Reflex sees when it decides what to pass a lifespan task."""
|
|
91
|
+
return list(inspect.signature(function).parameters)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@contextlib.contextmanager
|
|
95
|
+
def _shipped_proxy():
|
|
96
|
+
"""Reflex Enterprise's proxy module as it ships, and whatever it held before restored afterwards."""
|
|
97
|
+
before = proxy.proxy_middleware
|
|
98
|
+
importlib.reload(proxy)
|
|
99
|
+
try:
|
|
100
|
+
yield
|
|
101
|
+
finally:
|
|
102
|
+
proxy.proxy_middleware = before
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@contextlib.contextmanager
|
|
106
|
+
def _frontend_server():
|
|
107
|
+
"""A stand-in for Vite on a free port, answering every GET with the path it was asked for."""
|
|
108
|
+
|
|
109
|
+
class Handler(BaseHTTPRequestHandler):
|
|
110
|
+
def do_GET(self) -> None: # noqa: N802 - the name http.server dispatches to
|
|
111
|
+
body = f"frontend:{self.path}".encode()
|
|
112
|
+
self.send_response(200)
|
|
113
|
+
self.send_header("Content-Type", "text/plain")
|
|
114
|
+
self.send_header("Content-Length", str(len(body)))
|
|
115
|
+
self.end_headers()
|
|
116
|
+
self.wfile.write(body)
|
|
117
|
+
|
|
118
|
+
def log_message(self, *args) -> None:
|
|
119
|
+
"""Silent: the suite's output is the assertions'."""
|
|
120
|
+
|
|
121
|
+
server = ThreadingHTTPServer(("localhost", 0), Handler)
|
|
122
|
+
thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
123
|
+
thread.start()
|
|
124
|
+
try:
|
|
125
|
+
yield server.server_address[1]
|
|
126
|
+
finally:
|
|
127
|
+
server.shutdown()
|
|
128
|
+
server.server_close()
|
|
129
|
+
thread.join(timeout=5)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@contextlib.contextmanager
|
|
133
|
+
def _clean_reflex_env():
|
|
134
|
+
with patch.dict(os.environ, {}, clear=False):
|
|
135
|
+
for name in _REFLEX_ENV:
|
|
136
|
+
os.environ.pop(name, None)
|
|
137
|
+
yield
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class TestCluster01at_SinglePortProxy(TestCase):
|
|
141
|
+
"""Reflex Enterprise's single-port proxy, given the Starlette app by lex-app."""
|
|
142
|
+
|
|
143
|
+
# -- 1.381 ---------------------------------------------------------
|
|
144
|
+
def test_1_381_a_projects_rxconfig_repairs_the_proxy_as_reflex_loads_it(self) -> None:
|
|
145
|
+
"""
|
|
146
|
+
Scenario 1.381: a project's rxconfig.py repairs the proxy as Reflex loads it.
|
|
147
|
+
Given: a project whose rxconfig.py is the one ``lex reflex`` writes, or a
|
|
148
|
+
hand-written one that keeps lex-app's sign-in, and a fresh
|
|
149
|
+
interpreter -- the way every Reflex worker starts.
|
|
150
|
+
When: Reflex loads the configuration, before it would build the app.
|
|
151
|
+
Then: the configuration is the project's own, and Reflex Enterprise's
|
|
152
|
+
proxy is lex-app's, which mounts on the Reflex backend.
|
|
153
|
+
"""
|
|
154
|
+
from lex.bin.lex import _ensure_reflex_config
|
|
155
|
+
|
|
156
|
+
cases = {
|
|
157
|
+
"written by lex reflex": ("lex.reflex_app", None),
|
|
158
|
+
"hand-written": ("hand_written.hand_written", _HAND_WRITTEN_RXCONFIG),
|
|
159
|
+
}
|
|
160
|
+
for case, (app_module, source) in cases.items():
|
|
161
|
+
with self.subTest(rxconfig=case), tempfile.TemporaryDirectory() as tmp, _clean_reflex_env():
|
|
162
|
+
if source is None:
|
|
163
|
+
_ensure_reflex_config(Path(tmp))
|
|
164
|
+
else:
|
|
165
|
+
(Path(tmp) / "rxconfig.py").write_text(source, encoding="utf-8")
|
|
166
|
+
result = subprocess.run(
|
|
167
|
+
[sys.executable, "-c", _LOAD_CONFIG], capture_output=True, text=True,
|
|
168
|
+
timeout=300, cwd=tmp,
|
|
169
|
+
)
|
|
170
|
+
self.assertEqual(result.returncode, 0, msg=result.stderr[-2000:])
|
|
171
|
+
app_name, loaded_module, repaired = result.stdout.strip().splitlines()[-1].split()
|
|
172
|
+
self.assertEqual(
|
|
173
|
+
loaded_module, app_module, f"Reflex must still load the project's configuration ({case})",
|
|
174
|
+
)
|
|
175
|
+
self.assertNotEqual(app_name, "", "the configuration names the app")
|
|
176
|
+
self.assertEqual(repaired, "True", f"rxconfig.py ({case}) must leave lex-app's proxy in place")
|
|
177
|
+
|
|
178
|
+
# -- 1.382 ---------------------------------------------------------
|
|
179
|
+
def test_1_382_one_port_answers_the_backend_routes_and_proxies_every_page(self) -> None:
|
|
180
|
+
"""
|
|
181
|
+
Scenario 1.382: run the way Reflex runs it, one port serves the backend and the pages.
|
|
182
|
+
Given: a frontend server on its own port, a single-port configuration,
|
|
183
|
+
Reflex Enterprise's proxy as it ships once rxconfig.py has built
|
|
184
|
+
lex-app's sign-in plugin, and the backend assembled as Reflex
|
|
185
|
+
assembles it -- mounted under a catch-all in the outermost app,
|
|
186
|
+
bare or wrapped in ASGI middleware by an ``api_transformer``.
|
|
187
|
+
When: Reflex Enterprise registers the proxy, as it does when it builds
|
|
188
|
+
the app; Reflex runs its lifespan tasks; and a browser asks the
|
|
189
|
+
backend's port for ``/ping`` and for a page.
|
|
190
|
+
Then: ``/ping`` is the backend's own answer, and the page -- its path
|
|
191
|
+
and query string -- is the frontend server's, through the
|
|
192
|
+
middleware when there is some.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
def wrapped(inner):
|
|
196
|
+
async def middleware(scope, receive, send):
|
|
197
|
+
if scope["type"] != "http":
|
|
198
|
+
return await inner(scope, receive, send)
|
|
199
|
+
|
|
200
|
+
async def marked(message):
|
|
201
|
+
if message["type"] == "http.response.start":
|
|
202
|
+
message = {**message, "headers": [*message.get("headers", []), (b"x-wrapped", b"yes")]}
|
|
203
|
+
await send(message)
|
|
204
|
+
|
|
205
|
+
await inner(scope, receive, marked)
|
|
206
|
+
|
|
207
|
+
return middleware
|
|
208
|
+
|
|
209
|
+
for case, transform in {"bare": None, "wrapped in middleware": wrapped}.items():
|
|
210
|
+
# In a directory of its own: Reflex Enterprise's registration notes its session in `.web/` under the cwd.
|
|
211
|
+
with self.subTest(backend=case), tempfile.TemporaryDirectory() as tmp, contextlib.chdir(tmp), \
|
|
212
|
+
_frontend_server() as frontend_port, _shipped_proxy(), _clean_reflex_env():
|
|
213
|
+
self.assertEqual(_parameters(proxy.proxy_middleware), ["app"], "the proxy as it ships")
|
|
214
|
+
lex_auth_plugin()
|
|
215
|
+
|
|
216
|
+
config = rxe.Config(
|
|
217
|
+
app_name="single_port_probe", use_single_port=True,
|
|
218
|
+
frontend_port=frontend_port, backend_port=frontend_port + 1,
|
|
219
|
+
)
|
|
220
|
+
reflex_app = LifespanMixin()
|
|
221
|
+
reflex_app._api = Starlette(routes=[Route("/ping", lambda request: PlainTextResponse("pong"))])
|
|
222
|
+
with patch("reflex_enterprise.app.get_config", return_value=config), \
|
|
223
|
+
patch("reflex_enterprise.proxy.get_config", return_value=config):
|
|
224
|
+
AppEnterprise._verify_and_setup_proxy(reflex_app)
|
|
225
|
+
self.assertEqual(len(reflex_app.get_lifespan_tasks()), 1, "one lifespan task: the proxy")
|
|
226
|
+
# What `reflex.app.App.__call__` builds: the backend, transformed, under a catch-all mount.
|
|
227
|
+
backend = reflex_app._api if transform is None else transform(reflex_app._api)
|
|
228
|
+
outermost = Starlette(lifespan=reflex_app._run_lifespan_tasks)
|
|
229
|
+
outermost.mount("", backend)
|
|
230
|
+
with TestClient(outermost) as browser:
|
|
231
|
+
ping = browser.get("/ping")
|
|
232
|
+
page = browser.get("/funds/42?tab=history")
|
|
233
|
+
|
|
234
|
+
self.assertEqual((ping.status_code, ping.text), (200, "pong"), "a backend route is the backend's")
|
|
235
|
+
self.assertEqual(
|
|
236
|
+
(page.status_code, page.text), (200, "frontend:/funds/42?tab=history"),
|
|
237
|
+
f"every other path must reach the frontend server through the backend's port ({case})",
|
|
238
|
+
)
|
|
239
|
+
if transform is not None:
|
|
240
|
+
self.assertEqual(page.headers.get("x-wrapped"), "yes", "a proxied page passes the middleware")
|
|
241
|
+
|
|
242
|
+
# -- 1.383 ---------------------------------------------------------
|
|
243
|
+
def test_1_383_repairing_again_or_a_proxy_that_needs_no_repair_changes_nothing(self) -> None:
|
|
244
|
+
"""
|
|
245
|
+
Scenario 1.383: the repair applies once, and not to the stand-in.
|
|
246
|
+
Given: the proxy as it ships, already repaired once; and the stand-in
|
|
247
|
+
Reflex Enterprise defines without asgiproxy, which names no
|
|
248
|
+
parameter.
|
|
249
|
+
When: ``lex_auth_plugin()`` builds the sign-in plugin again, as a
|
|
250
|
+
reloaded configuration does.
|
|
251
|
+
Then: each proxy is left exactly as it was.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
@contextlib.asynccontextmanager
|
|
255
|
+
async def stand_in(*args, **kwargs):
|
|
256
|
+
yield
|
|
257
|
+
|
|
258
|
+
with _shipped_proxy():
|
|
259
|
+
lex_auth_plugin()
|
|
260
|
+
repaired = proxy.proxy_middleware
|
|
261
|
+
self.assertTrue(getattr(repaired, "lex_mounts_on_backend", False), "the first build repairs the proxy")
|
|
262
|
+
self.assertEqual(_parameters(repaired), ["app"], "it takes the Reflex app, whose backend it mounts on")
|
|
263
|
+
lex_auth_plugin()
|
|
264
|
+
self.assertIs(proxy.proxy_middleware, repaired, "a second build must not wrap the repair again")
|
|
265
|
+
|
|
266
|
+
with patch.object(proxy, "proxy_middleware", stand_in):
|
|
267
|
+
lex_auth_plugin()
|
|
268
|
+
self.assertIs(proxy.proxy_middleware, stand_in, "the stand-in without asgiproxy needs no repair")
|
|
@@ -529,6 +529,7 @@ lex/test_project/tests/init/test_1ap_reflex_cli.py
|
|
|
529
529
|
lex/test_project/tests/init/test_1aq_reflex_dashboards.py
|
|
530
530
|
lex/test_project/tests/init/test_1ar_reflex_automatic_sign_in.py
|
|
531
531
|
lex/test_project/tests/init/test_1as_reflex_token_cookie_compression.py
|
|
532
|
+
lex/test_project/tests/init/test_1at_reflex_single_port_proxy.py
|
|
532
533
|
lex/test_project/tests/init/test_1b_default_authz.py
|
|
533
534
|
lex/test_project/tests/init/test_1b_lex_init.py
|
|
534
535
|
lex/test_project/tests/init/test_1d_init_helpers.py
|
lex_app-2.3.2/lex/_version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.3.2"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py
RENAMED
|
File without changes
|
{lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py
RENAMED
|
File without changes
|
{lex_app-2.3.2 → lex_app-2.3.4}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|