pyarchinit-mini 2.9.0__tar.gz → 2.9.2__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.
Files changed (544) hide show
  1. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/CHANGELOG.md +22 -0
  2. {pyarchinit_mini-2.9.0/pyarchinit_mini.egg-info → pyarchinit_mini-2.9.2}/PKG-INFO +1 -1
  3. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/__init__.py +1 -1
  4. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/rapporti_codec.py +15 -2
  5. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/s3d_projector.py +14 -5
  6. pyarchinit_mini-2.9.2/pyarchinit_mini/graphproj/s3d_to_cytoscape.py +134 -0
  7. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/translations/vocab_it.json +5 -1
  8. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/app.py +10 -0
  9. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/harris_creator_routes.py +33 -6
  10. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +70 -17
  11. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +40 -16
  12. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
  13. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyproject.toml +1 -1
  14. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_api_load_site.py +28 -15
  15. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_rapporti_codec.py +4 -2
  16. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_s3d_projector.py +90 -0
  17. pyarchinit_mini-2.9.2/tests/unit/test_s3d_to_cytoscape.py +138 -0
  18. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_i18n.py +8 -3
  19. pyarchinit_mini-2.9.0/pyarchinit_mini/graphproj/s3d_to_cytoscape.py +0 -105
  20. pyarchinit_mini-2.9.0/tests/unit/test_s3d_to_cytoscape.py +0 -76
  21. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/MANIFEST.in +0 -0
  22. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/README.md +0 -0
  23. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/babel.cfg +0 -0
  24. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/media_viewer_demo.db +0 -0
  25. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_mini 2.db +0 -0
  26. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_mini.db +0 -0
  27. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_mini_sample.db +0 -0
  28. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_tutorial.db +0 -0
  29. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
  30. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_tutorial_clean.db +0 -0
  31. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_tutorial_video.db +0 -0
  32. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/data/pyarchinit_v18_demo.db +0 -0
  33. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/logo/logo_pyarchinit-mini.png +0 -0
  34. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/ai_matrix/__init__.py +0 -0
  35. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/ai_matrix/apply.py +0 -0
  36. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/ai_matrix/plan.py +0 -0
  37. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/ai_matrix/vision_extractor.py +0 -0
  38. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/__init__.py +0 -0
  39. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/auth.py +0 -0
  40. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/dependencies.py +0 -0
  41. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/graphml.py +0 -0
  42. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/inventario.py +0 -0
  43. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/schemas.py +0 -0
  44. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/site.py +0 -0
  45. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/sync.py +0 -0
  46. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/api/us.py +0 -0
  47. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/__init__.py +0 -0
  48. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/export_import_cli.py +0 -0
  49. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
  50. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/graphml_cli.py +0 -0
  51. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/harris_import.py +0 -0
  52. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/harris_template.py +0 -0
  53. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/migrate.py +0 -0
  54. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
  55. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
  56. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli/sync_cli.py +0 -0
  57. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli_interface/__init__.py +0 -0
  58. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
  59. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/config/__init__.py +0 -0
  60. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/config/connection_manager.py +0 -0
  61. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
  62. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/config/em_node_types.yaml +0 -0
  63. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/__init__.py +0 -0
  64. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/concurrency_manager.py +0 -0
  65. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/connection.py +0 -0
  66. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/database_creator.py +0 -0
  67. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/manager.py +0 -0
  68. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
  69. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
  70. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
  71. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
  72. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
  73. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
  74. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
  75. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
  76. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
  77. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
  78. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/__init__.py +0 -0
  79. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/migrations/backup.py +0 -0
  80. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/postgres_installer.py +0 -0
  81. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/schemas.py +0 -0
  82. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/database/utils.py +0 -0
  83. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
  84. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
  85. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
  86. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
  87. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
  88. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
  89. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
  90. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
  91. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
  92. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
  93. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/icons.py +0 -0
  94. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
  95. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
  96. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
  97. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
  98. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
  99. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
  100. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
  101. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
  102. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
  103. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/dto/__init__.py +0 -0
  104. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/dto/inventario_dto.py +0 -0
  105. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/dto/site_dto.py +0 -0
  106. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/dto/us_dto.py +0 -0
  107. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/em_palette/__init__.py +0 -0
  108. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/em_palette/loader.py +0 -0
  109. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/em_palette/styles.py +0 -0
  110. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/exceptions.py +0 -0
  111. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
  112. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/converter.py +0 -0
  113. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
  114. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
  115. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
  116. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
  117. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
  118. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
  119. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
  120. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
  121. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
  122. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/__init__.py +0 -0
  123. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/reader.py +0 -0
  124. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/writer.py +0 -0
  125. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/yed_importer.py +0 -0
  126. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/yed_keys.py +0 -0
  127. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphml_io/yed_writer.py +0 -0
  128. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/__init__.py +0 -0
  129. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
  130. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
  131. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/exceptions.py +0 -0
  132. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/filesystem.py +0 -0
  133. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/graph_to_db.py +0 -0
  134. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/graphml_reader.py +0 -0
  135. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/graphml_writer.py +0 -0
  136. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/heriverse_parser.py +0 -0
  137. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
  138. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/ingestor.py +0 -0
  139. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
  140. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/graphproj/projector.py +0 -0
  141. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
  142. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
  143. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
  144. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
  145. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
  146. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
  147. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
  148. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/exceptions.py +0 -0
  149. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/harris_layout.py +0 -0
  150. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
  151. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
  152. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/harris_swimlane/swimlane_state.py +0 -0
  153. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/i18n/__init__.py +0 -0
  154. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
  155. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/i18n/lang_routes.py +0 -0
  156. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/i18n/locale_manager.py +0 -0
  157. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/__init__.py +0 -0
  158. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/__main__.py +0 -0
  159. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
  160. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/config.py +0 -0
  161. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
  162. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
  163. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/http_server.py +0 -0
  164. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
  165. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
  166. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
  167. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
  168. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
  169. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
  170. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
  171. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
  172. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
  173. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
  174. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
  175. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
  176. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
  177. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
  178. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/server.py +0 -0
  179. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
  180. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
  181. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
  182. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
  183. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
  184. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
  185. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
  186. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
  187. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
  188. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
  189. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
  190. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
  191. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
  192. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
  193. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
  194. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
  195. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
  196. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
  197. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
  198. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
  199. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
  200. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
  201. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
  202. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
  203. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
  204. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
  205. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
  206. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
  207. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
  208. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
  209. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
  210. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
  211. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
  212. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
  213. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/media_manager/__init__.py +0 -0
  214. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/media_manager/media_handler.py +0 -0
  215. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/__init__.py +0 -0
  216. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/ai_chat.py +0 -0
  217. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/app_setting.py +0 -0
  218. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/base.py +0 -0
  219. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/datazione.py +0 -0
  220. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/extended_matrix.py +0 -0
  221. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/harris_matrix.py +0 -0
  222. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/inventario_materiali.py +0 -0
  223. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/media.py +0 -0
  224. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/pottery.py +0 -0
  225. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/site.py +0 -0
  226. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/thesaurus.py +0 -0
  227. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/tma.py +0 -0
  228. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/us.py +0 -0
  229. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/models/user.py +0 -0
  230. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/__init__.py +0 -0
  231. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
  232. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
  233. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
  234. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
  235. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
  236. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
  237. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
  238. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
  239. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/__init__.py +0 -0
  240. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/auto_translate.py +0 -0
  241. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
  242. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
  243. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
  244. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
  245. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
  246. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
  247. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
  248. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
  249. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
  250. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
  251. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
  252. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
  253. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/setup_auth.py +0 -0
  254. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
  255. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
  256. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
  257. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
  258. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
  259. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/scripts/verify_docs.py +0 -0
  260. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/__init__.py +0 -0
  261. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
  262. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/ai_chat_service.py +0 -0
  263. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/analytics_service.py +0 -0
  264. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/app_setting_service.py +0 -0
  265. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/backup_service.py +0 -0
  266. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/command_parser.py +0 -0
  267. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/datazione_service.py +0 -0
  268. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/export_import_service.py +0 -0
  269. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
  270. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/import_export_service.py +0 -0
  271. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/inventario_service.py +0 -0
  272. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/mcp_executor.py +0 -0
  273. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/media_service.py +0 -0
  274. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
  275. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/pottery_dto.py +0 -0
  276. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
  277. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/pottery_service.py +0 -0
  278. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
  279. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/search_service.py +0 -0
  280. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/site_service.py +0 -0
  281. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/thesaurus_service.py +0 -0
  282. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/tma_service.py +0 -0
  283. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/us_service.py +0 -0
  284. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/services/user_service.py +0 -0
  285. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/__init__.py +0 -0
  286. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
  287. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
  288. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
  289. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
  290. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
  291. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
  292. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
  293. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
  294. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
  295. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
  296. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
  297. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
  298. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/translations/messages.pot +0 -0
  299. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/__init__.py +0 -0
  300. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/auth.py +0 -0
  301. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/exceptions.py +0 -0
  302. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/relationship_validator.py +0 -0
  303. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
  304. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
  305. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/utils/validators.py +0 -0
  306. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/__init__.py +0 -0
  307. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/exceptions.py +0 -0
  308. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/i18n.py +0 -0
  309. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/loader.py +0 -0
  310. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/provider.py +0 -0
  311. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
  312. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/vocab/types.py +0 -0
  313. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
  314. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/data/paradata/domus-pompeiana/stratigraphy.graphml +0 -0
  315. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/data/paradata/metro-c-amba-aradam/stratigraphy.graphml +0 -0
  316. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/data/paradata/pompei-regio-vii/stratigraphy.graphml +0 -0
  317. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
  318. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
  319. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
  320. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/matrix_import_routes.py +0 -0
  321. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/matrix_tools_routes.py +0 -0
  322. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
  323. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
  324. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/pottery_routes.py +0 -0
  325. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
  326. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
  327. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
  328. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
  329. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
  330. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
  331. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
  332. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
  333. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
  334. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
  335. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
  336. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
  337. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
  338. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
  339. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
  340. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
  341. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
  342. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
  343. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
  344. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
  345. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
  346. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
  347. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
  348. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
  349. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
  350. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
  351. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
  352. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
  353. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
  354. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/base.html +0 -0
  355. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
  356. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -0
  357. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
  358. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
  359. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
  360. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
  361. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
  362. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
  363. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
  364. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
  365. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
  366. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
  367. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
  368. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
  369. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
  370. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
  371. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
  372. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
  373. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
  374. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/matrix_import/preview.html +0 -0
  375. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/matrix_import/rejected.html +0 -0
  376. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/matrix_import/upload.html +0 -0
  377. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/matrix_tools/index.html +0 -0
  378. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
  379. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
  380. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
  381. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
  382. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
  383. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
  384. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
  385. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
  386. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
  387. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
  388. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
  389. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pottery/detail.html +0 -0
  390. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
  391. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
  392. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pottery/list.html +0 -0
  393. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
  394. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
  395. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
  396. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
  397. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
  398. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
  399. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
  400. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
  401. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
  402. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
  403. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
  404. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
  405. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
  406. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/yed_import/index.html +0 -0
  407. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/yed_import/preview.html +0 -0
  408. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/templates/yed_import/result.html +0 -0
  409. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
  410. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
  411. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
  412. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  413. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
  414. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
  415. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
  416. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
  417. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  418. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini/web_interface/yed_import_routes.py +0 -0
  419. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/SOURCES.txt +0 -0
  420. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
  421. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
  422. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
  423. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/requires.txt +0 -0
  424. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/pyarchinit_mini.egg-info/top_level.txt +0 -0
  425. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/requirements.txt +0 -0
  426. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/setup.cfg +0 -0
  427. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/setup.py +0 -0
  428. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/__init__.py +0 -0
  429. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/conftest.py +0 -0
  430. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/e2e/__init__.py +0 -0
  431. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/e2e/test_web_vocab_full_flow.py +0 -0
  432. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/fixtures/_generate_baseline_graphml.py +0 -0
  433. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
  434. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/fixtures/_generate_synthetic_db.py +0 -0
  435. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/fixtures/_generate_yed_test_files.py +0 -0
  436. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/fixtures/build_legacy_with_pottery.py +0 -0
  437. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/__init__.py +0 -0
  438. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_adarte_regression.py +0 -0
  439. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_admin_ai_settings_routes.py +0 -0
  440. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_admin_backup_routes.py +0 -0
  441. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_api_export_graphml.py +0 -0
  442. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_api_export_heriverse.py +0 -0
  443. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_api_import_graphml.py +0 -0
  444. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_api_import_json.py +0 -0
  445. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_auto_regen_on_save.py +0 -0
  446. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_feature_flag_pipelines.py +0 -0
  447. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_full_sync_flow.py +0 -0
  448. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_graph_import_flow.py +0 -0
  449. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_graph_routes.py +0 -0
  450. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
  451. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
  452. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
  453. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
  454. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
  455. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
  456. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_lang_routes.py +0 -0
  457. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_matrix_import_apply_route.py +0 -0
  458. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_matrix_import_rejected_route.py +0 -0
  459. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_matrix_import_site_widget.py +0 -0
  460. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_matrix_import_upload_route.py +0 -0
  461. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_migrate_vocab_cli.py +0 -0
  462. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_paradata_routes_authors.py +0 -0
  463. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_paradata_routes_other_types.py +0 -0
  464. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_paradata_ui.py +0 -0
  465. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_completion.py +0 -0
  466. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
  467. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_filters_id_number_anno.py +0 -0
  468. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
  469. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_list_media_thumbs.py +0 -0
  470. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_pottery_routes.py +0 -0
  471. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_roundtrip.py +0 -0
  472. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_roundtrip_extmatrix.py +0 -0
  473. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_spec2_coverage_gaps.py +0 -0
  474. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_swimlane_group_by.py +0 -0
  475. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_vocab_routes.py +0 -0
  476. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_yed_export_route.py +0 -0
  477. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_yed_import_routes.py +0 -0
  478. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/integration/test_yed_writer_parity.py +0 -0
  479. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/__init__.py +0 -0
  480. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_ai_matrix_apply.py +0 -0
  481. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_ai_matrix_extractor_parse.py +0 -0
  482. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_ai_matrix_extractor_providers.py +0 -0
  483. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_ai_matrix_plan_serialization.py +0 -0
  484. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_app_setting_model.py +0 -0
  485. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_app_setting_service.py +0 -0
  486. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_auto_regen.py +0 -0
  487. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_backup_service.py +0 -0
  488. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_bundle.py +0 -0
  489. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_concurrency_columns.py +0 -0
  490. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_concurrency_manager.py +0 -0
  491. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_connectivity_monitor.py +0 -0
  492. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_database_utils.py +0 -0
  493. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_deprecated_writers_shim.py +0 -0
  494. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_em_palette_vocab_backed.py +0 -0
  495. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graph_to_db.py +0 -0
  496. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphml_io_reader.py +0 -0
  497. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphml_io_writer.py +0 -0
  498. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_edge_registry.py +0 -0
  499. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_exceptions.py +0 -0
  500. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_filesystem.py +0 -0
  501. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
  502. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
  503. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_graphproj_projector.py +0 -0
  504. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_layout.py +0 -0
  505. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
  506. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
  507. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
  508. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
  509. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_state_load.py +0 -0
  510. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_harris_swimlane_state_save.py +0 -0
  511. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_heriverse_parser.py +0 -0
  512. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_ingest_plan.py +0 -0
  513. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_inventario_schema.py +0 -0
  514. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_migrations_backup.py +0 -0
  515. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_migrations_idempotent.py +0 -0
  516. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_optimistic_locking.py +0 -0
  517. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_palette_loader.py +0 -0
  518. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_palette_styles.py +0 -0
  519. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_paradata_store_authors.py +0 -0
  520. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_paradata_store_basic.py +0 -0
  521. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_paradata_store_other_types.py +0 -0
  522. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_pottery_dto.py +0 -0
  523. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_pottery_model.py +0 -0
  524. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_pottery_service.py +0 -0
  525. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_rapporti_codec_display.py +0 -0
  526. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
  527. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_site_service.py +0 -0
  528. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_sync_api.py +0 -0
  529. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_sync_cli.py +0 -0
  530. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_sync_orchestrator.py +0 -0
  531. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_sync_queue.py +0 -0
  532. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_sync_state_machine.py +0 -0
  533. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
  534. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_us_schema.py +0 -0
  535. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_uuid_manager.py +0 -0
  536. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
  537. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_exceptions.py +0 -0
  538. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_loader.py +0 -0
  539. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_provider.py +0 -0
  540. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_vocab_types.py +0 -0
  541. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_yed_importer_parse.py +0 -0
  542. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_yed_importer_plan.py +0 -0
  543. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_yed_writer.py +0 -0
  544. {pyarchinit_mini-2.9.0 → pyarchinit_mini-2.9.2}/tests/unit/test_yed_writer_extended_matrix.py +0 -0
