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