pyarchinit-mini 2.1.67__tar.gz → 2.4.0__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.1.67 → pyarchinit_mini-2.4.0}/CHANGELOG.md +160 -0
- {pyarchinit_mini-2.1.67/pyarchinit_mini.egg-info → pyarchinit_mini-2.4.0}/PKG-INFO +95 -2
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/README.md +92 -1
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/__init__.py +1 -1
- pyarchinit_mini-2.4.0/pyarchinit_mini/cli/migrate_vocab.py +164 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +104 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +104 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +73 -0
- pyarchinit_mini-2.1.67/pyarchinit_mini/database/migrations.py → pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/__init__.py +35 -35
- pyarchinit_mini-2.4.0/pyarchinit_mini/database/migrations/backup.py +80 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/database/utils.py +33 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/us_dto.py +33 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/converter.py +8 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_converter/em_palette.py +439 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/graphml_builder.py +8 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/graphml_exporter.py +8 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +8 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/__init__.py +1 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/reader.py +38 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/writer.py +26 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphml_io/yed_writer.py +157 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/__init__.py +1 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/auto_regen.py +124 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/edge_registry.py +43 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/exceptions.py +53 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/filesystem.py +62 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/ingest_plan.py +32 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/ingestor.py +190 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/paradata_store.py +327 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/graphproj/projector.py +105 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/__init__.py +1 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/compound_layout.py +57 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/exceptions.py +31 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/period_sync_service.py +90 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/row_provider.py +113 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/harris_swimlane/swimlane_state.py +269 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/s3d_converter.py +109 -68
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/ai_assistant_service.py +13 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/__init__.py +14 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/exceptions.py +22 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/i18n.py +75 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/loader.py +139 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/provider.py +134 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/translations/vocab_en.json +20 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/translations/vocab_it.json +28 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/vocab/types.py +53 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/app.py +89 -3
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/graph_routes.py +128 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/harris_creator_routes.py +255 -42
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/paradata_routes.py +137 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/paradata_ui_routes.py +122 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +12 -1
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/graph_import_preview.html +40 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/graph_import_result.html +19 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +241 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/inventario/form.html +5 -5
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/media/list.html +5 -5
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/paradata/edit.html +21 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/templates/paradata/list.html +33 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/form.html +5 -5
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/form.html +5 -5
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/list.html +1 -1
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/us/form.html +5 -5
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/three_d_builder_routes.py +13 -0
- pyarchinit_mini-2.4.0/pyarchinit_mini/web_interface/vocab_routes.py +87 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0/pyarchinit_mini.egg-info}/PKG-INFO +95 -2
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/SOURCES.txt +98 -2
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/entry_points.txt +1 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/requires.txt +3 -1
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyproject.toml +5 -2
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/requirements.txt +1 -1
- pyarchinit_mini-2.4.0/tests/e2e/test_web_vocab_full_flow.py +78 -0
- pyarchinit_mini-2.4.0/tests/fixtures/_generate_baseline_graphml.py +30 -0
- pyarchinit_mini-2.4.0/tests/fixtures/_generate_harris_swimlane_synthetic.py +89 -0
- pyarchinit_mini-2.4.0/tests/fixtures/_generate_synthetic_db.py +39 -0
- pyarchinit_mini-2.4.0/tests/integration/test_auto_regen_on_save.py +61 -0
- pyarchinit_mini-2.4.0/tests/integration/test_graph_import_flow.py +96 -0
- pyarchinit_mini-2.4.0/tests/integration/test_graph_routes.py +54 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_matrix_post_cutover.py +44 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_matrix_visual_parity.py +56 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_create_row.py +93 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_load.py +77 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_save.py +102 -0
- pyarchinit_mini-2.4.0/tests/integration/test_harris_swimlane_routes_session_missing.py +23 -0
- pyarchinit_mini-2.4.0/tests/integration/test_migrate_vocab_cli.py +92 -0
- pyarchinit_mini-2.4.0/tests/integration/test_paradata_routes_authors.py +80 -0
- pyarchinit_mini-2.4.0/tests/integration/test_paradata_routes_other_types.py +63 -0
- pyarchinit_mini-2.4.0/tests/integration/test_paradata_ui.py +74 -0
- pyarchinit_mini-2.4.0/tests/integration/test_spec2_coverage_gaps.py +28 -0
- pyarchinit_mini-2.4.0/tests/integration/test_vocab_routes.py +66 -0
- pyarchinit_mini-2.4.0/tests/integration/test_yed_export_route.py +83 -0
- pyarchinit_mini-2.4.0/tests/integration/test_yed_writer_parity.py +65 -0
- pyarchinit_mini-2.4.0/tests/unit/__init__.py +0 -0
- pyarchinit_mini-2.4.0/tests/unit/test_auto_regen.py +159 -0
- pyarchinit_mini-2.4.0/tests/unit/test_database_utils.py +19 -0
- pyarchinit_mini-2.4.0/tests/unit/test_deprecated_writers_shim.py +26 -0
- pyarchinit_mini-2.4.0/tests/unit/test_em_palette_vocab_backed.py +68 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphml_io_reader.py +38 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphml_io_writer.py +34 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_edge_registry.py +44 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_exceptions.py +40 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_filesystem.py +63 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_ingestor_apply.py +111 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_ingestor_preview.py +103 -0
- pyarchinit_mini-2.4.0/tests/unit/test_graphproj_projector.py +104 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_compound_layout.py +55 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_exceptions.py +38 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_period_sync.py +78 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_row_provider.py +133 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_state_load.py +84 -0
- pyarchinit_mini-2.4.0/tests/unit/test_harris_swimlane_state_save.py +123 -0
- pyarchinit_mini-2.4.0/tests/unit/test_ingest_plan.py +37 -0
- pyarchinit_mini-2.4.0/tests/unit/test_migrations_backup.py +44 -0
- pyarchinit_mini-2.4.0/tests/unit/test_migrations_idempotent.py +164 -0
- pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_authors.py +51 -0
- pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_basic.py +32 -0
- pyarchinit_mini-2.4.0/tests/unit/test_paradata_store_other_types.py +76 -0
- pyarchinit_mini-2.4.0/tests/unit/test_s3d_converter_vocab_backed.py +122 -0
- pyarchinit_mini-2.4.0/tests/unit/test_us_dto_unita_tipo_validator.py +62 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_bootstrap_failures.py +26 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_exceptions.py +25 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_i18n.py +41 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_loader.py +57 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_provider.py +76 -0
- pyarchinit_mini-2.4.0/tests/unit/test_vocab_types.py +45 -0
- pyarchinit_mini-2.4.0/tests/unit/test_yed_writer.py +122 -0
- pyarchinit_mini-2.1.67/pyarchinit_mini/graphml_converter/em_palette.py +0 -355
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/MANIFEST.in +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/babel.cfg +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/media_viewer_demo.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini 2.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_mini_sample.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_clean.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_tutorial_video.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/data/pyarchinit_v18_demo.db +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/logo/logo_pyarchinit-mini.png +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/auth.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/dependencies.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/graphml.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/inventario.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/schemas.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/site.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/sync.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/api/us.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/export_import_cli.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/graphml_cli.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/harris_import.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/harris_template.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/migrate.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli/sync_cli.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli_interface/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/connection_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/config/em_node_types.yaml +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/concurrency_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/connection.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/database_creator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/postgres_installer.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/database/schemas.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/icons.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/inventario_dto.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/dto/site_dto.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/exceptions.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/i18n/locale_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/__main__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/config.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/http_server.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/server.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/media_manager/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/media_manager/media_handler.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/ai_chat.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/app_setting.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/base.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/datazione.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/extended_matrix.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/harris_matrix.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/inventario_materiali.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/media.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/pottery.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/site.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/thesaurus.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/tma.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/us.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/models/user.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/auto_translate.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/setup_auth.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/scripts/verify_docs.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/ai_chat_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/analytics_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/app_setting_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/backup_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/command_parser.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/datazione_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/export_import_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/import_export_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/inventario_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/mcp_executor.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/media_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_dto.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/pottery_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/search_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/site_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/thesaurus_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/tma_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/us_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/services/user_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/translations/messages.pot +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/auth.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/exceptions.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/relationship_validator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/utils/validators.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/pottery_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/base.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/detail.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pottery/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/pyarchinit_mini.egg-info/top_level.txt +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/setup.cfg +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/setup.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/conftest.py +0 -0
- {pyarchinit_mini-2.1.67/tests/integration → pyarchinit_mini-2.4.0/tests/e2e}/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/fixtures/build_legacy_with_pottery.py +0 -0
- {pyarchinit_mini-2.1.67/tests/unit → pyarchinit_mini-2.4.0/tests/integration}/__init__.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_admin_ai_settings_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_admin_backup_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_full_sync_flow.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_completion.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/integration/test_pottery_routes.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_app_setting_model.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_app_setting_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_backup_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_bundle.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_concurrency_columns.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_concurrency_manager.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_connectivity_monitor.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_inventario_schema.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_optimistic_locking.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_dto.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_model.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_pottery_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_site_service.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_api.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_cli.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_orchestrator.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_queue.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_sync_state_machine.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_us_schema.py +0 -0
- {pyarchinit_mini-2.1.67 → pyarchinit_mini-2.4.0}/tests/unit/test_uuid_manager.py +0 -0
|
@@ -1,3 +1,163 @@
|
|
|
1
|
+
## [2.4.0] - 2026-05-18
|
|
2
|
+
|
|
3
|
+
### Added (IT)
|
|
4
|
+
- Modulo `pyarchinit_mini/harris_swimlane/` (5 moduli: row_provider,
|
|
5
|
+
swimlane_state, period_sync_service, compound_layout, exceptions) per
|
|
6
|
+
l'editor swimlane di Harris Matrix.
|
|
7
|
+
- `pyarchinit_mini/graphml_io/yed_writer.py` — nuovo emitter
|
|
8
|
+
yEd-flavored con `y:TableNode + y:Rows + y:ShapeNode`, separato
|
|
9
|
+
dall'export s3dgraphy clean di Spec 2.
|
|
10
|
+
- 5 nuove route REST per il Harris Creator:
|
|
11
|
+
`GET/POST /api/swimlanes/<site>`, `GET /api/load/<site>`,
|
|
12
|
+
`POST /api/save/<site>`, `GET /api/export/<site>/yed-graphml`.
|
|
13
|
+
- Editor `/harris-creator/editor` ora carica swimlane automaticamente
|
|
14
|
+
(row da `period_table` priorità → fallback distinct values), supporta
|
|
15
|
+
drag-drop tra row, creazione interattiva di nuove row, save esplicito
|
|
16
|
+
con auto-regen (Spec 2) post-commit.
|
|
17
|
+
- Export yEd GraphML on-demand → `data/exports/harris_yed/<slug>-harris-yed.graphml`.
|
|
18
|
+
|
|
19
|
+
### Added (EN)
|
|
20
|
+
- New `pyarchinit_mini/harris_swimlane/` package — backend for Harris
|
|
21
|
+
Matrix swimlane editing.
|
|
22
|
+
- New `pyarchinit_mini/graphml_io/yed_writer.py` — yEd-flavored GraphML
|
|
23
|
+
emitter (TableNode + Rows + ShapeNode), separate from Spec 2's
|
|
24
|
+
s3dgraphy delegate.
|
|
25
|
+
- 5 new REST endpoints under `/harris-creator/api/`.
|
|
26
|
+
- Editor loads swimlanes auto from `period_table` (fallback distinct);
|
|
27
|
+
drag-drop between rows; interactive row creation; explicit Save with
|
|
28
|
+
Spec 2 auto-regen. On-demand yEd export.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- `harris_creator_routes.py` extended additively — existing routes
|
|
32
|
+
unchanged.
|
|
33
|
+
- `editor.html` extended additively — Cytoscape compound nodes,
|
|
34
|
+
swimlane parents, new toolbar buttons.
|
|
35
|
+
|
|
36
|
+
### Architecture note
|
|
37
|
+
Two GraphML outputs now coexist:
|
|
38
|
+
- `data/paradata/<slug>/stratigraphy.graphml` (Spec 2 auto-regen,
|
|
39
|
+
s3dgraphy clean, EM-canonical)
|
|
40
|
+
- `data/exports/harris_yed/<slug>-harris-yed.graphml` (Spec 3-bis,
|
|
41
|
+
on-demand, yEd-flavored with TableNode)
|
|
42
|
+
|
|
43
|
+
Legacy `pure_networkx_exporter` stays deprecated (was deprecated in
|
|
44
|
+
Spec 2 PR8). NOT resurrected.
|
|
45
|
+
|
|
46
|
+
### Dependencies
|
|
47
|
+
- No new dependencies.
|
|
48
|
+
|
|
49
|
+
### Spec / Plan
|
|
50
|
+
- Spec: `docs/superpowers/specs/2026-05-18-harris-swimlane-template-design.md`
|
|
51
|
+
- Plan: `docs/superpowers/plans/2026-05-18-harris-swimlane-template.md`
|
|
52
|
+
- Spec 3-bis (auxiliary): independent of Spec 3 (SyncEngine + EM
|
|
53
|
+
Datacenter, on hold pending Datacenter readiness).
|
|
54
|
+
|
|
55
|
+
## [2.3.0-alpha] - 2026-05-18
|
|
56
|
+
|
|
57
|
+
### Added (IT)
|
|
58
|
+
- Modulo `pyarchinit_mini/graphproj/` con `GraphProjector` (DB → s3dgraphy.Graph),
|
|
59
|
+
`ParadataStore` (storage per-sito su filesystem), `GraphIngestor` (preview/apply
|
|
60
|
+
bidirezionale con staleness check), `auto_regen` (hook post-commit), edge_registry,
|
|
61
|
+
filesystem helpers.
|
|
62
|
+
- Modulo `pyarchinit_mini/graphml_io/` con writer/reader delegati a
|
|
63
|
+
`s3dgraphy.exporter.graphml.GraphMLExporter` / `s3dgraphy.importer.import_graphml.GraphMLImporter`.
|
|
64
|
+
- Auto-regen di `data/paradata/<site_slug>/stratigraphy.graphml` su ogni save US/USM
|
|
65
|
+
(best-effort, errori isolati). Disabilitabile con `PYARCHINIT_DISABLE_AUTO_REGEN=1`
|
|
66
|
+
o col context manager `auto_regen.disable_regen()`.
|
|
67
|
+
- 5 pagine HTML CRUD per paradata (authors, licenses, embargoes, documents, epochs)
|
|
68
|
+
con form Bootstrap.
|
|
69
|
+
- REST API completa `/api/v1/paradata/<site>/{authors,licenses,embargoes,documents,epochs}`.
|
|
70
|
+
- Route web `/sites/<site>/graph/{view,download,import-preview,import-apply}` con
|
|
71
|
+
preview 2-fasi obbligatorio per l'import GraphML + snapshot staleness check.
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
- `pyarchinit_mini/graphml_converter/{graphml_builder, graphml_exporter,
|
|
75
|
+
pure_networkx_exporter, converter}.py` marcati deprecati (emettono
|
|
76
|
+
`DeprecationWarning` all'import). Verranno rimossi in Spec 3.
|
|
77
|
+
- `harris_creator_routes.py` refactored: il branch `graphml` ora usa
|
|
78
|
+
`GraphProjector.populate_graph()` + `graphml_io.writer.write_graphml()`
|
|
79
|
+
invece di passare attraverso `HarrisMatrixGenerator.export_to_graphml()` /
|
|
80
|
+
`GraphMLBuilder`.
|
|
81
|
+
- Edge canonical names allineati a s3dgraphy 0.1.42: `covers` → `overlies`,
|
|
82
|
+
`leans_against` → `abuts`. Fix del bug latente Spec 1 in
|
|
83
|
+
`vocab_{en,it}.json` e `s3d_converter._LEGACY_CODE_MAP`.
|
|
84
|
+
|
|
85
|
+
### Architecture note (paradata storage)
|
|
86
|
+
s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone paradata
|
|
87
|
+
nodes (AuthorNode, etc.) — they're only serialised when wrapped in
|
|
88
|
+
ParadataNodeGroup. Spec 2 therefore adopted a **JSON sidecar pattern**:
|
|
89
|
+
paradata entities live in `data/paradata/<site_slug>/paradata.json`
|
|
90
|
+
(committed to git), while the auto-regenerated `stratigraphy.graphml` is
|
|
91
|
+
purely the stratigraphic projection. Paradata are exposed via REST/UI but
|
|
92
|
+
not embedded in the GraphML output.
|
|
93
|
+
|
|
94
|
+
### Added (EN)
|
|
95
|
+
- New `pyarchinit_mini/graphproj/` package: GraphProjector, ParadataStore,
|
|
96
|
+
GraphIngestor (2-phase preview/apply), auto_regen post-commit hook,
|
|
97
|
+
edge_registry, filesystem helpers.
|
|
98
|
+
- New `pyarchinit_mini/graphml_io/` package delegating to s3dgraphy.
|
|
99
|
+
- Auto-regen of stratigraphy.graphml on US/USM save, error-isolated.
|
|
100
|
+
- 5 paradata CRUD HTML pages + REST API.
|
|
101
|
+
- Graph routes: view, download, import-preview, import-apply with snapshot
|
|
102
|
+
staleness check (409 on stale).
|
|
103
|
+
- Deprecation warnings on 4 legacy writers.
|
|
104
|
+
|
|
105
|
+
### Dependencies
|
|
106
|
+
- No new dependencies. Uses s3dgraphy 0.1.42 (bumped in 2.2.0-alpha).
|
|
107
|
+
|
|
108
|
+
### Spec / Plan
|
|
109
|
+
- Spec: `docs/superpowers/specs/2026-05-17-spec-2-local-graph-paradata-design.md`
|
|
110
|
+
- Plan: `docs/superpowers/plans/2026-05-17-spec-2-local-graph-paradata.md`
|
|
111
|
+
- Spec 2 of 4 for the s3dgraphy bidirectional bridge work.
|
|
112
|
+
|
|
113
|
+
## [2.2.0-alpha] - 2026-05-17
|
|
114
|
+
|
|
115
|
+
### Added (IT)
|
|
116
|
+
- Modulo `pyarchinit_mini/vocab/` con `VocabProvider` singleton: legge i tre pillar JSON di s3dgraphy
|
|
117
|
+
(`s3Dgraphy_node_datamodel.json`, `s3Dgraphy_connections_datamodel.json`, `em_visual_rules.json`)
|
|
118
|
+
come fonte canonica per tipi di unità, tipi di relazione, e stili visivi.
|
|
119
|
+
- Endpoint REST `/api/v1/vocab/{unit-types, edge-types, visual-style, diagnostics}` per popolare
|
|
120
|
+
select e form lato web.
|
|
121
|
+
- CLI `pyarchinit-mini-migrate-vocab` per allineare il vocabolario legacy
|
|
122
|
+
(`USVA`/`USVB` → `USVs`, `USVC` → `USVn`) e fare il backfill della colonna `node_uuid` (UUID v7)
|
|
123
|
+
su `us_table`, `inventario_materiali_table`, `periodizzazione_table`.
|
|
124
|
+
- Colonna `node_uuid` (prerequisito per il sync futuro col Datacenter EM).
|
|
125
|
+
- Catalogo i18n custom (`pyarchinit_mini/vocab/translations/vocab_{en,it}.json`) con
|
|
126
|
+
`edge_type_aliases` per il parsing dei `rapporti` italiani.
|
|
127
|
+
|
|
128
|
+
### Added (EN)
|
|
129
|
+
- New `pyarchinit_mini/vocab/` package with `VocabProvider` singleton reading three s3dgraphy
|
|
130
|
+
JSON pillars as canonical source of unit types, edge types, and visual styles.
|
|
131
|
+
- REST endpoints `/api/v1/vocab/{unit-types, edge-types, visual-style, diagnostics}` to populate
|
|
132
|
+
forms in the web UI.
|
|
133
|
+
- CLI `pyarchinit-mini-migrate-vocab` to align legacy vocabulary (`USVA`/`USVB` → `USVs`,
|
|
134
|
+
`USVC` → `USVn`) and backfill `node_uuid` (UUID v7) across `us_table`,
|
|
135
|
+
`inventario_materiali_table`, `periodizzazione_table`.
|
|
136
|
+
- `node_uuid` column (prerequisite for future EM Datacenter sync).
|
|
137
|
+
- Custom i18n catalogue with `edge_type_aliases` for parsing Italian `rapporti` strings.
|
|
138
|
+
|
|
139
|
+
### Changed
|
|
140
|
+
- `graphml_converter/em_palette.py` reads visual styles from `VocabProvider` instead of the
|
|
141
|
+
hardcoded `PALETTE` dict (kept as deprecated shim emitting `DeprecationWarning` on access).
|
|
142
|
+
- `s3d_integration/s3d_converter.py` parses `rapporti` text and categorizes node families via
|
|
143
|
+
`VocabProvider` (`italian_aliases`, `family`, `class_name`) instead of hardcoded if/elif chains.
|
|
144
|
+
- Harris Matrix Creator now consumes `VocabProvider` visual styles end-to-end.
|
|
145
|
+
|
|
146
|
+
### Migration required
|
|
147
|
+
- After upgrading, run `pyarchinit-mini-migrate-vocab --dry-run` to preview, then
|
|
148
|
+
`--apply` to migrate (auto-backup under `data/backups/`).
|
|
149
|
+
- See `docs/CLI_MIGRATE_VOCAB.md` for full reference.
|
|
150
|
+
|
|
151
|
+
### Dependencies
|
|
152
|
+
- `s3dgraphy>=0.1.42` (was 0.1.15).
|
|
153
|
+
- New: `uuid7>=0.1.0` (importable as `uuid_extensions`).
|
|
154
|
+
- Dev: `freezegun>=1.5.0`.
|
|
155
|
+
|
|
156
|
+
### Spec / Plan
|
|
157
|
+
- Spec: `docs/superpowers/specs/2026-05-16-s3dgraphy-web-foundation-design.md`
|
|
158
|
+
- Plan: `docs/superpowers/plans/2026-05-16-s3dgraphy-web-foundation.md`
|
|
159
|
+
- This is Spec 1 of 4 for porting the s3dgraphy bidirectional bridge from the QGIS plugin.
|
|
160
|
+
|
|
1
161
|
## [2.1.6] - 2026-02-25
|
|
2
162
|
|
|
3
163
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyarchinit-mini
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
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
|
|
@@ -42,7 +42,8 @@ Requires-Dist: networkx>=3.0.0
|
|
|
42
42
|
Requires-Dist: reportlab>=4.0.0
|
|
43
43
|
Requires-Dist: pillow>=10.0.0
|
|
44
44
|
Requires-Dist: qrcode[pil]>=7.4.0
|
|
45
|
-
Requires-Dist: s3dgraphy>=0.1.
|
|
45
|
+
Requires-Dist: s3dgraphy>=0.1.42
|
|
46
|
+
Requires-Dist: uuid7>=0.1.0
|
|
46
47
|
Requires-Dist: click>=8.1.0
|
|
47
48
|
Requires-Dist: rich>=13.0.0
|
|
48
49
|
Requires-Dist: inquirer>=3.0.0
|
|
@@ -91,6 +92,7 @@ Requires-Dist: black>=23.0.0; extra == "dev"
|
|
|
91
92
|
Requires-Dist: flake8>=6.0.0; extra == "dev"
|
|
92
93
|
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
93
94
|
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
95
|
+
Requires-Dist: freezegun>=1.5.0; extra == "dev"
|
|
94
96
|
Provides-Extra: docs
|
|
95
97
|
Requires-Dist: sphinx>=6.0.0; extra == "docs"
|
|
96
98
|
Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "docs"
|
|
@@ -2366,3 +2368,94 @@ This project is licensed under the GNU General Public License v2.0 - see the [LI
|
|
|
2366
2368
|
|
|
2367
2369
|
|
|
2368
2370
|
**Made with ❤️ for the Archaeological Community**
|
|
2371
|
+
|
|
2372
|
+
## s3dgraphy integration
|
|
2373
|
+
|
|
2374
|
+
Since 2.2.0-alpha, pyarchinit-mini-web reads the canonical Extended Matrix
|
|
2375
|
+
vocabulary (unit types, edge types, visual styles) from the
|
|
2376
|
+
[s3dgraphy](https://github.com/zalmoxes-laran/s3dgraphy) package's JSON
|
|
2377
|
+
catalogues. Unit types like `US`, `USVs`, `USVn`, `RSF`, `USM` come from
|
|
2378
|
+
`s3Dgraphy_node_datamodel.json` (v1.5.4 at time of writing).
|
|
2379
|
+
|
|
2380
|
+
Bumping s3dgraphy (`pip install --upgrade s3dgraphy`) makes new EM types
|
|
2381
|
+
immediately available in form selects without any pyarchinit-mini code change.
|
|
2382
|
+
|
|
2383
|
+
After upgrading, run the data alignment to update legacy records:
|
|
2384
|
+
|
|
2385
|
+
```bash
|
|
2386
|
+
pyarchinit-mini-migrate-vocab --dry-run # preview changes
|
|
2387
|
+
pyarchinit-mini-migrate-vocab --apply # backup + migrate
|
|
2388
|
+
```
|
|
2389
|
+
|
|
2390
|
+
See `docs/CLI_MIGRATE_VOCAB.md` for the full CLI reference.
|
|
2391
|
+
|
|
2392
|
+
The vocab is exposed to the browser via:
|
|
2393
|
+
|
|
2394
|
+
- `GET /api/v1/vocab/unit-types?lang=it`
|
|
2395
|
+
- `GET /api/v1/vocab/unit-types/<abbr>`
|
|
2396
|
+
- `GET /api/v1/vocab/edge-types?lang=it`
|
|
2397
|
+
- `GET /api/v1/vocab/visual-style/<unit_type>`
|
|
2398
|
+
- `GET /api/v1/vocab/diagnostics` (admin-only)
|
|
2399
|
+
|
|
2400
|
+
## Graph projection & paradata
|
|
2401
|
+
|
|
2402
|
+
Since 2.3.0-alpha, pyarchinit-mini-web auto-generates the stratigraphic graph
|
|
2403
|
+
as a GraphML file every time you save a US/USM record. Output lives at
|
|
2404
|
+
`data/paradata/<site_slug>/stratigraphy.graphml`.
|
|
2405
|
+
|
|
2406
|
+
Paradata (authors, licenses, embargoes, documents, epochs) are stored in a
|
|
2407
|
+
JSON sidecar:
|
|
2408
|
+
```
|
|
2409
|
+
data/paradata/<site_slug>/paradata.json
|
|
2410
|
+
```
|
|
2411
|
+
because s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone
|
|
2412
|
+
paradata nodes. The JSON sidecar IS committed to git.
|
|
2413
|
+
|
|
2414
|
+
### Paradata editing
|
|
2415
|
+
|
|
2416
|
+
Visit `/paradata/<site>/{authors,licenses,embargoes,documents,epochs}` to
|
|
2417
|
+
manage paradata. REST endpoints under `/api/v1/paradata/<site>/...` mirror
|
|
2418
|
+
the UI. See `docs/PARADATA_GUIDE.md`.
|
|
2419
|
+
|
|
2420
|
+
### Graph import
|
|
2421
|
+
|
|
2422
|
+
`/sites/<site>/graph/import-preview` accepts a GraphML upload; you see a
|
|
2423
|
+
preview of planned INSERT/UPDATE/SKIP and must confirm via
|
|
2424
|
+
`/sites/<site>/graph/import-apply` before any DB write.
|
|
2425
|
+
|
|
2426
|
+
### Auto-regen control
|
|
2427
|
+
|
|
2428
|
+
- Disable globally: `export PYARCHINIT_DISABLE_AUTO_REGEN=1`
|
|
2429
|
+
- Disable during bulk ops: `with graphproj.auto_regen.disable_regen():`
|
|
2430
|
+
|
|
2431
|
+
See `docs/GRAPH_AUTO_REGEN.md`.
|
|
2432
|
+
|
|
2433
|
+
## Harris Swimlane Editor
|
|
2434
|
+
|
|
2435
|
+
Since 2.4.0, the Harris Matrix Creator at `/harris-creator/editor`
|
|
2436
|
+
displays stratigraphic graphs with **yEd-like swimlanes** — horizontal
|
|
2437
|
+
rows representing periods+phases. Existing US records are auto-placed
|
|
2438
|
+
in their row based on `periodo_iniziale + fase_iniziale`. Users can
|
|
2439
|
+
drag US records between rows, create new rows interactively, and save
|
|
2440
|
+
back to the DB.
|
|
2441
|
+
|
|
2442
|
+
Row source priority:
|
|
2443
|
+
1. `period_table` (formal definitions)
|
|
2444
|
+
2. Fallback: distinct `(periodo_iniziale, fase_iniziale)` from
|
|
2445
|
+
`periodizzazione_table` + `us_table`
|
|
2446
|
+
|
|
2447
|
+
### Two GraphML outputs
|
|
2448
|
+
|
|
2449
|
+
- `data/paradata/<site>/stratigraphy.graphml` (Spec 2, auto-regen):
|
|
2450
|
+
s3dgraphy clean, EM-canonical, for the EM Datacenter
|
|
2451
|
+
- `data/exports/harris_yed/<site>-harris-yed.graphml` (Spec 3-bis,
|
|
2452
|
+
on-demand): yEd-flavored with `y:TableNode`, for users editing in
|
|
2453
|
+
yEd Desktop
|
|
2454
|
+
|
|
2455
|
+
### Auto-regen integration
|
|
2456
|
+
|
|
2457
|
+
Save endpoint also triggers Spec 2's auto_regen for
|
|
2458
|
+
`stratigraphy.graphml`, keeping the canonical output consistent with
|
|
2459
|
+
DB state.
|
|
2460
|
+
|
|
2461
|
+
See `docs/HARRIS_SWIMLANE.md` and `docs/YED_INTEGRATION.md`.
|
|
@@ -2264,4 +2264,95 @@ This project is licensed under the GNU General Public License v2.0 - see the [LI
|
|
|
2264
2264
|
---
|
|
2265
2265
|
|
|
2266
2266
|
|
|
2267
|
-
**Made with ❤️ for the Archaeological Community**
|
|
2267
|
+
**Made with ❤️ for the Archaeological Community**
|
|
2268
|
+
|
|
2269
|
+
## s3dgraphy integration
|
|
2270
|
+
|
|
2271
|
+
Since 2.2.0-alpha, pyarchinit-mini-web reads the canonical Extended Matrix
|
|
2272
|
+
vocabulary (unit types, edge types, visual styles) from the
|
|
2273
|
+
[s3dgraphy](https://github.com/zalmoxes-laran/s3dgraphy) package's JSON
|
|
2274
|
+
catalogues. Unit types like `US`, `USVs`, `USVn`, `RSF`, `USM` come from
|
|
2275
|
+
`s3Dgraphy_node_datamodel.json` (v1.5.4 at time of writing).
|
|
2276
|
+
|
|
2277
|
+
Bumping s3dgraphy (`pip install --upgrade s3dgraphy`) makes new EM types
|
|
2278
|
+
immediately available in form selects without any pyarchinit-mini code change.
|
|
2279
|
+
|
|
2280
|
+
After upgrading, run the data alignment to update legacy records:
|
|
2281
|
+
|
|
2282
|
+
```bash
|
|
2283
|
+
pyarchinit-mini-migrate-vocab --dry-run # preview changes
|
|
2284
|
+
pyarchinit-mini-migrate-vocab --apply # backup + migrate
|
|
2285
|
+
```
|
|
2286
|
+
|
|
2287
|
+
See `docs/CLI_MIGRATE_VOCAB.md` for the full CLI reference.
|
|
2288
|
+
|
|
2289
|
+
The vocab is exposed to the browser via:
|
|
2290
|
+
|
|
2291
|
+
- `GET /api/v1/vocab/unit-types?lang=it`
|
|
2292
|
+
- `GET /api/v1/vocab/unit-types/<abbr>`
|
|
2293
|
+
- `GET /api/v1/vocab/edge-types?lang=it`
|
|
2294
|
+
- `GET /api/v1/vocab/visual-style/<unit_type>`
|
|
2295
|
+
- `GET /api/v1/vocab/diagnostics` (admin-only)
|
|
2296
|
+
|
|
2297
|
+
## Graph projection & paradata
|
|
2298
|
+
|
|
2299
|
+
Since 2.3.0-alpha, pyarchinit-mini-web auto-generates the stratigraphic graph
|
|
2300
|
+
as a GraphML file every time you save a US/USM record. Output lives at
|
|
2301
|
+
`data/paradata/<site_slug>/stratigraphy.graphml`.
|
|
2302
|
+
|
|
2303
|
+
Paradata (authors, licenses, embargoes, documents, epochs) are stored in a
|
|
2304
|
+
JSON sidecar:
|
|
2305
|
+
```
|
|
2306
|
+
data/paradata/<site_slug>/paradata.json
|
|
2307
|
+
```
|
|
2308
|
+
because s3dgraphy 0.1.42's GraphML exporter does not round-trip standalone
|
|
2309
|
+
paradata nodes. The JSON sidecar IS committed to git.
|
|
2310
|
+
|
|
2311
|
+
### Paradata editing
|
|
2312
|
+
|
|
2313
|
+
Visit `/paradata/<site>/{authors,licenses,embargoes,documents,epochs}` to
|
|
2314
|
+
manage paradata. REST endpoints under `/api/v1/paradata/<site>/...` mirror
|
|
2315
|
+
the UI. See `docs/PARADATA_GUIDE.md`.
|
|
2316
|
+
|
|
2317
|
+
### Graph import
|
|
2318
|
+
|
|
2319
|
+
`/sites/<site>/graph/import-preview` accepts a GraphML upload; you see a
|
|
2320
|
+
preview of planned INSERT/UPDATE/SKIP and must confirm via
|
|
2321
|
+
`/sites/<site>/graph/import-apply` before any DB write.
|
|
2322
|
+
|
|
2323
|
+
### Auto-regen control
|
|
2324
|
+
|
|
2325
|
+
- Disable globally: `export PYARCHINIT_DISABLE_AUTO_REGEN=1`
|
|
2326
|
+
- Disable during bulk ops: `with graphproj.auto_regen.disable_regen():`
|
|
2327
|
+
|
|
2328
|
+
See `docs/GRAPH_AUTO_REGEN.md`.
|
|
2329
|
+
|
|
2330
|
+
## Harris Swimlane Editor
|
|
2331
|
+
|
|
2332
|
+
Since 2.4.0, the Harris Matrix Creator at `/harris-creator/editor`
|
|
2333
|
+
displays stratigraphic graphs with **yEd-like swimlanes** — horizontal
|
|
2334
|
+
rows representing periods+phases. Existing US records are auto-placed
|
|
2335
|
+
in their row based on `periodo_iniziale + fase_iniziale`. Users can
|
|
2336
|
+
drag US records between rows, create new rows interactively, and save
|
|
2337
|
+
back to the DB.
|
|
2338
|
+
|
|
2339
|
+
Row source priority:
|
|
2340
|
+
1. `period_table` (formal definitions)
|
|
2341
|
+
2. Fallback: distinct `(periodo_iniziale, fase_iniziale)` from
|
|
2342
|
+
`periodizzazione_table` + `us_table`
|
|
2343
|
+
|
|
2344
|
+
### Two GraphML outputs
|
|
2345
|
+
|
|
2346
|
+
- `data/paradata/<site>/stratigraphy.graphml` (Spec 2, auto-regen):
|
|
2347
|
+
s3dgraphy clean, EM-canonical, for the EM Datacenter
|
|
2348
|
+
- `data/exports/harris_yed/<site>-harris-yed.graphml` (Spec 3-bis,
|
|
2349
|
+
on-demand): yEd-flavored with `y:TableNode`, for users editing in
|
|
2350
|
+
yEd Desktop
|
|
2351
|
+
|
|
2352
|
+
### Auto-regen integration
|
|
2353
|
+
|
|
2354
|
+
Save endpoint also triggers Spec 2's auto_regen for
|
|
2355
|
+
`stratigraphy.graphml`, keeping the canonical output consistent with
|
|
2356
|
+
DB state.
|
|
2357
|
+
|
|
2358
|
+
See `docs/HARRIS_SWIMLANE.md` and `docs/YED_INTEGRATION.md`.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""CLI: pyarchinit-mini-migrate-vocab
|
|
2
|
+
|
|
3
|
+
Wraps the 3 Spec 1 Foundation migrations (node_uuid schema → backfill →
|
|
4
|
+
vocab alignment USVA/USVB→USVs USVC→USVn) and the backup module.
|
|
5
|
+
|
|
6
|
+
Discovery order for target DBs:
|
|
7
|
+
1. --database <url> (CLI flag, wins outright)
|
|
8
|
+
2. $DATABASE_URL (default app DB)
|
|
9
|
+
3. data/connections.json (saved web connections; skip with --only-default)
|
|
10
|
+
|
|
11
|
+
Usage examples:
|
|
12
|
+
pyarchinit-mini-migrate-vocab --dry-run
|
|
13
|
+
pyarchinit-mini-migrate-vocab --apply --yes
|
|
14
|
+
pyarchinit-mini-migrate-vocab --rollback --yes
|
|
15
|
+
pyarchinit-mini-migrate-vocab --list-backups
|
|
16
|
+
pyarchinit-mini-migrate-vocab --apply --script vocab_alignment --database sqlite:///x.db --yes
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import importlib
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
import sys
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
|
|
27
|
+
# Use importlib to avoid name collisions with the legacy DatabaseMigrations
|
|
28
|
+
# class exported from pyarchinit_mini.database.migrations.__init__.
|
|
29
|
+
_pkg = "pyarchinit_mini.database.migrations"
|
|
30
|
+
schema_m = importlib.import_module(f"{_pkg}._2026_05_node_uuid_schema")
|
|
31
|
+
backfill_m = importlib.import_module(f"{_pkg}._2026_05_node_uuid_backfill")
|
|
32
|
+
align_m = importlib.import_module(f"{_pkg}._2026_05_vocab_alignment")
|
|
33
|
+
|
|
34
|
+
from pyarchinit_mini.database.migrations.backup import backup_database # noqa: E402
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
SCRIPTS = {
|
|
38
|
+
"node_uuid_schema": schema_m,
|
|
39
|
+
"node_uuid_backfill": backfill_m,
|
|
40
|
+
"vocab_alignment": align_m,
|
|
41
|
+
}
|
|
42
|
+
ORDER = ["node_uuid_schema", "node_uuid_backfill", "vocab_alignment"]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _discover_dbs(args) -> list[str]:
|
|
46
|
+
if args.database:
|
|
47
|
+
return [args.database]
|
|
48
|
+
dbs: list[str] = []
|
|
49
|
+
env = os.environ.get("DATABASE_URL")
|
|
50
|
+
if env:
|
|
51
|
+
dbs.append(env)
|
|
52
|
+
if not args.only_default:
|
|
53
|
+
conns = Path("data/connections.json")
|
|
54
|
+
if conns.exists():
|
|
55
|
+
try:
|
|
56
|
+
data = json.loads(conns.read_text(encoding="utf-8"))
|
|
57
|
+
for entry in data.get("connections", []):
|
|
58
|
+
url = entry.get("url")
|
|
59
|
+
if url and url not in dbs:
|
|
60
|
+
dbs.append(url)
|
|
61
|
+
except json.JSONDecodeError:
|
|
62
|
+
print(f"warning: could not parse {conns}", file=sys.stderr)
|
|
63
|
+
return dbs
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _confirm(prompt: str, yes: bool) -> bool:
|
|
67
|
+
if yes:
|
|
68
|
+
return True
|
|
69
|
+
try:
|
|
70
|
+
ans = input(f"{prompt} [y/N] ").strip().lower()
|
|
71
|
+
except EOFError:
|
|
72
|
+
return False
|
|
73
|
+
return ans == "y"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _list_backups(backups_dir: Path) -> int:
|
|
77
|
+
idx = backups_dir / "_index.json"
|
|
78
|
+
if not idx.exists():
|
|
79
|
+
print("No backups found.")
|
|
80
|
+
return 0
|
|
81
|
+
for r in json.loads(idx.read_text(encoding="utf-8")):
|
|
82
|
+
print(f"{r['timestamp']} {r['backup_path']} ({r['size_bytes']} bytes)")
|
|
83
|
+
return 0
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def main(argv=None) -> int:
|
|
87
|
+
p = argparse.ArgumentParser(
|
|
88
|
+
prog="pyarchinit-mini-migrate-vocab",
|
|
89
|
+
description="Foundation migrations: node_uuid schema + backfill + vocab alignment.",
|
|
90
|
+
)
|
|
91
|
+
mode = p.add_mutually_exclusive_group(required=True)
|
|
92
|
+
mode.add_argument("--dry-run", action="store_true", help="Report changes without mutating")
|
|
93
|
+
mode.add_argument("--apply", action="store_true", help="Backup then apply migrations")
|
|
94
|
+
mode.add_argument("--rollback", action="store_true", help="(Manual) restore from backup")
|
|
95
|
+
mode.add_argument("--list-backups", action="store_true", help="List recorded backups")
|
|
96
|
+
p.add_argument("--database", type=str, help="Target a specific DB URL")
|
|
97
|
+
p.add_argument("--script", type=str, choices=list(SCRIPTS.keys()),
|
|
98
|
+
help="Run a single script (advanced)")
|
|
99
|
+
p.add_argument("--only-default", action="store_true",
|
|
100
|
+
help="Skip data/connections.json discovery")
|
|
101
|
+
p.add_argument("--backups-dir", type=Path, default=Path("data/backups"))
|
|
102
|
+
p.add_argument("--yes", action="store_true", help="Skip confirmation prompts")
|
|
103
|
+
args = p.parse_args(argv)
|
|
104
|
+
|
|
105
|
+
if args.list_backups:
|
|
106
|
+
return _list_backups(args.backups_dir)
|
|
107
|
+
|
|
108
|
+
if args.rollback:
|
|
109
|
+
# TODO(Spec-2): implement actual rollback (read _index.json → restore latest backup
|
|
110
|
+
# SQLite via cp / PG via pg_restore). Currently prints manual instructions only.
|
|
111
|
+
print("Rollback requires manual restore. Use --list-backups to see what's available,")
|
|
112
|
+
print("then copy/restore the backup file manually (SQLite) or pg_restore (PostgreSQL).")
|
|
113
|
+
return 0
|
|
114
|
+
|
|
115
|
+
dbs = _discover_dbs(args)
|
|
116
|
+
if not dbs:
|
|
117
|
+
print("No databases discovered. Use --database <url> or set DATABASE_URL.",
|
|
118
|
+
file=sys.stderr)
|
|
119
|
+
return 2
|
|
120
|
+
|
|
121
|
+
scripts_to_run = (
|
|
122
|
+
[SCRIPTS[args.script]] if args.script
|
|
123
|
+
else [SCRIPTS[k] for k in ORDER]
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# TODO(Spec-2): acquire data/.migration_lock (PID + timestamp) to reject concurrent
|
|
127
|
+
# --apply invocations per Spec §6.3
|
|
128
|
+
overall_status = 0
|
|
129
|
+
for db in dbs:
|
|
130
|
+
print(f"== DB: {db} ==")
|
|
131
|
+
if args.apply:
|
|
132
|
+
if not _confirm(f"Backup and migrate {db}?", args.yes):
|
|
133
|
+
print(" skipped (no confirmation)")
|
|
134
|
+
continue
|
|
135
|
+
try:
|
|
136
|
+
rec = backup_database(db, backups_dir=args.backups_dir)
|
|
137
|
+
print(f" backup: {rec.backup_path}")
|
|
138
|
+
except Exception as e:
|
|
139
|
+
print(f" backup failed: {e}", file=sys.stderr)
|
|
140
|
+
overall_status = 1
|
|
141
|
+
continue
|
|
142
|
+
for script in scripts_to_run:
|
|
143
|
+
try:
|
|
144
|
+
report = script.run(db, dry_run=args.dry_run)
|
|
145
|
+
print(f" {report.script}: status={report.status}")
|
|
146
|
+
if hasattr(report, "tables_changed") and report.tables_changed:
|
|
147
|
+
print(f" tables_changed: {report.tables_changed}")
|
|
148
|
+
if hasattr(report, "tables_skipped") and report.tables_skipped:
|
|
149
|
+
print(f" tables_skipped: {report.tables_skipped}")
|
|
150
|
+
if hasattr(report, "rows_updated"):
|
|
151
|
+
print(f" rows_updated: {report.rows_updated}")
|
|
152
|
+
if hasattr(report, "mappings"):
|
|
153
|
+
print(f" mappings: {report.mappings}")
|
|
154
|
+
except Exception as e:
|
|
155
|
+
print(f" {script.__name__} FAILED: {e}", file=sys.stderr)
|
|
156
|
+
overall_status = 1
|
|
157
|
+
|
|
158
|
+
# TODO(Spec-2): append per-script JSON-line entry to data/migration.log per Spec §6.4
|
|
159
|
+
# (ts, script, db, rows_updated/mappings/tables_*, duration_ms, status)
|
|
160
|
+
return overall_status
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
if __name__ == "__main__":
|
|
164
|
+
sys.exit(main())
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""Backfill migration (2026-05-16):
|
|
2
|
+
Populates `node_uuid` column with UUID v7 values on us_table,
|
|
3
|
+
inventario_materiali_table, periodizzazione_table. Batched at 1000 rows.
|
|
4
|
+
|
|
5
|
+
Idempotent: only updates rows WHERE node_uuid IS NULL.
|
|
6
|
+
"""
|
|
7
|
+
import sqlite3
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
|
|
10
|
+
from pyarchinit_mini.database.utils import generate_node_uuid
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class MigrationReport:
|
|
15
|
+
script: str
|
|
16
|
+
db: str
|
|
17
|
+
rows_updated: dict = field(default_factory=dict)
|
|
18
|
+
dry_run: bool = False
|
|
19
|
+
status: str = "ok"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
TABLES = ("us_table", "inventario_materiali_table", "periodizzazione_table")
|
|
23
|
+
BATCH = 1000
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _backfill_sqlite(db_path: str, dry_run: bool) -> dict:
|
|
27
|
+
conn = sqlite3.connect(db_path)
|
|
28
|
+
out = {}
|
|
29
|
+
try:
|
|
30
|
+
for t in TABLES:
|
|
31
|
+
# Determine PK column. For test fixtures it's "id"; for real
|
|
32
|
+
# pyarchinit_mini.models.us.US it's "id_us". Inspect the table.
|
|
33
|
+
cols = conn.execute(f"PRAGMA table_info({t})").fetchall()
|
|
34
|
+
pk_col = next((c[1] for c in cols if c[5]), None)
|
|
35
|
+
if pk_col is None:
|
|
36
|
+
out[t] = 0
|
|
37
|
+
continue
|
|
38
|
+
col_names = {c[1] for c in cols}
|
|
39
|
+
if "node_uuid" not in col_names:
|
|
40
|
+
# Column not yet added (e.g. schema migration was dry-run)
|
|
41
|
+
out[t] = 0
|
|
42
|
+
continue
|
|
43
|
+
rows = conn.execute(
|
|
44
|
+
f"SELECT {pk_col} FROM {t} WHERE node_uuid IS NULL"
|
|
45
|
+
).fetchall()
|
|
46
|
+
count = len(rows)
|
|
47
|
+
if count == 0 or dry_run:
|
|
48
|
+
out[t] = count
|
|
49
|
+
continue
|
|
50
|
+
for offset in range(0, count, BATCH):
|
|
51
|
+
batch = rows[offset:offset + BATCH]
|
|
52
|
+
for (row_id,) in batch:
|
|
53
|
+
conn.execute(
|
|
54
|
+
f"UPDATE {t} SET node_uuid=? WHERE {pk_col}=?",
|
|
55
|
+
(generate_node_uuid(), row_id)
|
|
56
|
+
)
|
|
57
|
+
conn.commit()
|
|
58
|
+
out[t] = count
|
|
59
|
+
finally:
|
|
60
|
+
conn.close()
|
|
61
|
+
return out
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _backfill_postgresql(url: str, dry_run: bool) -> dict:
|
|
65
|
+
from sqlalchemy import create_engine, text, inspect
|
|
66
|
+
eng = create_engine(url)
|
|
67
|
+
out = {}
|
|
68
|
+
inspector = inspect(eng)
|
|
69
|
+
with eng.begin() as c:
|
|
70
|
+
for t in TABLES:
|
|
71
|
+
if t not in inspector.get_table_names():
|
|
72
|
+
out[t] = 0
|
|
73
|
+
continue
|
|
74
|
+
pk_cols = inspector.get_pk_constraint(t).get("constrained_columns", [])
|
|
75
|
+
if not pk_cols:
|
|
76
|
+
out[t] = 0
|
|
77
|
+
continue
|
|
78
|
+
pk_col = pk_cols[0]
|
|
79
|
+
rows = c.execute(text(f"SELECT {pk_col} FROM {t} WHERE node_uuid IS NULL")).fetchall()
|
|
80
|
+
count = len(rows)
|
|
81
|
+
if not dry_run and count > 0:
|
|
82
|
+
for (row_id,) in rows:
|
|
83
|
+
c.execute(
|
|
84
|
+
text(f"UPDATE {t} SET node_uuid=:u WHERE {pk_col}=:i"),
|
|
85
|
+
{"u": generate_node_uuid(), "i": row_id}
|
|
86
|
+
)
|
|
87
|
+
out[t] = count
|
|
88
|
+
return out
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def run(connection_url: str, *, dry_run: bool = False) -> MigrationReport:
|
|
92
|
+
report = MigrationReport(
|
|
93
|
+
script="2026_05_node_uuid_backfill",
|
|
94
|
+
db=connection_url,
|
|
95
|
+
dry_run=dry_run,
|
|
96
|
+
)
|
|
97
|
+
if connection_url.startswith("sqlite"):
|
|
98
|
+
path = connection_url.replace("sqlite:///", "", 1)
|
|
99
|
+
report.rows_updated = _backfill_sqlite(path, dry_run)
|
|
100
|
+
elif connection_url.startswith("postgresql") or connection_url.startswith("postgres"):
|
|
101
|
+
report.rows_updated = _backfill_postgresql(connection_url, dry_run)
|
|
102
|
+
else:
|
|
103
|
+
report.status = "unsupported_backend"
|
|
104
|
+
return report
|