@@ -1,3 +1,25 @@
1
+ ## 2.9.1 — 2026-05-19
2
+
3
+ ### Fixed — Harris Matrix proper rendering (post-2.9.0 feedback)
4
+ - **Edge direction normalized to forward**: was reading "Coperto da" / "Tagliato da" etc. on the swimlane. Harris convention is recent→ancient with forward labels. Now every inverse canonical (`is_after`, `is_cut_by`, `is_filled_by`, `is_abutted_by`) is auto-swapped to its forward (`overlies`/`cuts`/`fills`/`abuts`) with source/target reversed. User reads "Copre" / "Taglia" / "Riempie" / "Si appoggia a".
5
+ - **Arrows now visible**: was missing because cytoscape's `data(style.targetArrowShape)` dot-notation accessor didn't resolve nested objects. All palette/edge fields flattened into top-level data keys (`shape`, `bgcolor`, `bordercolor`, `linecolor`, `arrowtarget`, …). Selectors `node[shape]`, `edge[linecolor]` etc. now match reliably.
6
+ - **Palette node styling visible**: USM/USD/USV/SF/VSF/TSU now appear with their palette shape + colors (was plain gray rectangles). Same flattening fix.
7
+ - **Period rows as compound swimlanes**: every US node is a child of its `period_row_N` compound parent (visible as a horizontal lane on the canvas with label "Periodo X — Fase Y — Datazione"). Sub-groupings (area/settore/quadrato/attivita/strutture) nest INSIDE period rows as sub-clusters.
8
+ - **Symmetric edges without arrows**: `has_same_time` / `is_bonded_to` now render as solid lines, no arrow heads, thicker stroke for visibility.
9
+ - **Vertical layout**: dagre `rankDir: "TB"` (top-to-bottom) — newer US on top, older on bottom.
10
+ - **Cuts dashed**: `cuts` edges get `line-style: dashed` (Harris convention).
11
+
12
+ ### Fixed — Vocabulary corrections
13
+ - `vocab_it.json` had `"tagliato da"` mapping to `is_after` (wrong) — corrected to `is_cut_by`.
14
+ - `_IT_EXTRAS` had `"riempito da"` → `"is_after"` (wrong) — corrected to `is_filled_by`.
15
+ - `_IT_EXTRAS` had `"gli si appoggia"` → `"is_before"` (wrong) — corrected to `is_abutted_by`.
16
+
17
+ ### Internals
18
+ - New constant `rapporti_codec.REVERSE_TO_FORWARD: Dict[str, str]` lookup.
19
+ - `s3d_projector._load_edges` normalizes inverse direction before dedup.
20
+ - `s3d_to_cytoscape.to_cytoscape` emits flat data fields + ALWAYS-on period row compounds (even with `group_by=none`).
21
+ - `harris_creator_editor.js` rebuilt cytoscape style selectors against flat data; layout switched to `rankDir: "TB"`.
22
+
1
23
  ## 2.9.0 — 2026-05-19
