pyarchinit-mini 2.4.1__tar.gz → 2.4.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.
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/CHANGELOG.md +44 -0
- {pyarchinit_mini-2.4.1/pyarchinit_mini.egg-info → pyarchinit_mini-2.4.3}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/__init__.py +1 -1
- pyarchinit_mini-2.4.3/pyarchinit_mini/harris_swimlane/period_sync_service.py +111 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/row_provider.py +23 -13
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/harris_creator_routes.py +33 -14
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyproject.toml +1 -1
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/fixtures/_generate_harris_swimlane_synthetic.py +18 -17
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_harris_swimlane_routes_create_row.py +6 -3
- pyarchinit_mini-2.4.3/tests/integration/test_harris_swimlane_routes_session_missing.py +57 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_period_sync.py +28 -12
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_row_provider.py +30 -33
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_state_load.py +6 -8
- pyarchinit_mini-2.4.1/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -90
- pyarchinit_mini-2.4.1/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -23
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/MANIFEST.in +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/README.md +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/babel.cfg +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/media_viewer_demo.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_mini 2.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_mini.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_mini_sample.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_tutorial.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_tutorial_clean.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_tutorial_video.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/data/pyarchinit_v18_demo.db +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/logo/logo_pyarchinit-mini.png +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/auth.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/dependencies.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/graphml.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/inventario.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/schemas.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/site.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/sync.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/api/us.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/export_import_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/graphml_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/harris_import.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/harris_template.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/migrate.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli/sync_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli_interface/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/config/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/config/connection_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/config/em_node_types.yaml +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/connection.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/database_creator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migrations/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/migrations/backup.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/postgres_installer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/schemas.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/database/utils.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/icons.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/dto/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/dto/inventario_dto.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/dto/site_dto.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/dto/us_dto.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/converter.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_io/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_io/reader.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_io/writer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphml_io/yed_writer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/filesystem.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/ingestor.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/graphproj/projector.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/swimlane_state.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/i18n/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/i18n/locale_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/__main__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/config.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/http_server.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/server.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/media_manager/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/media_manager/media_handler.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/ai_chat.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/app_setting.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/base.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/datazione.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/extended_matrix.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/harris_matrix.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/inventario_materiali.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/media.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/pottery.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/site.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/thesaurus.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/tma.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/us.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/models/user.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/auto_translate.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/setup_auth.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/scripts/verify_docs.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/ai_chat_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/analytics_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/backup_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/command_parser.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/datazione_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/export_import_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/import_export_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/inventario_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/mcp_executor.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/media_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/pottery_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/search_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/site_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/thesaurus_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/tma_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/us_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/services/user_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/translations/messages.pot +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/auth.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/relationship_validator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/utils/validators.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/i18n.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/loader.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/provider.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/translations/vocab_it.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/vocab/types.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/app.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/pottery_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/base.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pottery/detail.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pottery/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/SOURCES.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/requires.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini.egg-info/top_level.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/requirements.txt +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/setup.cfg +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/setup.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/conftest.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/e2e/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/e2e/test_web_vocab_full_flow.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/fixtures/_generate_baseline_graphml.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/fixtures/_generate_synthetic_db.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/fixtures/build_legacy_with_pottery.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_admin_ai_settings_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_admin_backup_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_auto_regen_on_save.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_full_sync_flow.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_graph_import_flow.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_graph_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_migrate_vocab_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_paradata_routes_authors.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_paradata_routes_other_types.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_paradata_ui.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_pottery_completion.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_pottery_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_spec2_coverage_gaps.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_vocab_routes.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_yed_export_route.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/integration/test_yed_writer_parity.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/__init__.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_app_setting_model.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_app_setting_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_auto_regen.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_backup_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_bundle.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_concurrency_columns.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_concurrency_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_database_utils.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_deprecated_writers_shim.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_em_palette_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphml_io_reader.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphml_io_writer.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_edge_registry.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_filesystem.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_graphproj_projector.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_state_save.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_ingest_plan.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_inventario_schema.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_migrations_backup.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_migrations_idempotent.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_optimistic_locking.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_paradata_store_authors.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_paradata_store_basic.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_paradata_store_other_types.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_pottery_dto.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_pottery_model.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_pottery_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_site_service.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_sync_api.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_sync_cli.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_sync_queue.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_sync_state_machine.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_us_schema.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_uuid_manager.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_exceptions.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_i18n.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_loader.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_provider.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_vocab_types.py +0 -0
- {pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_yed_writer.py +0 -0
|
@@ -1,3 +1,47 @@
|
|
|
1
|
+
## [2.4.3] - 2026-05-18
|
|
2
|
+
|
|
3
|
+
### Fixed (IT)
|
|
4
|
+
- `RowProvider` e `PeriodSyncService` ora usano lo schema reale di pyarchinit
|
|
5
|
+
per `period_table` (`periodo` / `fase` / `datazione` / `sito`) invece dello
|
|
6
|
+
schema ipotetico Spec 3-bis (`period_name` / `phase_name` / `start_date` /
|
|
7
|
+
`end_date`). Risolve l'HTTP 500 "la colonna 'period_name' non esiste"
|
|
8
|
+
visto in produzione su PostgreSQL `pyarchinit_v2`.
|
|
9
|
+
- `period_table` viene ora filtrato per `sito` (con fallback a righe
|
|
10
|
+
cross-site se `sito` IS NULL/''). `start_date` / `end_date` numerici non
|
|
11
|
+
esistono in produzione: nella Row dataclass restano `None` e il sort è
|
|
12
|
+
alfabetico per `(periodo, fase)`. Le date numeriche passate da `+ New
|
|
13
|
+
Row` vengono serializzate nella colonna `datazione` come `start..end`.
|
|
14
|
+
- Fixture sintetica `sqlite_volterra_30us_with_periods.db` e i test
|
|
15
|
+
associati (row_provider, period_sync, state_load, integration routes)
|
|
16
|
+
rigenerati con lo schema reale.
|
|
17
|
+
|
|
18
|
+
### Fixed (EN)
|
|
19
|
+
- `RowProvider` and `PeriodSyncService` now use pyarchinit's real
|
|
20
|
+
`period_table` schema (`periodo` / `fase` / `datazione` / `sito`).
|
|
21
|
+
Fixes the HTTP 500 "column 'period_name' does not exist" against the
|
|
22
|
+
production PostgreSQL DB.
|
|
23
|
+
- Numeric `start_date` / `end_date` are no longer expected as columns; the
|
|
24
|
+
Row dataclass leaves them `None`, rows are sorted alphabetically by
|
|
25
|
+
`(periodo, fase)`, and date inputs from the editor are serialized into
|
|
26
|
+
the existing `datazione` text column as `start..end`.
|
|
27
|
+
|
|
28
|
+
## [2.4.2] - 2026-05-18
|
|
29
|
+
|
|
30
|
+
### Fixed (IT)
|
|
31
|
+
- `_get_session()` (Spec 3-bis endpoints) ora acquisisce la sessione DB in modo
|
|
32
|
+
lazy via `get_db_session()` se nessun before_request hook ha pre-impostato
|
|
33
|
+
`g.db_session`. Risolve l'errore HTTP 500 "g.db_session not set" che
|
|
34
|
+
bloccava load / save / + Row / Export yEd su Adarte in 2.4.0-2.4.1.
|
|
35
|
+
- Aggiunto `teardown_request` sul blueprint che rilascia la sessione lazy
|
|
36
|
+
alla fine della request.
|
|
37
|
+
|
|
38
|
+
### Fixed (EN)
|
|
39
|
+
- `_get_session()` now lazily opens a DB session via `get_db_session()` when no
|
|
40
|
+
before_request hook has bound one to `g.db_session`. Fixes the HTTP 500
|
|
41
|
+
"g.db_session not set" that broke load / save / + Row / Export on production
|
|
42
|
+
in 2.4.0-2.4.1.
|
|
43
|
+
- Added `teardown_request` hook releasing the lazy session at request end.
|
|
44
|
+
|
|
1
45
|
## [2.4.1] - 2026-05-18
|
|
2
46
|
|
|
3
47
|
### Fixed (IT)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyarchinit-mini
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, CLI, multi-user authentication, real-time collaboration, analytics dashboard, PyArchInit import/export, Heriverse/ATON export integration, and 3D CRUD viewer
|
|
5
5
|
Home-page: https://github.com/enzococca/pyarchinit-mini
|
|
6
6
|
Author: PyArchInit Team
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""PeriodSyncService — interactive row creation upserts period_table.
|
|
2
|
+
|
|
3
|
+
When user creates a new swimlane row in the editor, this service ensures
|
|
4
|
+
a corresponding ``period_table`` entry exists. Uses the real pyarchinit
|
|
5
|
+
schema: ``periodo`` / ``fase`` / ``datazione`` (NO numeric start/end columns).
|
|
6
|
+
|
|
7
|
+
Caller-supplied ``start_date`` / ``end_date`` (ints) are stringified into
|
|
8
|
+
``datazione`` as ``"start..end"`` when both provided, single year otherwise.
|
|
9
|
+
On promote (``maybe_promote_fallback``), idempotency is on ``(periodo, fase)``.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import Optional
|
|
14
|
+
|
|
15
|
+
from sqlalchemy import text
|
|
16
|
+
from sqlalchemy.orm import Session
|
|
17
|
+
|
|
18
|
+
from .compound_layout import derive_row_id
|
|
19
|
+
from .exceptions import PeriodSyncError
|
|
20
|
+
from .row_provider import Row, PERIOD_COLORS
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _format_datazione(start: Optional[int], end: Optional[int]) -> Optional[str]:
|
|
24
|
+
if start is None and end is None:
|
|
25
|
+
return None
|
|
26
|
+
if start is not None and end is not None:
|
|
27
|
+
return f"{start}..{end}"
|
|
28
|
+
return str(start if start is not None else end)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class PeriodSyncService:
|
|
32
|
+
def __init__(self, session: Session, site: Optional[str] = None) -> None:
|
|
33
|
+
self.session = session
|
|
34
|
+
self.site = site
|
|
35
|
+
|
|
36
|
+
def upsert_row(self, period_name: str, phase_name: Optional[str] = None,
|
|
37
|
+
start_date: Optional[int] = None,
|
|
38
|
+
end_date: Optional[int] = None) -> Row:
|
|
39
|
+
if not period_name or not period_name.strip():
|
|
40
|
+
raise PeriodSyncError("period_name is required",
|
|
41
|
+
period_name=period_name, phase_name=phase_name)
|
|
42
|
+
if start_date is not None and end_date is not None and start_date > end_date:
|
|
43
|
+
raise PeriodSyncError(
|
|
44
|
+
"start_date must be <= end_date",
|
|
45
|
+
period_name=period_name, phase_name=phase_name,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
existing = self.session.execute(text(
|
|
49
|
+
"SELECT id_period FROM period_table "
|
|
50
|
+
"WHERE periodo = :p AND "
|
|
51
|
+
"(fase = :ph OR (fase IS NULL AND :ph IS NULL))"
|
|
52
|
+
), {"p": period_name, "ph": phase_name}).fetchone()
|
|
53
|
+
|
|
54
|
+
if existing is None:
|
|
55
|
+
self.session.execute(text(
|
|
56
|
+
"INSERT INTO period_table (sito, periodo, fase, datazione) "
|
|
57
|
+
"VALUES (:s, :p, :ph, :dz)"
|
|
58
|
+
), {
|
|
59
|
+
"s": self.site,
|
|
60
|
+
"p": period_name,
|
|
61
|
+
"ph": phase_name,
|
|
62
|
+
"dz": _format_datazione(start_date, end_date),
|
|
63
|
+
})
|
|
64
|
+
self.session.commit()
|
|
65
|
+
|
|
66
|
+
row_id = derive_row_id(period_name, phase_name)
|
|
67
|
+
return Row(
|
|
68
|
+
row_id=row_id,
|
|
69
|
+
period_name=period_name,
|
|
70
|
+
phase_name=phase_name,
|
|
71
|
+
start_date=start_date,
|
|
72
|
+
end_date=end_date,
|
|
73
|
+
color=PERIOD_COLORS[0],
|
|
74
|
+
source="period_table",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def maybe_promote_fallback(self, site: str) -> int:
|
|
78
|
+
"""Bulk-promote distinct (periodo_iniziale, fase_iniziale) values into
|
|
79
|
+
``period_table``. Idempotent on ``(periodo, fase)``. Returns count promoted."""
|
|
80
|
+
# Bind site at promotion time so INSERTs land on the right row.
|
|
81
|
+
prev_site = self.site
|
|
82
|
+
self.site = site
|
|
83
|
+
try:
|
|
84
|
+
existing = {
|
|
85
|
+
(r[0], r[1])
|
|
86
|
+
for r in self.session.execute(text(
|
|
87
|
+
"SELECT periodo, fase FROM period_table "
|
|
88
|
+
"WHERE sito = :s OR sito IS NULL OR sito = ''"
|
|
89
|
+
), {"s": site}).fetchall()
|
|
90
|
+
}
|
|
91
|
+
candidates = self.session.execute(text(
|
|
92
|
+
"SELECT DISTINCT periodo_iniziale, fase_iniziale "
|
|
93
|
+
"FROM periodizzazione_table WHERE sito = :s "
|
|
94
|
+
"UNION "
|
|
95
|
+
"SELECT DISTINCT periodo_iniziale, fase_iniziale "
|
|
96
|
+
"FROM us_table WHERE sito = :s"
|
|
97
|
+
), {"s": site}).fetchall()
|
|
98
|
+
count = 0
|
|
99
|
+
for period, phase in candidates:
|
|
100
|
+
if not period:
|
|
101
|
+
continue
|
|
102
|
+
if (period, phase) in existing:
|
|
103
|
+
continue
|
|
104
|
+
try:
|
|
105
|
+
self.upsert_row(period_name=period, phase_name=phase)
|
|
106
|
+
count += 1
|
|
107
|
+
except PeriodSyncError:
|
|
108
|
+
continue
|
|
109
|
+
return count
|
|
110
|
+
finally:
|
|
111
|
+
self.site = prev_site
|
{pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/pyarchinit_mini/harris_swimlane/row_provider.py
RENAMED
|
@@ -55,18 +55,28 @@ class RowProvider:
|
|
|
55
55
|
return None
|
|
56
56
|
|
|
57
57
|
def _load_from_period_table(self) -> list[Row]:
|
|
58
|
+
"""Load rows from ``period_table`` using the real pyarchinit schema.
|
|
59
|
+
|
|
60
|
+
pyarchinit's ``period_table`` ships with columns ``periodo`` /
|
|
61
|
+
``fase`` / ``datazione`` / ``sito`` — there are no numeric
|
|
62
|
+
``start_date`` / ``end_date`` columns, so we leave those as ``None``
|
|
63
|
+
and sort alphabetically. The ``sito`` column is filtered when
|
|
64
|
+
present (cross-site rows with NULL/empty ``sito`` are still kept,
|
|
65
|
+
matching legacy pyarchinit behaviour).
|
|
66
|
+
"""
|
|
58
67
|
# SQLite < 3.30 doesn't support NULLS LAST. Sort in Python for portability.
|
|
59
|
-
result = self.session.execute(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
result = self.session.execute(
|
|
69
|
+
text(
|
|
70
|
+
"SELECT periodo, fase, datazione "
|
|
71
|
+
"FROM period_table "
|
|
72
|
+
"WHERE sito = :sito OR sito IS NULL OR sito = ''"
|
|
73
|
+
),
|
|
74
|
+
{"sito": self.site},
|
|
75
|
+
).fetchall()
|
|
76
|
+
sorted_result = sorted(
|
|
77
|
+
(r for r in result if r[0]),
|
|
78
|
+
key=lambda r: (r[0] or "", r[1] or ""),
|
|
79
|
+
)
|
|
70
80
|
out = []
|
|
71
81
|
for i, r in enumerate(sorted_result):
|
|
72
82
|
period = r[0]
|
|
@@ -76,8 +86,8 @@ class RowProvider:
|
|
|
76
86
|
row_id=row_id,
|
|
77
87
|
period_name=period,
|
|
78
88
|
phase_name=phase,
|
|
79
|
-
start_date=
|
|
80
|
-
end_date=
|
|
89
|
+
start_date=None,
|
|
90
|
+
end_date=None,
|
|
81
91
|
color=PERIOD_COLORS[i % len(PERIOD_COLORS)],
|
|
82
92
|
source="period_table",
|
|
83
93
|
))
|
|
@@ -638,22 +638,42 @@ from pyarchinit_mini.harris_swimlane.exceptions import PeriodSyncError
|
|
|
638
638
|
|
|
639
639
|
|
|
640
640
|
def _get_session():
|
|
641
|
-
"""Get
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
641
|
+
"""Get a request-scoped SQLAlchemy session for Spec 3-bis endpoints.
|
|
642
|
+
|
|
643
|
+
Reuses ``g.db_session`` if a before_request hook has set it. Otherwise
|
|
644
|
+
lazily opens one through the same path as ``get_db_session()`` and
|
|
645
|
+
binds it to ``g`` (the teardown_request hook below releases it). This
|
|
646
|
+
keeps the API contract simple — endpoints just call ``_get_session()``
|
|
647
|
+
and get a real ``Session`` back, whether or not the host app wires a
|
|
648
|
+
before_request hook (the production app in 2.4.x does not).
|
|
647
649
|
"""
|
|
648
650
|
db = getattr(g, "db_session", None)
|
|
649
|
-
if db is None:
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
651
|
+
if db is not None:
|
|
652
|
+
return db
|
|
653
|
+
cm = get_db_session()
|
|
654
|
+
db = cm.__enter__()
|
|
655
|
+
g.db_session = db
|
|
656
|
+
g._db_session_cm = cm
|
|
654
657
|
return db
|
|
655
658
|
|
|
656
659
|
|
|
660
|
+
@harris_creator_bp.teardown_request
|
|
661
|
+
def _release_lazy_db_session(exc): # noqa: ARG001 — exc is part of the signature
|
|
662
|
+
"""Close any session that ``_get_session()`` opened lazily for this request."""
|
|
663
|
+
cm = getattr(g, "_db_session_cm", None)
|
|
664
|
+
if cm is None:
|
|
665
|
+
return
|
|
666
|
+
try:
|
|
667
|
+
cm.__exit__(type(exc) if exc else None, exc, getattr(exc, "__traceback__", None))
|
|
668
|
+
except Exception:
|
|
669
|
+
pass
|
|
670
|
+
finally:
|
|
671
|
+
try:
|
|
672
|
+
delattr(g, "_db_session_cm")
|
|
673
|
+
except AttributeError:
|
|
674
|
+
pass
|
|
675
|
+
|
|
676
|
+
|
|
657
677
|
@harris_creator_bp.get("/api/swimlanes/<site>")
|
|
658
678
|
def api_get_swimlanes(site: str):
|
|
659
679
|
"""List swimlane rows for the site."""
|
|
@@ -738,8 +758,7 @@ def api_save_state(site: str):
|
|
|
738
758
|
|
|
739
759
|
@harris_creator_bp.post("/api/swimlanes/<site>")
|
|
740
760
|
def api_create_row(site: str):
|
|
741
|
-
"""Create a new swimlane row (upsert period_table
|
|
742
|
-
URL consistency; period_table is currently cross-site."""
|
|
761
|
+
"""Create a new swimlane row (upsert period_table for this site)."""
|
|
743
762
|
payload = request.get_json(silent=True) or {}
|
|
744
763
|
period_name = payload.get("period_name", "")
|
|
745
764
|
phase_name = payload.get("phase_name") or None
|
|
@@ -747,7 +766,7 @@ def api_create_row(site: str):
|
|
|
747
766
|
end_date = payload.get("end_date")
|
|
748
767
|
try:
|
|
749
768
|
session = _get_session()
|
|
750
|
-
svc = PeriodSyncService(session)
|
|
769
|
+
svc = PeriodSyncService(session, site=site)
|
|
751
770
|
row = svc.upsert_row(
|
|
752
771
|
period_name=period_name, phase_name=phase_name,
|
|
753
772
|
start_date=start_date, end_date=end_date,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyarchinit-mini
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, CLI, multi-user authentication, real-time collaboration, analytics dashboard, PyArchInit import/export, Heriverse/ATON export integration, and 3D CRUD viewer
|
|
5
5
|
Home-page: https://github.com/enzococca/pyarchinit-mini
|
|
6
6
|
Author: PyArchInit Team
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyarchinit-mini"
|
|
7
|
-
version = "2.4.
|
|
7
|
+
version = "2.4.3"
|
|
8
8
|
description = "Lightweight archaeological data management system with REST API, Web UI, Desktop GUI, CLI, multi-user authentication, real-time collaboration, analytics dashboard, PyArchInit import/export, Heriverse/ATON export integration, and 3D CRUD viewer"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "GPL-2.0"}
|
|
@@ -18,10 +18,11 @@ c = conn.cursor()
|
|
|
18
18
|
c.executescript("""
|
|
19
19
|
CREATE TABLE period_table (
|
|
20
20
|
id_period INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
sito TEXT,
|
|
22
|
+
periodo TEXT NOT NULL,
|
|
23
|
+
fase TEXT,
|
|
24
|
+
datazione TEXT,
|
|
25
|
+
descrizione TEXT
|
|
25
26
|
);
|
|
26
27
|
CREATE TABLE periodizzazione_table (
|
|
27
28
|
id_periodizzazione INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -39,24 +40,24 @@ CREATE TABLE us_table (
|
|
|
39
40
|
);
|
|
40
41
|
""")
|
|
41
42
|
|
|
42
|
-
# 5 (
|
|
43
|
+
# 5 (periodo, fase) rows on the production schema
|
|
43
44
|
periods = [
|
|
44
|
-
("Roman", "a", -27
|
|
45
|
-
("Roman", "b", 100
|
|
46
|
-
("Late Antiquity", "a", 300
|
|
47
|
-
("Medieval", "a", 600
|
|
48
|
-
("Medieval", "b", 1200
|
|
45
|
+
("Roman", "a", "-27..100"),
|
|
46
|
+
("Roman", "b", "100..300"),
|
|
47
|
+
("Late Antiquity", "a", "300..600"),
|
|
48
|
+
("Medieval", "a", "600..1200"),
|
|
49
|
+
("Medieval", "b", "1200..1500"),
|
|
49
50
|
]
|
|
50
|
-
for p, ph,
|
|
51
|
+
for p, ph, dz in periods:
|
|
51
52
|
c.execute(
|
|
52
|
-
"INSERT INTO period_table (
|
|
53
|
-
(p, ph,
|
|
53
|
+
"INSERT INTO period_table (sito, periodo, fase, datazione) VALUES (?,?,?,?)",
|
|
54
|
+
("Volterra", p, ph, dz),
|
|
54
55
|
)
|
|
55
56
|
|
|
56
57
|
# 30 US distributed
|
|
57
58
|
us_records = []
|
|
58
59
|
for i in range(30):
|
|
59
|
-
period, phase, _
|
|
60
|
+
period, phase, _ = periods[i % 5]
|
|
60
61
|
rapporti = f"copre {1000 + (i+1) % 30}" if i % 3 == 0 else ""
|
|
61
62
|
us_records.append(
|
|
62
63
|
("Volterra", "A", 1000 + i, "US",
|
|
@@ -76,11 +77,11 @@ print(f"Wrote {DB} (30 US, 5 periods)")
|
|
|
76
77
|
# Reference shape for SwimlaneState.load test
|
|
77
78
|
cytoscape = {
|
|
78
79
|
"rows": [
|
|
79
|
-
{"row_id": "row_medieval_b", "period_name": "Medieval", "phase_name": "b"},
|
|
80
|
-
{"row_id": "row_medieval_a", "period_name": "Medieval", "phase_name": "a"},
|
|
81
80
|
{"row_id": "row_late-antiquity_a", "period_name": "Late Antiquity", "phase_name": "a"},
|
|
82
|
-
{"row_id": "
|
|
81
|
+
{"row_id": "row_medieval_a", "period_name": "Medieval", "phase_name": "a"},
|
|
82
|
+
{"row_id": "row_medieval_b", "period_name": "Medieval", "phase_name": "b"},
|
|
83
83
|
{"row_id": "row_roman_a", "period_name": "Roman", "phase_name": "a"},
|
|
84
|
+
{"row_id": "row_roman_b", "period_name": "Roman", "phase_name": "b"},
|
|
84
85
|
],
|
|
85
86
|
"nodes_count": 30,
|
|
86
87
|
"edges_count_at_least": 5,
|
|
@@ -9,12 +9,15 @@ from sqlalchemy.orm import sessionmaker
|
|
|
9
9
|
def client_and_db(tmp_path):
|
|
10
10
|
db = tmp_path / "rc.db"
|
|
11
11
|
conn = sqlite3.connect(db)
|
|
12
|
+
# Real pyarchinit schema: periodo / fase / datazione / sito.
|
|
12
13
|
conn.executescript("""
|
|
13
14
|
CREATE TABLE period_table (
|
|
14
15
|
id_period INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
sito TEXT,
|
|
17
|
+
periodo TEXT,
|
|
18
|
+
fase TEXT,
|
|
19
|
+
datazione TEXT,
|
|
20
|
+
descrizione TEXT
|
|
18
21
|
);
|
|
19
22
|
""")
|
|
20
23
|
conn.commit()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Verify _get_session() lazily acquires a session when g.db_session is not bound.
|
|
2
|
+
|
|
3
|
+
Prior to 2.4.2, _get_session() raised RuntimeError when no before_request hook
|
|
4
|
+
had set g.db_session — but no such hook exists in the production app, so every
|
|
5
|
+
swimlane request 500'd. 2.4.2 lazy-acquires a session through the same path as
|
|
6
|
+
get_db_session() and binds it to g for the duration of the request.
|
|
7
|
+
"""
|
|
8
|
+
import sqlite3
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
from flask import Flask
|
|
12
|
+
|
|
13
|
+
from pyarchinit_mini.web_interface.harris_creator_routes import harris_creator_bp
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@pytest.fixture
|
|
17
|
+
def client_no_session(tmp_path, monkeypatch):
|
|
18
|
+
db_path = tmp_path / "swimlane_lazy.db"
|
|
19
|
+
# Pre-create the tables Spec 3-bis queries, matching the real pyarchinit
|
|
20
|
+
# production schema (periodo / fase / datazione, not period_name / phase_name).
|
|
21
|
+
conn = sqlite3.connect(db_path)
|
|
22
|
+
conn.executescript("""
|
|
23
|
+
CREATE TABLE period_table (
|
|
24
|
+
id_period INTEGER PRIMARY KEY,
|
|
25
|
+
sito TEXT, periodo TEXT, fase TEXT, datazione TEXT, descrizione TEXT
|
|
26
|
+
);
|
|
27
|
+
CREATE TABLE periodizzazione_table (
|
|
28
|
+
id_periodizzazione INTEGER PRIMARY KEY,
|
|
29
|
+
sito TEXT, area TEXT, us INTEGER,
|
|
30
|
+
periodo_iniziale TEXT, fase_iniziale TEXT,
|
|
31
|
+
periodo_finale TEXT, fase_finale TEXT
|
|
32
|
+
);
|
|
33
|
+
CREATE TABLE us_table (
|
|
34
|
+
id_us INTEGER PRIMARY KEY,
|
|
35
|
+
sito TEXT, us INTEGER, unita_tipo TEXT,
|
|
36
|
+
rapporti TEXT, node_uuid TEXT,
|
|
37
|
+
periodo_iniziale TEXT, fase_iniziale TEXT
|
|
38
|
+
);
|
|
39
|
+
""")
|
|
40
|
+
conn.commit()
|
|
41
|
+
conn.close()
|
|
42
|
+
monkeypatch.setenv("DATABASE_URL", f"sqlite:///{db_path}")
|
|
43
|
+
app = Flask(__name__)
|
|
44
|
+
app.config["TESTING"] = True
|
|
45
|
+
app.register_blueprint(harris_creator_bp)
|
|
46
|
+
# Deliberately NO before_request hook setting g.db_session — we rely on
|
|
47
|
+
# _get_session() lazy acquisition.
|
|
48
|
+
yield app.test_client()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_swimlanes_endpoint_lazy_acquires_session(client_no_session):
|
|
52
|
+
"""Without a pre-bound g.db_session, the endpoint should still answer 200
|
|
53
|
+
by lazily opening a fresh session via get_db_session()."""
|
|
54
|
+
r = client_no_session.get("/harris-creator/api/swimlanes/EmptySite")
|
|
55
|
+
assert r.status_code == 200, r.get_data(as_text=True)
|
|
56
|
+
body = r.get_json()
|
|
57
|
+
assert isinstance(body, list)
|
{pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_period_sync.py
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"""Tests for PeriodSyncService against the real pyarchinit period_table schema."""
|
|
1
2
|
import sqlite3
|
|
2
3
|
import pytest
|
|
3
4
|
|
|
@@ -12,12 +13,14 @@ from pyarchinit_mini.harris_swimlane.exceptions import PeriodSyncError
|
|
|
12
13
|
def session(tmp_path):
|
|
13
14
|
db = tmp_path / "ps.db"
|
|
14
15
|
conn = sqlite3.connect(db)
|
|
16
|
+
# Real pyarchinit schema: periodo / fase / datazione / sito.
|
|
15
17
|
conn.execute("""CREATE TABLE period_table (
|
|
16
18
|
id_period INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
sito TEXT,
|
|
20
|
+
periodo TEXT,
|
|
21
|
+
fase TEXT,
|
|
22
|
+
datazione TEXT,
|
|
23
|
+
descrizione TEXT
|
|
21
24
|
)""")
|
|
22
25
|
conn.commit()
|
|
23
26
|
conn.close()
|
|
@@ -29,50 +32,63 @@ def session(tmp_path):
|
|
|
29
32
|
|
|
30
33
|
|
|
31
34
|
def test_upsert_row_creates_new_entry(session):
|
|
32
|
-
svc = PeriodSyncService(session)
|
|
35
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
33
36
|
row = svc.upsert_row(period_name="P1", phase_name="a",
|
|
34
37
|
start_date=100, end_date=200)
|
|
35
38
|
assert row.period_name == "P1"
|
|
36
39
|
assert row.phase_name == "a"
|
|
37
40
|
assert row.start_date == 100
|
|
38
41
|
assert row.row_id == "row_p1_a"
|
|
42
|
+
datazione = session.execute(text(
|
|
43
|
+
"SELECT datazione FROM period_table WHERE periodo='P1' AND fase='a'"
|
|
44
|
+
)).scalar()
|
|
45
|
+
assert datazione == "100..200"
|
|
39
46
|
|
|
40
47
|
|
|
41
48
|
def test_upsert_row_idempotent(session):
|
|
42
|
-
svc = PeriodSyncService(session)
|
|
49
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
43
50
|
svc.upsert_row(period_name="P1", phase_name="a", start_date=100, end_date=200)
|
|
44
51
|
svc.upsert_row(period_name="P1", phase_name="a", start_date=100, end_date=200)
|
|
45
52
|
count = session.execute(text(
|
|
46
|
-
"SELECT COUNT(*) FROM period_table WHERE
|
|
53
|
+
"SELECT COUNT(*) FROM period_table WHERE periodo='P1' AND fase='a'"
|
|
47
54
|
)).scalar()
|
|
48
55
|
assert count == 1
|
|
49
56
|
|
|
50
57
|
|
|
51
58
|
def test_upsert_row_different_phase_creates_new(session):
|
|
52
|
-
svc = PeriodSyncService(session)
|
|
59
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
53
60
|
svc.upsert_row(period_name="P1", phase_name="a")
|
|
54
61
|
svc.upsert_row(period_name="P1", phase_name="b")
|
|
55
62
|
count = session.execute(text(
|
|
56
|
-
"SELECT COUNT(*) FROM period_table WHERE
|
|
63
|
+
"SELECT COUNT(*) FROM period_table WHERE periodo='P1'"
|
|
57
64
|
)).scalar()
|
|
58
65
|
assert count == 2
|
|
59
66
|
|
|
60
67
|
|
|
61
68
|
def test_upsert_row_empty_period_raises(session):
|
|
62
|
-
svc = PeriodSyncService(session)
|
|
69
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
63
70
|
with pytest.raises(PeriodSyncError):
|
|
64
71
|
svc.upsert_row(period_name="")
|
|
65
72
|
|
|
66
73
|
|
|
67
74
|
def test_upsert_row_invalid_date_range_raises(session):
|
|
68
|
-
svc = PeriodSyncService(session)
|
|
75
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
69
76
|
with pytest.raises(PeriodSyncError):
|
|
70
77
|
svc.upsert_row(period_name="P1", phase_name="a",
|
|
71
78
|
start_date=200, end_date=100)
|
|
72
79
|
|
|
73
80
|
|
|
74
81
|
def test_upsert_row_no_phase(session):
|
|
75
|
-
svc = PeriodSyncService(session)
|
|
82
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
76
83
|
row = svc.upsert_row(period_name="Iron Age")
|
|
77
84
|
assert row.phase_name is None
|
|
78
85
|
assert row.row_id == "row_iron-age"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_upsert_row_persists_sito(session):
|
|
89
|
+
svc = PeriodSyncService(session, site="Volterra")
|
|
90
|
+
svc.upsert_row(period_name="P1", phase_name="a")
|
|
91
|
+
sito = session.execute(text(
|
|
92
|
+
"SELECT sito FROM period_table WHERE periodo='P1'"
|
|
93
|
+
)).scalar()
|
|
94
|
+
assert sito == "Volterra"
|
{pyarchinit_mini-2.4.1 → pyarchinit_mini-2.4.3}/tests/unit/test_harris_swimlane_row_provider.py
RENAMED
|
@@ -8,18 +8,16 @@ from sqlalchemy.orm import sessionmaker
|
|
|
8
8
|
from pyarchinit_mini.harris_swimlane.row_provider import Row, RowProvider
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
conn = sqlite3.connect(db)
|
|
11
|
+
def _make_db_with_real_schema(db_path):
|
|
12
|
+
"""Create the 3 tables matching the real pyarchinit schema used in prod."""
|
|
13
|
+
conn = sqlite3.connect(db_path)
|
|
15
14
|
conn.execute("""CREATE TABLE period_table (
|
|
16
15
|
id_period INTEGER PRIMARY KEY,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
chronology TEXT
|
|
16
|
+
sito TEXT,
|
|
17
|
+
periodo TEXT,
|
|
18
|
+
fase TEXT,
|
|
19
|
+
datazione TEXT,
|
|
20
|
+
descrizione TEXT
|
|
23
21
|
)""")
|
|
24
22
|
conn.execute("""CREATE TABLE periodizzazione_table (
|
|
25
23
|
id_periodizzazione INTEGER PRIMARY KEY,
|
|
@@ -32,14 +30,21 @@ def session_with_period_table(tmp_path):
|
|
|
32
30
|
sito TEXT, us INTEGER,
|
|
33
31
|
periodo_iniziale TEXT, fase_iniziale TEXT
|
|
34
32
|
)""")
|
|
33
|
+
return conn
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@pytest.fixture
|
|
37
|
+
def session_with_period_table(tmp_path):
|
|
38
|
+
db = tmp_path / "rp.db"
|
|
39
|
+
conn = _make_db_with_real_schema(db)
|
|
35
40
|
rows = [
|
|
36
|
-
("Roman Imperial", "early", -27
|
|
37
|
-
("Roman Imperial", "late", 100
|
|
38
|
-
("Medieval", "early", 476
|
|
41
|
+
("Volterra", "Roman Imperial", "early", "-27..100"),
|
|
42
|
+
("Volterra", "Roman Imperial", "late", "100..476"),
|
|
43
|
+
("Volterra", "Medieval", "early", "476..1000"),
|
|
39
44
|
]
|
|
40
45
|
for r in rows:
|
|
41
46
|
conn.execute(
|
|
42
|
-
"INSERT INTO period_table (
|
|
47
|
+
"INSERT INTO period_table (sito, periodo, fase, datazione) VALUES (?,?,?,?)",
|
|
43
48
|
r,
|
|
44
49
|
)
|
|
45
50
|
conn.commit()
|
|
@@ -54,22 +59,7 @@ def session_with_period_table(tmp_path):
|
|
|
54
59
|
@pytest.fixture
|
|
55
60
|
def session_fallback_only(tmp_path):
|
|
56
61
|
db = tmp_path / "rp_fb.db"
|
|
57
|
-
conn =
|
|
58
|
-
conn.execute("""CREATE TABLE period_table (
|
|
59
|
-
id_period INTEGER PRIMARY KEY, period_name TEXT, phase_name TEXT,
|
|
60
|
-
start_date INTEGER, end_date INTEGER, description TEXT, chronology TEXT
|
|
61
|
-
)""")
|
|
62
|
-
conn.execute("""CREATE TABLE periodizzazione_table (
|
|
63
|
-
id_periodizzazione INTEGER PRIMARY KEY,
|
|
64
|
-
sito TEXT, area TEXT, us INTEGER,
|
|
65
|
-
periodo_iniziale TEXT, fase_iniziale TEXT,
|
|
66
|
-
periodo_finale TEXT, fase_finale TEXT
|
|
67
|
-
)""")
|
|
68
|
-
conn.execute("""CREATE TABLE us_table (
|
|
69
|
-
id_us INTEGER PRIMARY KEY,
|
|
70
|
-
sito TEXT, us INTEGER,
|
|
71
|
-
periodo_iniziale TEXT, fase_iniziale TEXT
|
|
72
|
-
)""")
|
|
62
|
+
conn = _make_db_with_real_schema(db)
|
|
73
63
|
pz = [
|
|
74
64
|
("Volterra", "A", 1, "Roman", "a", None, None),
|
|
75
65
|
("Volterra", "A", 2, "Medieval", "b", None, None),
|
|
@@ -89,13 +79,20 @@ def session_fallback_only(tmp_path):
|
|
|
89
79
|
s.close()
|
|
90
80
|
|
|
91
81
|
|
|
92
|
-
def
|
|
82
|
+
def test_list_rows_from_period_table_sorted_alphabetically(session_with_period_table):
|
|
83
|
+
# Real period_table has no numeric start_date/end_date — we sort by
|
|
84
|
+
# (periodo, fase) alphabetically and leave numeric dates as None.
|
|
93
85
|
rows = RowProvider(session_with_period_table, "Volterra").list_rows()
|
|
94
86
|
assert len(rows) == 3
|
|
95
87
|
assert rows[0].period_name == "Medieval"
|
|
88
|
+
assert rows[0].phase_name == "early"
|
|
96
89
|
assert rows[1].period_name == "Roman Imperial"
|
|
97
|
-
assert rows[1].phase_name == "
|
|
98
|
-
assert rows[2].
|
|
90
|
+
assert rows[1].phase_name == "early"
|
|
91
|
+
assert rows[2].period_name == "Roman Imperial"
|
|
92
|
+
assert rows[2].phase_name == "late"
|
|
93
|
+
for r in rows:
|
|
94
|
+
assert r.start_date is None
|
|
95
|
+
assert r.end_date is None
|
|
99
96
|
|
|
100
97
|
|
|
101
98
|
def test_list_rows_source_period_table(session_with_period_table):
|