2
24
 
3
25
  ### Fixed — Swimlane UI/UX cleanup (post-2.8.0 feedback)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyarchinit-mini
3
- Version: 2.9.0
3
+ Version: 2.9.2
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
@@ -23,7 +23,7 @@ Features:
23
23
  - Scalable and modular architecture
24
24
  """
25
25
 
26
- __version__ = "2.9.0"
26
+ __version__ = "2.9.2"
27
27
  __author__ = "PyArchInit Team"
28
28
  __email__ = "enzo.ccc@gmail.com"
29
29
 
@@ -13,6 +13,15 @@ import logging
13
13
  from dataclasses import dataclass
14
14
  from typing import Dict, List, Optional
15
15
 
16
+ # Inverse canonicals that must be converted to their forward counterpart by
17
+ # swapping source and target. Only directional (non-symmetric) inverses.
18
+ REVERSE_TO_FORWARD: Dict[str, str] = {
19
+ "is_after": "overlies",
20
+ "is_cut_by": "cuts",
21
+ "is_filled_by": "fills",
22
+ "is_abutted_by": "abuts",
23
+ }
24
+
16
25
 
17
26
  logger = logging.getLogger(__name__)
18
27
 
@@ -36,14 +45,18 @@ INVERSE_PAIRS: Dict[str, str] = {
36
45
  # Italian aliases that are NOT in vocab_it.json (observed in live Adarte data
37
46
  # on Rimini_RN_2020_21_Museo_Fellini).
38
47
  _IT_EXTRAS: Dict[str, str] = {
39
- "riempito da": "is_after",
48
+ # Inverse directional aliases (will be swapped to forward by REVERSE_TO_FORWARD)
49
+ "riempito da": "is_filled_by", # was wrongly "is_after" — fixed
50
+ "tagliato da": "is_cut_by", # was missing
51
+ "coperto da": "is_after", # explicit fallback in case EdgeRegistry misses it
52
+ # Symmetric / other
40
53
  "si lega a": "is_bonded_to",
41
54
  "si lega_a": "is_bonded_to",
42
55
  "connesso a": "is_bonded_to",
43
56
  "connesso_a": "is_bonded_to",
44
57
  "anteriore a": "is_before",
45
58
  "posteriore a": "is_after",
46
- "gli si appoggia": "is_before",
59
+ "gli si appoggia": "is_abutted_by", # was "is_before" — fixed to proper inverse
47
60
  }
48
61
 
49
62
  # Canonical → italian display label (for swimlane web + GraphML edge labels).
@@ -18,7 +18,7 @@ from typing import Dict, List, Optional
18
18
  from sqlalchemy import text
19
19
  from sqlalchemy.orm import Session
20
20
 
21
- from pyarchinit_mini.graphproj.rapporti_codec import parse_rapporti, SYMMETRIC, INVERSE_PAIRS
21
+ from pyarchinit_mini.graphproj.rapporti_codec import parse_rapporti, SYMMETRIC, INVERSE_PAIRS, REVERSE_TO_FORWARD
22
22
 
23
23
 
24
24
  logger = logging.getLogger(__name__)
@@ -217,17 +217,26 @@ class S3DProjector:
217
217
  if src_id is None:
218
218
  continue
219
219
  for rap in parse_rapporti(rapp_raw, current_site=site):
220
+ canonical = rap.canonical
220
221
  tgt_id = us_index.get(rap.target_us)
221
222
  if tgt_id is None:
222
223
  continue
223
- if rap.canonical in SYMMETRIC:
224
- key = (rap.canonical, tuple(sorted((src_id, tgt_id))))
224
+ # Normalize inverse → forward + swap source/target so only
225
+ # forward canonicals (overlies, cuts, fills, abuts) appear in
226
+ # graph.edges. Symmetric edges are never swapped.
227
+ if canonical in REVERSE_TO_FORWARD:
228
+ canonical = REVERSE_TO_FORWARD[canonical]
229
+ src_id, tgt_id = tgt_id, src_id
230
+ if canonical in SYMMETRIC:
231
+ key = (canonical, tuple(sorted((src_id, tgt_id))))
225
232
  else:
226
- key = (rap.canonical, src_id, tgt_id)
233
+ key = (canonical, src_id, tgt_id)
227
234
  if key in seen:
228
235
  continue
229
236
  seen.add(key)
230
- graph.edges.append(Edge(source_id=src_id, target_id=tgt_id, canonical=rap.canonical))
237
+ graph.edges.append(Edge(source_id=src_id, target_id=tgt_id, canonical=canonical))
238
+ # Reset src_id to the original for the next iteration
239
+ src_id = us_index.get(str(us_num))
231
240
 
232
241
  # === Step A: Inverse dedup — drop the redundant inverse direction ===
233
242
  # E.g., if (overlies, A→B) exists, drop (is_after, B→A).
@@ -0,0 +1,134 @@
1
+ """Translate a ProjectedGraph into cytoscape.js JSON with palette-derived styles.
2
+
3
+ Changes from 2.9.0:
4
+ - Palette fields are FLAT top-level data keys (shape, bgcolor, bordercolor …)
5
+ instead of a nested ``style`` object. Cytoscape's ``data()`` accessor does
6
+ not reliably traverse nested objects, so ``data(style.shape)`` silently
7
+ returns nothing.
8
+ - Period rows are ALWAYS emitted as compound parents (regardless of group_by)
9
+ so the UI always shows horizontal swimlanes.
10
+ - When group_by != "none", sub-cluster compounds are nested INSIDE their period
11
+ row compound (cytoscape supports nested compounds).
12
+ """
13
+ from __future__ import annotations
14
+
15
+ from typing import Any, Dict, List, Tuple
16
+
17
+ from pyarchinit_mini.em_palette import get_palette
18
+ from pyarchinit_mini.graphproj.rapporti_codec import display_label, SYMMETRIC
19
+ from pyarchinit_mini.graphproj.s3d_projector import ProjectedGraph
20
+
21
+
22
+ def to_cytoscape(graph: ProjectedGraph) -> Dict[str, Any]:
23
+ palette = get_palette()
24
+ out_nodes: List[Dict[str, Any]] = []
25
+ out_edges: List[Dict[str, Any]] = []
26
+
27
+ # ── Fix C: ALWAYS emit period row compound parents first ─────────────────
28
+ for r in graph.rows:
29
+ label = r.label
30
+ if r.datazione:
31
+ label = f"{r.label} — {r.datazione}"
32
+ out_nodes.append({
33
+ "data": {
34
+ "id": r.row_id,
35
+ "label": label,
36
+ "compound": True,
37
+ "is_period_row": True,
38
+ "is_fallback": r.is_fallback,
39
+ },
40
+ })
41
+
42
+ # ── Fix D: sub-cluster compounds nested inside period rows ───────────────
43
+ # Indexed by (row_id, sub_group) → cluster node id
44
+ parent_ids: Dict[Tuple[str, str], str] = {}
45
+ if graph.group_by != "none":
46
+ for n in graph.nodes:
47
+ if n.sub_group is None:
48
+ continue
49
+ key = (n.row_id, n.sub_group)
50
+ if key not in parent_ids:
51
+ cluster_id = f"cluster_{n.row_id}_{n.sub_group}"
52
+ parent_ids[key] = cluster_id
53
+ out_nodes.append({
54
+ "data": {
55
+ "id": cluster_id,
56
+ "label": n.sub_group,
57
+ "row": n.row_id,
58
+ "compound": True,
59
+ "is_period_row": False,
60
+ # Nested inside the period row
61
+ "parent": n.row_id,
62
+ },
63
+ })
64
+
65
+ # ── Fix B: flat palette fields on US nodes ────────────────────────────────
66
+ for n in graph.nodes:
67
+ ns = palette.get_node_style(n.unit_type)
68
+
69
+ # Determine the immediate parent for this node
70
+ if graph.group_by != "none" and n.sub_group is not None:
71
+ immediate_parent = parent_ids.get((n.row_id, n.sub_group), n.row_id)
72
+ else:
73
+ immediate_parent = n.row_id
74
+
75
+ node_obj: Dict[str, Any] = {
76
+ "data": {
77
+ "id": n.node_id,
78
+ "label": n.us,
79
+ "us": n.us,
80
+ "area": n.area,
81
+ "unit_type": n.unit_type,
82
+ "description": n.description,
83
+ "row": n.row_id,
84
+ "parent": immediate_parent,
85
+ # ── Flat palette fields (Fix B) ──
86
+ "shape": ns.shape,
87
+ "bgcolor": ns.fill_color,
88
+ "bordercolor": ns.border_color,
89
+ "borderwidth": ns.border_width,
90
+ "borderstyle": ns.border_style,
91
+ "fontcolor": ns.font_color,
92
+ "fontsize": ns.font_size,
93
+ },
94
+ }
95
+ out_nodes.append(node_obj)
96
+
97
+ # ── Fix B: flat palette fields on edges ──────────────────────────────────
98
+ for e in graph.edges:
99
+ es = palette.get_edge_style(e.canonical)
100
+ is_symmetric = e.canonical in SYMMETRIC
101
+ out_edges.append({
102
+ "data": {
103
+ "id": f"{e.source_id}__{e.canonical}__{e.target_id}",
104
+ "source": e.source_id,
105
+ "target": e.target_id,
106
+ "label": display_label(e.canonical, locale="it"),
107
+ "canonical": e.canonical,
108
+ # ── Flat palette fields (Fix B) ──
109
+ "linecolor": es.line_color,
110
+ "linewidth": es.line_width,
111
+ "linestyle": es.line_style,
112
+ "arrowtarget": "none" if is_symmetric else es.arrow_target,
113
+ "arrowsource": es.arrow_source,
114
+ "is_dashed": "true" if e.canonical == "cuts" else "false",
115
+ },
116
+ })
117
+
118
+ return {
119
+ "site": graph.site,
120
+ "group_by": graph.group_by,
121
+ "rows": [
122
+ {
123
+ "row_id": r.row_id,
124
+ "label": r.label,
125
+ "periodo": r.periodo,
126
+ "fase": r.fase,
127
+ "datazione": r.datazione,
128
+ "is_fallback": r.is_fallback,
129
+ }
130
+ for r in graph.rows
131
+ ],
132
+ "nodes": out_nodes,
133
+ "edges": out_edges,
134
+ }
@@ -19,10 +19,14 @@
19
19
  },
20
20
  "edge_type_aliases": {
21
21
  "overlies": ["copre"],
22
- "is_after": ["coperto da", "coperta da", "tagliato da", "tagliata da"],
22
+ "is_after": ["coperto da", "coperta da"],
23
+ "is_cut_by": ["tagliato da", "tagliata da"],
24
+ "is_filled_by": ["riempito da", "riempita da"],
25
+ "is_abutted_by": ["gli si appoggia"],
23
26
  "cuts": ["taglia"],
24
27
  "fills": ["riempie"],
25
28
  "abuts": ["si appoggia a", "si appoggia"],
29
+ "is_bonded_to": ["si lega a", "si lega_a", "connesso a", "connesso_a"],
26
30
  "has_same_time": ["uguale a"]
27
31
  }
28
32
  }
@@ -3991,6 +3991,16 @@ def create_app():
3991
3991
  db_conn = DatabaseConnection.from_url(new_db_url)
3992
3992
  db_manager = DatabaseManager(db_conn)
3993
3993
 
3994
+ # Auto-apply schema migrations on the new DB so missing columns
3995
+ # (e.g. node_uuid added in 2.8.x) get created without a manual
3996
+ # `pyarchinit-mini-migrate-vocab` step. Failures are logged but
3997
+ # do not abort the switch — read-only users will still see data
3998
+ # they have access to, and admins can re-run the CLI migration.
3999
+ try:
4000
+ db_manager.run_migrations()
4001
+ except Exception as mig_err:
4002
+ print(f"[DATABASE SWITCH] Migration warning on {connection_name}: {mig_err}")
4003
+
3994
4004
  # Reinitialize ALL services with new database manager
3995
4005
  global site_service, us_service, inventario_service, thesaurus_service
3996
4006
  global user_service, analytics_service, relationship_sync_service, datazione_service
@@ -728,14 +728,41 @@ def api_get_swimlanes(site: str):
728
728
 
729
729
  @harris_creator_bp.get("/api/load/<site>")
730
730
  def api_load_state(site: str):
731
- """Load full editor state (rows + nodes + edges) as Cytoscape JSON."""
732
- # TODO(Spec-4): consider returning 404 when site is genuinely not in the
733
- # DB (no site_table row), versus 200 + empty state when site exists but
734
- # has no US yet. Spec §7.1 mentions 404 for site_not_found — current
735
- # behavior returns 200 + empty.
736
- group_by = request.args.get("group_by", "period_phase")
731
+ """Load full editor state (rows + nodes + edges) as Cytoscape JSON.
732
+
733
+ Pipeline selection honours SWIMLANE_PIPELINE env var:
734
+ - "s3dgraphy" (default): S3DProjector flat palette fields (Fix B/C/D)
735
+ - "legacy": SwimlaneState.load nested style dict (backward compat)
736
+ """
737
+ pipeline = os.environ.get("SWIMLANE_PIPELINE", "s3dgraphy").lower()
737
738
  try:
738
739
  session = _get_session()
740
+
741
+ if pipeline == "s3dgraphy":
742
+ # ── New pipeline: S3DProjector + flat-palette to_cytoscape ──────
743
+ from pyarchinit_mini.graphproj.s3d_projector import (
744
+ S3DProjector, VALID_GROUP_BY as S3D_VALID,
745
+ )
746
+ from pyarchinit_mini.graphproj.s3d_to_cytoscape import to_cytoscape
747
+
748
+ group_by = request.args.get("group_by", "none")
749
+ s3d_group_by = group_by if group_by in S3D_VALID else "none"
750
+ projected = S3DProjector.from_site(session, site, group_by=s3d_group_by)
751
+ cyto = to_cytoscape(projected)
752
+ # Wrap nodes/edges in the envelope renderSwimlaneState expects:
753
+ # each element is {data: {...}} (no nested style key — flat fields
754
+ # are already in data). Pending changes not relevant for this path.
755
+ return jsonify({
756
+ "site": cyto["site"],
757
+ "group_by": cyto["group_by"],
758
+ "rows": cyto["rows"],
759
+ "nodes": cyto["nodes"],
760
+ "edges": cyto["edges"],
761
+ "pending_changes": {"us_updates": [], "us_inserts": [], "us_deletes": []},
762
+ }), 200
763
+
764
+ # ── Legacy pipeline ──────────────────────────────────────────────────
765
+ group_by = request.args.get("group_by", "period_phase")
739
766
  state = SwimlaneState.load(session, site, group_by=group_by)
740
767
  return jsonify({
741
768
  "site": state.site,
@@ -320,29 +320,82 @@ function initCytoscape() {
320
320
  'target-arrow-shape': 'none'
321
321
  }
322
322
  },
323
- // Palette-driven styles: applied when node/edge carries a `style` data object
324
- // from the /api/load response (overrides defaults above).
323
+ // Palette-driven node styling flat data keys (Fix B/E).
324
+ // Overrides the generic defaults above for US nodes loaded from /api/load.
325
325
  {
326
- selector: 'node[style]',
326
+ selector: 'node[shape]',
327
+ style: {
328
+ 'shape': 'data(shape)',
329
+ 'background-color': 'data(bgcolor)',
330
+ 'border-color': 'data(bordercolor)',
331
+ 'border-width': 'data(borderwidth)',
332
+ 'border-style': 'data(borderstyle)',
333
+ 'color': 'data(fontcolor)',
334
+ 'font-size': 'data(fontsize)',
335
+ }
336
+ },
337
+ // Period row swimlanes (Fix C/E)
338
+ {
339
+ selector: 'node[?is_period_row]',
340
+ style: {
341
+ 'shape': 'roundrectangle',
342
+ 'background-color': '#F5F5F5',
343
+ 'background-opacity': 0.3,
344
+ 'border-color': '#9E9E9E',
345
+ 'border-width': 1,
346
+ 'label': 'data(label)',
347
+ 'text-valign': 'top',
348
+ 'text-halign': 'left',
349
+ 'text-margin-x': 10,
350
+ 'text-margin-y': 5,
351
+ 'font-size': 14,
352
+ 'font-weight': 'bold',
353
+ 'padding': 30,
354
+ }
355
+ },
356
+ // Sub-cluster compounds nested inside period rows (Fix D/E)
357
+ {
358
+ selector: 'node[?compound][!is_period_row]',
327
359
  style: {
328
- 'shape': 'data(style.shape)',
329
- 'background-color': 'data(style.backgroundColor)',
330
- 'border-color': 'data(style.borderColor)',
331
- 'border-width': 'data(style.borderWidth)',
332
- 'border-style': 'data(style.lineStyle)',
333
- 'color': 'data(style.fontColor)',
334
- 'font-size': 'data(style.fontSize)',
360
+ 'shape': 'roundrectangle',
361
+ 'background-color': '#FAFAFA',
362
+ 'background-opacity': 0.5,
363
+ 'border-color': '#BDBDBD',
364
+ 'border-width': 1,
365
+ 'border-style': 'dashed',
366
+ 'label': 'data(label)',
367
+ 'text-valign': 'top',
368
+ 'font-size': 11,
369
+ 'padding': 10,
370
+ }
371
+ },
372
+ // Palette-driven edge styling — flat data keys (Fix B/E)
373
+ {
374
+ selector: 'edge[linecolor]',
375
+ style: {
376
+ 'line-color': 'data(linecolor)',
377
+ 'width': 'data(linewidth)',
378
+ 'line-style': 'data(linestyle)',
379
+ 'target-arrow-shape': 'data(arrowtarget)',
380
+ 'source-arrow-shape': 'data(arrowsource)',
381
+ 'target-arrow-color': 'data(linecolor)',
382
+ }
383
+ },
384
+ // Dashed cuts override (Fix E)
385
+ {
386
+ selector: 'edge[is_dashed = "true"]',
387
+ style: {
388
+ 'line-style': 'dashed',
335
389
  }
336
390
  },
391
+ // Symmetric edges — no arrows, double thickness (Fix E)
337
392
  {
338
- selector: 'edge[style]',
393
+ selector: 'edge[canonical = "has_same_time"], edge[canonical = "is_bonded_to"]',
339
394
  style: {
340
- 'line-color': 'data(style.lineColor)',
341
- 'width': 'data(style.lineWidth)',
342
- 'line-style': 'data(style.lineStyle)',
343
- 'target-arrow-shape': 'data(style.targetArrowShape)',
344
- 'source-arrow-shape': 'data(style.sourceArrowShape)',
345
- 'target-arrow-color': 'data(style.lineColor)',
395
+ 'target-arrow-shape': 'none',
396
+ 'source-arrow-shape': 'none',
397
+ 'line-style': 'solid',
398
+ 'width': 3,
346
399
  }
347
400
  }
348
401
  ],
@@ -581,36 +581,57 @@ function renderSwimlaneState(state) {
581
581
  // Clear existing elements
582
582
  cy.elements().remove();
583
583
 
584
- const swimlaneNodes = state.nodes.filter(el => el.data.is_swimlane);
585
- const usNodes = state.nodes.filter(el => !el.data.is_swimlane);
584
+ // Fix G: split nodes into period row compounds, sub-cluster compounds, and US leaves.
585
+ // Period rows (is_period_row=true) come from new pipeline; legacy swimlane nodes
586
+ // (is_swimlane=true) are supported for backward compat.
587
+ const periodRowNodes = state.nodes.filter(el => el.data.is_period_row);
588
+ const clusterNodes = state.nodes.filter(el => el.data.compound && !el.data.is_period_row && !el.data.is_swimlane);
589
+ const legacySwimNodes= state.nodes.filter(el => el.data.is_swimlane);
590
+ const usNodes = state.nodes.filter(el => !el.data.compound && !el.data.is_swimlane);
591
+
592
+ // 1. Period row compound parents first (Fix C/G)
593
+ if (periodRowNodes.length > 0) {
594
+ cy.add(periodRowNodes.map(el => ({
595
+ group: 'nodes',
596
+ data: el.data, // full data object — includes is_period_row, label, etc.
597
+ })));
598
+ }
586
599
 
587
- // Add compound parents first (swimlanes)
588
- if (swimlaneNodes.length > 0) {
589
- cy.add(swimlaneNodes.map(el => ({
600
+ // 2. Legacy swimlane nodes (backward compat)
601
+ if (legacySwimNodes.length > 0) {
602
+ cy.add(legacySwimNodes.map(el => ({
590
603
  group: 'nodes',
591
604
  data: el.data,
592
605
  classes: 'swimlane',
593
606
  })));
594
607
  }
595
608
 
596
- // Add US children with parent pass palette style so cytoscape data(style.*) selectors apply
609
+ // 3. Sub-cluster compounds nested inside period rows (Fix D/G)
610
+ if (clusterNodes.length > 0) {
611
+ cy.add(clusterNodes.map(el => ({
612
+ group: 'nodes',
613
+ data: el.data,
614
+ })));
615
+ }
616
+
617
+ // 4. US leaf nodes — full data object carries flat palette fields (Fix B/G)
597
618
  if (usNodes.length > 0) {
598
619
  cy.add(usNodes.map(el => ({
599
620
  group: 'nodes',
600
- data: { ...el.data, style: el.style || undefined },
621
+ data: el.data,
601
622
  position: el.position || undefined,
602
623
  })));
603
624
  }
604
625
 
605
- // Add edgespass palette style for line-color, line-style, arrow-shape etc.
626
+ // 5. Edgesfull data object carries flat palette fields (Fix B/G)
606
627
  if (state.edges && state.edges.length > 0) {
607
628
  cy.add(state.edges.map(el => ({
608
629
  group: 'edges',
609
- data: { ...el.data, style: el.style || undefined },
630
+ data: el.data,
610
631
  })));
611
632
  }
612
633
 
613
- // Apply swimlane styling on the parent compound nodes
634
+ // Apply legacy swimlane styling for backward compat
614
635
  cy.nodes('.swimlane').forEach(n => {
615
636
  const color = n.data('color') || '#EEEEEE';
616
637
  n.style({
@@ -627,17 +648,20 @@ function renderSwimlaneState(state) {
627
648
  });
628
649
  });
629
650
 
630
- // Run dagre layout inside each swimlane row so US nodes spread out
631
- // horizontally and stratigraphic edges become visible. Without a layout
632
- // pass, all US children of a row get stacked at the row's centroid and
633
- // the edges collapse into invisible zero-length segments.
651
+ // Run dagre layout TB (recent ancient, top-to-bottom) Fix F.
652
+ // rankDir: 'TB' gives the classic Harris convention: most recent strata
653
+ // at the top, oldest at the bottom, with arrows pointing downward.
634
654
  try {
635
655
  cy.layout({
636
656
  name: 'dagre',
637
- rankDir: 'LR',
657
+ rankDir: 'TB',
658
+ ranker: 'longest-path',
638
659
  nodeSep: 50,
660
+ edgeSep: 20,
639
661
  rankSep: 80,
640
- fit: false,
662
+ animate: false,
663
+ fit: true,
664
+ padding: 30,
641
665
  }).run();
642
666
  } catch (e) {
643
667
  console.warn('dagre layout failed, falling back to grid:', e);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyarchinit-mini
3
- Version: 2.9.0
3
+ Version: 2.9.2
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.9.0"
7
+ version = "2.9.2"
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"}
@@ -41,38 +41,51 @@ def client(tmp_path, monkeypatch):
41
41
 
42
42
 
43
43
  def test_api_load_returns_palette_styled_nodes(client):
44
+ """US nodes carry flat palette fields in data (Fix B); no nested style dict."""
44
45
  r = client.get("/harris-creator/api/load/S")
45
46
  assert r.status_code == 200, r.data[:300]
46
47
  body = r.get_json()
47
48
  assert "nodes" in body and "edges" in body
48
- assert len(body["nodes"]) >= 2
49
- node = body["nodes"][0]
50
- assert "style" in node
51
- assert isinstance(node["style"], dict)
52
- assert "shape" in node["style"]
53
- assert "backgroundColor" in node["style"]
49
+ # Period row compound + 2 US nodes = at least 3 total
50
+ us_nodes = [n for n in body["nodes"] if n["data"].get("us")]
51
+ assert len(us_nodes) >= 2
52
+ node = us_nodes[0]
53
+ # Flat palette keys in data (Fix B)
54
+ assert "shape" in node["data"], f"Expected flat 'shape' in data, got keys: {list(node['data'].keys())}"
55
+ assert "bgcolor" in node["data"]
56
+ assert node["data"]["bgcolor"].startswith("#")
57
+ # No nested style dict
58
+ assert "style" not in node, "flat-field contract: no nested 'style' key on node"
54
59
 
55
60
 
56
- def test_api_load_emits_edges_with_style(client):
61
+ def test_api_load_emits_edges_with_flat_fields(client):
62
+ """Edges carry flat palette fields in data (Fix B); direction normalized to forward."""
57
63
  r = client.get("/harris-creator/api/load/S")
58
64
  assert r.status_code == 200
59
65
  body = r.get_json()
60
66
  assert len(body["edges"]) >= 1
61
67
  e = body["edges"][0]
62
- # Edge labels are italianized for the swimlane UI (locale=it); canonical kept in data.canonical
63
- assert e["data"]["label"] in {"Copre", "Coperto da"}
64
- assert e["data"]["canonical"] in {"overlies", "is_after"}
65
- assert "style" in e
66
- assert isinstance(e["style"], dict)
67
- assert "lineColor" in e["style"]
68
+ # After Fix A, only forward canonicals: 'Copre' / 'overlies'
69
+ assert e["data"]["label"] == "Copre", f"Expected 'Copre', got {e['data']['label']!r}"
70
+ assert e["data"]["canonical"] == "overlies", f"Expected 'overlies', got {e['data']['canonical']!r}"
71
+ # Flat palette keys in data (Fix B)
72
+ assert "linecolor" in e["data"], f"Expected flat 'linecolor' in data, got keys: {list(e['data'].keys())}"
73
+ assert "arrowtarget" in e["data"]
74
+ # No nested style dict
75
+ assert "style" not in e, "flat-field contract: no nested 'style' key on edge"
68
76
 
69
77
 
70
78
  def test_api_load_with_group_by_area_yields_compound_parents(client):
79
+ """Period row + sub-cluster compounds present when group_by=area (Fix C/D)."""
71
80
  r = client.get("/harris-creator/api/load/S?group_by=area")
72
81
  assert r.status_code == 200
73
82
  body = r.get_json()
74
- parents = [n for n in body["nodes"] if n["data"].get("compound")]
75
- assert len(parents) >= 1
83
+ # At minimum: 1 period-row compound always present (Fix C)
84
+ period_rows = [n for n in body["nodes"] if n["data"].get("is_period_row")]
85
+ assert len(period_rows) >= 1
86
+ # With group_by=area and US in area 'A', also a sub-cluster compound
87
+ all_compounds = [n for n in body["nodes"] if n["data"].get("compound")]
88
+ assert len(all_compounds) >= 1
76
89
 
77
90
 
78
91
  def test_api_load_unknown_site_returns_empty(client):
@@ -43,9 +43,11 @@ def test_parse_italian_extras_resolve():
43
43
  current_site="S",
44
44
  )
45
45
  cans = [r.canonical for r in items]
46
- assert "is_after" in cans # riempito da
46
+ # "Riempito da" is the inverse of "fills" → is_filled_by (not is_after)
47
+ assert "is_filled_by" in cans # riempito da — corrected from old wrong mapping
47
48
  assert "is_bonded_to" in cans # si lega a
48
- assert "is_before" in cans # gli si appoggia
49
+ # "Gli si appoggia" is the inverse of "abuts" → is_abutted_by (not is_before)
50
+ assert "is_abutted_by" in cans # gli si appoggia — corrected from old wrong mapping
49
51
 
50
52
 
51
53
  def test_parse_unknown_label_yields_none():