pyarchinit-mini 2.8.0__tar.gz → 2.9.1__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 (545) hide show
  1. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/CHANGELOG.md +40 -0
  2. {pyarchinit_mini-2.8.0/pyarchinit_mini.egg-info → pyarchinit_mini-2.9.1}/PKG-INFO +1 -1
  3. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/__init__.py +1 -1
  4. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/graph_to_db.py +1 -16
  5. pyarchinit_mini-2.9.1/pyarchinit_mini/graphproj/graphml_writer.py +143 -0
  6. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/rapporti_codec.py +53 -2
  7. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/s3d_projector.py +61 -5
  8. pyarchinit_mini-2.9.1/pyarchinit_mini/graphproj/s3d_to_cytoscape.py +134 -0
  9. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/translations/vocab_it.json +5 -1
  10. pyarchinit_mini-2.9.1/pyarchinit_mini/web_interface/data/paradata/pompei-regio-vii/stratigraphy.graphml +265 -0
  11. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/harris_creator_routes.py +33 -6
  12. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/harris_creator_editor.js +82 -9
  13. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_creator/editor.html +68 -77
  14. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1/pyarchinit_mini.egg-info}/PKG-INFO +1 -1
  15. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/SOURCES.txt +2 -0
  16. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyproject.toml +1 -1
  17. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_api_export_graphml.py +26 -3
  18. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_api_load_site.py +28 -13
  19. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_rapporti_codec.py +4 -2
  20. pyarchinit_mini-2.9.1/tests/unit/test_rapporti_codec_display.py +33 -0
  21. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_s3d_projector.py +90 -0
  22. pyarchinit_mini-2.9.1/tests/unit/test_s3d_to_cytoscape.py +138 -0
  23. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_i18n.py +8 -3
  24. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/graphml_writer.py +0 -89
  25. pyarchinit_mini-2.8.0/pyarchinit_mini/graphproj/s3d_to_cytoscape.py +0 -103
  26. pyarchinit_mini-2.8.0/tests/unit/test_s3d_to_cytoscape.py +0 -75
  27. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/MANIFEST.in +0 -0
  28. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/README.md +0 -0
  29. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/babel.cfg +0 -0
  30. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/media_viewer_demo.db +0 -0
  31. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_mini 2.db +0 -0
  32. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_mini.db +0 -0
  33. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_mini_sample.db +0 -0
  34. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_tutorial.db +0 -0
  35. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_tutorial_backup_20251030_093228.db +0 -0
  36. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_tutorial_clean.db +0 -0
  37. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_tutorial_video.db +0 -0
  38. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/data/pyarchinit_v18_demo.db +0 -0
  39. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/logo/logo_pyarchinit-mini.png +0 -0
  40. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/ai_matrix/__init__.py +0 -0
  41. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/ai_matrix/apply.py +0 -0
  42. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/ai_matrix/plan.py +0 -0
  43. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/ai_matrix/vision_extractor.py +0 -0
  44. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/__init__.py +0 -0
  45. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/auth.py +0 -0
  46. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/dependencies.py +0 -0
  47. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/graphml.py +0 -0
  48. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/inventario.py +0 -0
  49. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/schemas.py +0 -0
  50. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/site.py +0 -0
  51. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/sync.py +0 -0
  52. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/api/us.py +0 -0
  53. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/__init__.py +0 -0
  54. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/export_import_cli.py +0 -0
  55. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/extended_matrix_import.py +0 -0
  56. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/graphml_cli.py +0 -0
  57. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/harris_import.py +0 -0
  58. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/harris_template.py +0 -0
  59. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/migrate.py +0 -0
  60. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/migrate_vocab.py +0 -0
  61. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/pyarchinit_import_export_cli.py +0 -0
  62. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli/sync_cli.py +0 -0
  63. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli_interface/__init__.py +0 -0
  64. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/cli_interface/cli_app.py +0 -0
  65. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/config/__init__.py +0 -0
  66. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/config/connection_manager.py +0 -0
  67. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/config/em_node_config_manager.py +0 -0
  68. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/config/em_node_types.yaml +0 -0
  69. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/__init__.py +0 -0
  70. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/concurrency_manager.py +0 -0
  71. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/connection.py +0 -0
  72. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/database_creator.py +0 -0
  73. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/manager.py +0 -0
  74. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/__init__.py +0 -0
  75. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/add_file_path.py +0 -0
  76. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/add_i18n_columns.py +0 -0
  77. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/add_tipo_documento.py +0 -0
  78. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text.py +0 -0
  79. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migration_scripts/change_us_area_to_text_simple.py +0 -0
  80. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_backfill.py +0 -0
  81. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/_2026_05_node_uuid_schema.py +0 -0
  82. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/_2026_05_period_table_schema.py +0 -0
  83. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/_2026_05_vocab_alignment.py +0 -0
  84. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/__init__.py +0 -0
  85. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/migrations/backup.py +0 -0
  86. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/postgres_installer.py +0 -0
  87. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/schemas.py +0 -0
  88. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/database/utils.py +0 -0
  89. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/__init__.py +0 -0
  90. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/analytics_dialog.py +0 -0
  91. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/assets/logo.png +0 -0
  92. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/dialogs.py +0 -0
  93. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/excel_import_dialog.py +0 -0
  94. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/export_import_dialog.py +0 -0
  95. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/graphml_export_dialog.py +0 -0
  96. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/gui_app.py +0 -0
  97. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/harris_matrix_editor.py +0 -0
  98. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/i18n.py +0 -0
  99. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/icons.py +0 -0
  100. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/inventario_dialog_extended.py +0 -0
  101. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/main_window.py +0 -0
  102. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/media_manager_advanced.py +0 -0
  103. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/postgres_installer_dialog.py +0 -0
  104. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/pottery_dialog_extended.py +0 -0
  105. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/pottery_panel.py +0 -0
  106. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/pyarchinit_import_export_dialog.py +0 -0
  107. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/thesaurus_dialog.py +0 -0
  108. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/desktop_gui/us_dialog_extended.py +0 -0
  109. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/dto/__init__.py +0 -0
  110. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/dto/inventario_dto.py +0 -0
  111. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/dto/site_dto.py +0 -0
  112. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/dto/us_dto.py +0 -0
  113. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/em_palette/__init__.py +0 -0
  114. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/em_palette/loader.py +0 -0
  115. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/em_palette/styles.py +0 -0
  116. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/exceptions.py +0 -0
  117. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/__init__.py +0 -0
  118. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/converter.py +0 -0
  119. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/dot_parser.py +0 -0
  120. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/em_palette.py +0 -0
  121. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/graphml_builder.py +0 -0
  122. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/graphml_exporter.py +0 -0
  123. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/pure_networkx_exporter.py +0 -0
  124. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/svg_resources.py +0 -0
  125. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/templates/EM_palette.graphml +0 -0
  126. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/x11_colors.py +0 -0
  127. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_converter/yed_template.py +0 -0
  128. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/__init__.py +0 -0
  129. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/reader.py +0 -0
  130. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/writer.py +0 -0
  131. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/yed_importer.py +0 -0
  132. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/yed_keys.py +0 -0
  133. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphml_io/yed_writer.py +0 -0
  134. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/__init__.py +0 -0
  135. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/auto_regen.py +0 -0
  136. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/edge_registry.py +0 -0
  137. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/exceptions.py +0 -0
  138. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/filesystem.py +0 -0
  139. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/graphml_reader.py +0 -0
  140. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/heriverse_parser.py +0 -0
  141. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/ingest_plan.py +0 -0
  142. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/ingestor.py +0 -0
  143. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/paradata_store.py +0 -0
  144. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/graphproj/projector.py +0 -0
  145. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_matrix/__init__.py +0 -0
  146. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_matrix/enhanced_visualizer.py +0 -0
  147. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_matrix/matrix_generator.py +0 -0
  148. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_matrix/matrix_visualizer.py +0 -0
  149. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_matrix/pyarchinit_visualizer.py +0 -0
  150. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/__init__.py +0 -0
  151. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/compound_layout.py +0 -0
  152. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/exceptions.py +0 -0
  153. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/harris_layout.py +0 -0
  154. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/period_sync_service.py +0 -0
  155. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/row_provider.py +0 -0
  156. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/harris_swimlane/swimlane_state.py +0 -0
  157. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/i18n/__init__.py +0 -0
  158. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/i18n/flask_babel_config.py +0 -0
  159. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/i18n/lang_routes.py +0 -0
  160. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/i18n/locale_manager.py +0 -0
  161. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/__init__.py +0 -0
  162. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/__main__.py +0 -0
  163. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/blender_client.py +0 -0
  164. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/config.py +0 -0
  165. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/event_stream.py +0 -0
  166. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/graphml_parser.py +0 -0
  167. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/http_server.py +0 -0
  168. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/period_filter.py +0 -0
  169. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/prompts/__init__.py +0 -0
  170. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/prompts/base_prompt.py +0 -0
  171. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/prompts/period_visualization_prompt.py +0 -0
  172. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/prompts/stratigraphic_model_prompt.py +0 -0
  173. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/prompts/us_description_prompt.py +0 -0
  174. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/proxy_generator.py +0 -0
  175. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/__init__.py +0 -0
  176. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/base_resource.py +0 -0
  177. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/graphml_resource.py +0 -0
  178. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/periods_resource.py +0 -0
  179. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/relationships_resource.py +0 -0
  180. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/sites_resource.py +0 -0
  181. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/resources/us_resource.py +0 -0
  182. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/server.py +0 -0
  183. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/__init__.py +0 -0
  184. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/base_tool.py +0 -0
  185. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/batch_insert_tool.py +0 -0
  186. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/build_3d_tool.py +0 -0
  187. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/chatgpt_fetch_tool.py +0 -0
  188. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/chatgpt_search_tool.py +0 -0
  189. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/configure_em_nodes_tool.py +0 -0
  190. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/create_database_tool.py +0 -0
  191. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/create_harris_matrix_tool.py +0 -0
  192. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/data_import_parser_tool.py +0 -0
  193. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/data_management_tool.py +0 -0
  194. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/database_manager_tool.py +0 -0
  195. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/delete_data_tool.py +0 -0
  196. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/export_harris_matrix_graphml_tool.py +0 -0
  197. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/export_tool.py +0 -0
  198. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/filter_tool.py +0 -0
  199. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/generate_report_tool.py +0 -0
  200. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/get_schema_tool.py +0 -0
  201. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/import_excel_tool.py +0 -0
  202. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/insert_data_tool.py +0 -0
  203. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/manage_services_tool.py +0 -0
  204. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/material_tool.py +0 -0
  205. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/media_management_tool.py +0 -0
  206. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/position_tool.py +0 -0
  207. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/pyarchinit_sync_tool.py +0 -0
  208. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/resolve_conflicts_tool.py +0 -0
  209. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/service_management_tool.py +0 -0
  210. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/thesaurus_management_tool.py +0 -0
  211. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/update_data_tool.py +0 -0
  212. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/upload_file_tool.py +0 -0
  213. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_format_tool.py +0 -0
  214. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/validate_relationship_integrity_tool.py +0 -0
  215. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphic_relationships_tool.py +0 -0
  216. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/mcp_server/tools/validate_stratigraphy_tool.py +0 -0
  217. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/media_manager/__init__.py +0 -0
  218. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/media_manager/media_handler.py +0 -0
  219. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/__init__.py +0 -0
  220. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/ai_chat.py +0 -0
  221. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/app_setting.py +0 -0
  222. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/base.py +0 -0
  223. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/datazione.py +0 -0
  224. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/extended_matrix.py +0 -0
  225. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/harris_matrix.py +0 -0
  226. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/inventario_materiali.py +0 -0
  227. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/media.py +0 -0
  228. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/pottery.py +0 -0
  229. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/site.py +0 -0
  230. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/thesaurus.py +0 -0
  231. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/tma.py +0 -0
  232. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/us.py +0 -0
  233. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/models/user.py +0 -0
  234. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/__init__.py +0 -0
  235. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/pdf_generator.py +0 -0
  236. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/pdf_generator_backup.py +0 -0
  237. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/pyarchinit_finds_template.py +0 -0
  238. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/pyarchinit_inventory_template.py +0 -0
  239. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/pdf_export/usm_implementation.py +0 -0
  240. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/s3d_integration/__init__.py +0 -0
  241. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/s3d_integration/model_manager.py +0 -0
  242. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/s3d_integration/s3d_converter.py +0 -0
  243. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/__init__.py +0 -0
  244. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/auto_translate.py +0 -0
  245. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/configure_claude_desktop.py +0 -0
  246. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/create_admin_user.py +0 -0
  247. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/create_correct_stratigraphy_sample.py +0 -0
  248. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/create_italian_sample_database.py +0 -0
  249. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/create_sample_for_webapp.py +0 -0
  250. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/create_sample_with_50_us.py +0 -0
  251. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/generate_test_3d_model.py +0 -0
  252. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/load_italian_as_main.py +0 -0
  253. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/load_sample_as_main.py +0 -0
  254. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/migrate_relationships.py +0 -0
  255. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/populate_sample_data.py +0 -0
  256. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/populate_simple_data.py +0 -0
  257. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/setup_auth.py +0 -0
  258. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/setup_user_env.py +0 -0
  259. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/test_cascade_delete.py +0 -0
  260. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/test_relationship_fix.py +0 -0
  261. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/update_sample_relationships.py +0 -0
  262. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/update_urls_and_versions.py +0 -0
  263. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/scripts/verify_docs.py +0 -0
  264. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/__init__.py +0 -0
  265. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/ai_assistant_service.py +0 -0
  266. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/ai_chat_service.py +0 -0
  267. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/analytics_service.py +0 -0
  268. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/app_setting_service.py +0 -0
  269. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/backup_service.py +0 -0
  270. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/command_parser.py +0 -0
  271. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/datazione_service.py +0 -0
  272. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/export_import_service.py +0 -0
  273. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/extended_matrix_excel_parser.py +0 -0
  274. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/import_export_service.py +0 -0
  275. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/inventario_service.py +0 -0
  276. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/mcp_executor.py +0 -0
  277. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/media_service.py +0 -0
  278. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/periodizzazione_service.py +0 -0
  279. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/pottery_dto.py +0 -0
  280. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/pottery_pdf_service.py +0 -0
  281. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/pottery_service.py +0 -0
  282. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/relationship_sync_service.py +0 -0
  283. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/search_service.py +0 -0
  284. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/site_service.py +0 -0
  285. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/thesaurus_service.py +0 -0
  286. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/tma_service.py +0 -0
  287. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/us_service.py +0 -0
  288. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/services/user_service.py +0 -0
  289. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/__init__.py +0 -0
  290. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/bundle_creator.py +0 -0
  291. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/bundle_manifest.py +0 -0
  292. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/bundle_validator.py +0 -0
  293. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/connectivity_monitor.py +0 -0
  294. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/sync_orchestrator.py +0 -0
  295. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/sync_queue.py +0 -0
  296. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/sync_state_machine.py +0 -0
  297. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/stratigraph/uuid_manager.py +0 -0
  298. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.mo +0 -0
  299. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/translations/en/LC_MESSAGES/messages.po +0 -0
  300. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.mo +0 -0
  301. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/translations/it/LC_MESSAGES/messages.po +0 -0
  302. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/translations/messages.pot +0 -0
  303. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/__init__.py +0 -0
  304. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/auth.py +0 -0
  305. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/exceptions.py +0 -0
  306. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/relationship_validator.py +0 -0
  307. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/stratigraphic_validator.py +0 -0
  308. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/tma_label_generator.py +0 -0
  309. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/utils/validators.py +0 -0
  310. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/__init__.py +0 -0
  311. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/exceptions.py +0 -0
  312. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/i18n.py +0 -0
  313. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/loader.py +0 -0
  314. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/provider.py +0 -0
  315. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/translations/vocab_en.json +0 -0
  316. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/vocab/types.py +0 -0
  317. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/app.py +0 -0
  318. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/auth_routes.py +0 -0
  319. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/data/paradata/domus-pompeiana/stratigraphy.graphml +0 -0
  320. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/data/paradata/metro-c-amba-aradam/stratigraphy.graphml +0 -0
  321. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/em_node_config_routes.py +0 -0
  322. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/excel_import_routes.py +0 -0
  323. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/graph_routes.py +0 -0
  324. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/matrix_import_routes.py +0 -0
  325. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/matrix_tools_routes.py +0 -0
  326. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/paradata_routes.py +0 -0
  327. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/paradata_ui_routes.py +0 -0
  328. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/pottery_routes.py +0 -0
  329. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/pyarchinit_import_export_routes.py +0 -0
  330. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/s3d_routes.py +0 -0
  331. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/socketio_events.py +0 -0
  332. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/css/style.css +0 -0
  333. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/images/favicon.ico +0 -0
  334. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/images/logo.png +0 -0
  335. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/images/no-image.png +0 -0
  336. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/images/pyarchinit-mini-logo.png +0 -0
  337. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/OrbitControls.js +0 -0
  338. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/stratigraphic_layout.js +0 -0
  339. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/three-d-viewer.js +0 -0
  340. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/three.min.js +0 -0
  341. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/js/universal_search.js +0 -0
  342. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.bin +0 -0
  343. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.gltf +0 -0
  344. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.mtl +0 -0
  345. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/static/uploads/3d_models/Sito Archeologico di Esempio/site/stratigraphy_test.obj +0 -0
  346. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/3d_builder/index.html +0 -0
  347. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/3d_viewer/viewer.html +0 -0
  348. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/backups.html +0 -0
  349. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/database.html +0 -0
  350. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/database_connect.html +0 -0
  351. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/database_info.html +0 -0
  352. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/database_upload.html +0 -0
  353. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/admin/settings_ai.html +0 -0
  354. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/ai/assistant.html +0 -0
  355. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/analytics/dashboard.html +0 -0
  356. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/auth/login.html +0 -0
  357. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/auth/users.html +0 -0
  358. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/base.html +0 -0
  359. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/blender_viewer.html +0 -0
  360. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/components/language_switcher.html +0 -0
  361. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/dashboard.html +0 -0
  362. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/datazioni/list.html +0 -0
  363. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/docs/index.html +0 -0
  364. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/em_node_config/index.html +0 -0
  365. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/excel_import/index.html +0 -0
  366. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/export/export_import.html +0 -0
  367. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/graph_import_preview.html +0 -0
  368. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/graph_import_result.html +0 -0
  369. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_creator/index.html +0 -0
  370. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/graphml_export.html +0 -0
  371. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/large_graph_message.html +0 -0
  372. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/stratigraph_viewer.html +0 -0
  373. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view.html +0 -0
  374. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/view_graphviz.html +0 -0
  375. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/harris_matrix/viewer_3d_integrated.html +0 -0
  376. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/inventario/form.html +0 -0
  377. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/inventario/list.html +0 -0
  378. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/matrix_import/preview.html +0 -0
  379. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/matrix_import/rejected.html +0 -0
  380. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/matrix_import/upload.html +0 -0
  381. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/matrix_tools/index.html +0 -0
  382. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/media/list.html +0 -0
  383. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/media/upload.html +0 -0
  384. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/messaging/contacts.html +0 -0
  385. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/operators/directory.html +0 -0
  386. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/paradata/edit.html +0 -0
  387. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/paradata/index.html +0 -0
  388. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/paradata/list.html +0 -0
  389. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pdf/pottery_sheet.html +0 -0
  390. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/periodizzazione/form.html +0 -0
  391. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/periodizzazione/list.html +0 -0
  392. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/periodizzazione/periods.html +0 -0
  393. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pottery/detail.html +0 -0
  394. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pottery/form.html +0 -0
  395. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pottery/import_form.html +0 -0
  396. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pottery/list.html +0 -0
  397. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/pyarchinit_import_export/index.html +0 -0
  398. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/search/results.html +0 -0
  399. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/sites/detail.html +0 -0
  400. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/sites/form.html +0 -0
  401. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/sites/list.html +0 -0
  402. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/sites/map.html +0 -0
  403. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/stats/targeted.html +0 -0
  404. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/thesaurus/list.html +0 -0
  405. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/tma/form.html +0 -0
  406. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/tma/list.html +0 -0
  407. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/us/form.html +0 -0
  408. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/us/list.html +0 -0
  409. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/validation/report.html +0 -0
  410. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/yed_import/index.html +0 -0
  411. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/yed_import/preview.html +0 -0
  412. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/templates/yed_import/result.html +0 -0
  413. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/test_prova_extended_matrix.graphml +0 -0
  414. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/three_d_builder_routes.py +0 -0
  415. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.graphml +0 -0
  416. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  417. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/vocab_routes.py +0 -0
  418. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_heriverse.json +0 -0
  419. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.graphml +0 -0
  420. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Scavo archeologico_stratigraphy.json +0 -0
  421. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/web_interface/static/uploads/graphml/Sito Archeologico di Esempio_stratigraphy.json +0 -0
  422. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini/web_interface/yed_import_routes.py +0 -0
  423. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/dependency_links.txt +0 -0
  424. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/entry_points.txt +0 -0
  425. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/not-zip-safe +0 -0
  426. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/requires.txt +0 -0
  427. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/pyarchinit_mini.egg-info/top_level.txt +0 -0
  428. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/requirements.txt +0 -0
  429. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/setup.cfg +0 -0
  430. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/setup.py +0 -0
  431. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/__init__.py +0 -0
  432. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/conftest.py +0 -0
  433. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/e2e/__init__.py +0 -0
  434. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/e2e/test_web_vocab_full_flow.py +0 -0
  435. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/fixtures/_generate_baseline_graphml.py +0 -0
  436. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/fixtures/_generate_harris_swimlane_synthetic.py +0 -0
  437. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/fixtures/_generate_synthetic_db.py +0 -0
  438. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/fixtures/_generate_yed_test_files.py +0 -0
  439. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/fixtures/build_legacy_with_pottery.py +0 -0
  440. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/__init__.py +0 -0
  441. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_adarte_regression.py +0 -0
  442. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_admin_ai_settings_routes.py +0 -0
  443. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_admin_backup_routes.py +0 -0
  444. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_api_export_heriverse.py +0 -0
  445. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_api_import_graphml.py +0 -0
  446. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_api_import_json.py +0 -0
  447. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_auto_regen_on_save.py +0 -0
  448. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_feature_flag_pipelines.py +0 -0
  449. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_full_sync_flow.py +0 -0
  450. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_graph_import_flow.py +0 -0
  451. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_graph_routes.py +0 -0
  452. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_matrix_post_cutover.py +0 -0
  453. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_matrix_visual_parity.py +0 -0
  454. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_swimlane_routes_create_row.py +0 -0
  455. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_swimlane_routes_load.py +0 -0
  456. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_swimlane_routes_save.py +0 -0
  457. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_harris_swimlane_routes_session_missing.py +0 -0
  458. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_lang_routes.py +0 -0
  459. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_matrix_import_apply_route.py +0 -0
  460. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_matrix_import_rejected_route.py +0 -0
  461. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_matrix_import_site_widget.py +0 -0
  462. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_matrix_import_upload_route.py +0 -0
  463. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_migrate_vocab_cli.py +0 -0
  464. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_paradata_routes_authors.py +0 -0
  465. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_paradata_routes_other_types.py +0 -0
  466. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_paradata_ui.py +0 -0
  467. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_completion.py +0 -0
  468. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_excel_roundtrip.py +0 -0
  469. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_filters_id_number_anno.py +0 -0
  470. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_legacy_upgrade.py +0 -0
  471. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_list_media_thumbs.py +0 -0
  472. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_pottery_routes.py +0 -0
  473. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_roundtrip.py +0 -0
  474. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_roundtrip_extmatrix.py +0 -0
  475. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_spec2_coverage_gaps.py +0 -0
  476. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_swimlane_group_by.py +0 -0
  477. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_vocab_routes.py +0 -0
  478. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_yed_export_route.py +0 -0
  479. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_yed_import_routes.py +0 -0
  480. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/integration/test_yed_writer_parity.py +0 -0
  481. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/__init__.py +0 -0
  482. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_ai_matrix_apply.py +0 -0
  483. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_ai_matrix_extractor_parse.py +0 -0
  484. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_ai_matrix_extractor_providers.py +0 -0
  485. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_ai_matrix_plan_serialization.py +0 -0
  486. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_app_setting_model.py +0 -0
  487. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_app_setting_service.py +0 -0
  488. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_auto_regen.py +0 -0
  489. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_backup_service.py +0 -0
  490. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_bundle.py +0 -0
  491. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_concurrency_columns.py +0 -0
  492. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_concurrency_manager.py +0 -0
  493. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_connectivity_monitor.py +0 -0
  494. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_database_utils.py +0 -0
  495. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_deprecated_writers_shim.py +0 -0
  496. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_em_palette_vocab_backed.py +0 -0
  497. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graph_to_db.py +0 -0
  498. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphml_io_reader.py +0 -0
  499. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphml_io_writer.py +0 -0
  500. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_edge_registry.py +0 -0
  501. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_exceptions.py +0 -0
  502. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_filesystem.py +0 -0
  503. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_ingestor_apply.py +0 -0
  504. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_ingestor_preview.py +0 -0
  505. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_graphproj_projector.py +0 -0
  506. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_layout.py +0 -0
  507. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_compound_layout.py +0 -0
  508. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_exceptions.py +0 -0
  509. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_period_sync.py +0 -0
  510. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_row_provider.py +0 -0
  511. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_state_load.py +0 -0
  512. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_harris_swimlane_state_save.py +0 -0
  513. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_heriverse_parser.py +0 -0
  514. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_ingest_plan.py +0 -0
  515. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_inventario_schema.py +0 -0
  516. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_migrations_backup.py +0 -0
  517. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_migrations_idempotent.py +0 -0
  518. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_optimistic_locking.py +0 -0
  519. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_palette_loader.py +0 -0
  520. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_palette_styles.py +0 -0
  521. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_paradata_store_authors.py +0 -0
  522. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_paradata_store_basic.py +0 -0
  523. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_paradata_store_other_types.py +0 -0
  524. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_pottery_dto.py +0 -0
  525. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_pottery_model.py +0 -0
  526. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_pottery_service.py +0 -0
  527. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_s3d_converter_vocab_backed.py +0 -0
  528. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_site_service.py +0 -0
  529. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_sync_api.py +0 -0
  530. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_sync_cli.py +0 -0
  531. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_sync_orchestrator.py +0 -0
  532. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_sync_queue.py +0 -0
  533. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_sync_state_machine.py +0 -0
  534. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_us_dto_unita_tipo_validator.py +0 -0
  535. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_us_schema.py +0 -0
  536. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_uuid_manager.py +0 -0
  537. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_bootstrap_failures.py +0 -0
  538. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_exceptions.py +0 -0
  539. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_loader.py +0 -0
  540. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_provider.py +0 -0
  541. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_vocab_types.py +0 -0
  542. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_yed_importer_parse.py +0 -0
  543. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_yed_importer_plan.py +0 -0
  544. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_yed_writer.py +0 -0
  545. {pyarchinit_mini-2.8.0 → pyarchinit_mini-2.9.1}/tests/unit/test_yed_writer_extended_matrix.py +0 -0
@@ -1,3 +1,43 @@
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
+
23
+ ## 2.9.0 — 2026-05-19
24
+
25
+ ### Fixed — Swimlane UI/UX cleanup (post-2.8.0 feedback)
26
+ - **Toolbar consolidated**: removed duplicate `swimlane-toolbar` block. Single `Esporta` dropdown now contains yEd GraphML (.graphml), Heriverse/ATON JSON (.json), Graphviz DOT, PNG. `Importa` button accepts both .graphml and .json. The existing `group-by-selector` now uses the new vocabulary: Nessun raggruppamento / Area / Settore / Quadrato / Attività / Strutture (was: Period+Phase / Struttura / Attivita / Settore / Area / Ambient / Saggio / Quad-Par / No grouping).
27
+ - **Edge labels italianized**: swimlane web + GraphML export now show `Copre`/`Coperto da`/`Taglia`/`Tagliato da`/`Riempie`/`Riempito da`/`Si appoggia a`/`Gli si appoggia`/`Uguale a`/`Si lega a`/`Anteriore a` (locale `it`) or `Covers`/`Covered by`/etc (locale `en`) instead of canonical `overlies`/`is_after`/`cuts`/etc. Canonical kept in `data.canonical` for JS class hooks.
28
+ - **Inverse-edge dedup**: when both `A overlies B` and `B is_after A` exist (data redundancy), draw only the forward direction — no more overlapping labels at the same midpoint.
29
+ - **Transitive reduction**: if A→B→C exists, A→C is no longer drawn (per-canonical, only for DAGs). Applied via `networkx.transitive_reduction`. Adarte fixture: 516 → 343 edges (clean Harris Matrix layout).
30
+ - **Palette-driven frontend rendering**: cytoscape selectors `node[style]` and `edge[style]` now read `data.style.{shape,backgroundColor,borderColor,borderWidth,lineColor,…}` from the `/api/load` payload and apply them. US nodes finally appear with their palette colors/shapes (USM red border, USV octagonal, …) instead of default gray.
31
+ - **GraphML export rewritten**: now produces the proper Harris Matrix Creator format via `pyarchinit_mini.graphml_io.yed_writer.write_extended_matrix_graphml` — TableNode wrapper with `<y:Rows>` per period/fase (colored backgrounds, rotated labels like "Periodo 1 - Fase 1"), nodes positioned inside their period row, palette styles, italianized edge labels. Previously the writer just appended nodes to the palette template without TableNode rows.
32
+
33
+ ### Internals
34
+ - New `rapporti_codec.CANONICAL_TO_ITALIAN`/`CANONICAL_TO_ENGLISH`/`display_label(canonical, locale)` (moved from `graph_to_db.py`).
35
+ - `s3d_projector._load_edges` post-process: inverse dedup + per-canonical `nx.transitive_reduction` (skipped for SYMMETRIC and cyclic graphs).
36
+ - `s3d_to_cytoscape` edges now carry `data.label` (italian display) AND `data.canonical` (English canonical for JS hooks).
37
+ - `graphml_writer.write_graphml` now bridges to the existing `yed_writer.write_extended_matrix_graphml` via a temp file.
38
+ - `harris_creator_editor.js`: 2 new cytoscape selectors (`node[style]`, `edge[style]`) read palette properties from element data.
39
+ - `editor.html`: removed `swimlane-toolbar` div + duplicate `group-by-select` + standalone `export-graphml-btn`/`export-dot-btn`/`export-png-btn` + `exportYedGraphml()` button; replaced with one unified `Esporta` dropdown + `Importa` button.
40
+
1
41
  ## 2.8.0 — 2026-05-19
2
42
 
3
43
  ### Added — EM Palette + Multi-Format Swimlane Round-Trip
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyarchinit-mini
3
- Version: 2.8.0
3
+ Version: 2.9.1
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.8.0"
26
+ __version__ = "2.9.1"
27
27
  __author__ = "PyArchInit Team"
28
28
  __email__ = "enzo.ccc@gmail.com"
29
29
 
@@ -15,6 +15,7 @@ from pyarchinit_mini.graphproj.rapporti_codec import (
15
15
  INVERSE_PAIRS,
16
16
  SYMMETRIC,
17
17
  Rapporto,
18
+ CANONICAL_TO_ITALIAN,
18
19
  )
19
20
  from pyarchinit_mini.graphproj.s3d_projector import ProjectedGraph, Node
20
21
 
@@ -22,22 +23,6 @@ from pyarchinit_mini.graphproj.s3d_projector import ProjectedGraph, Node
22
23
  logger = logging.getLogger(__name__)
23
24
 
24
25
 
25
- # Canonical → italian display label (used when serializing).
26
- CANONICAL_TO_ITALIAN: Dict[str, str] = {
27
- "overlies": "Copre",
28
- "is_after": "Coperto da",
29
- "cuts": "Taglia",
30
- "is_cut_by": "Tagliato da",
31
- "fills": "Riempie",
32
- "is_filled_by": "Riempito da",
33
- "abuts": "Si appoggia a",
34
- "is_abutted_by": "Gli si appoggia",
35
- "has_same_time": "Uguale a",
36
- "is_bonded_to": "Si lega a",
37
- "is_before": "Anteriore a",
38
- }
39
-
40
-
41
26
  @dataclass
42
27
  class WriteResult:
43
28
  imported_us: int = 0
@@ -0,0 +1,143 @@
1
+ """yEd-flavoured GraphML writer producing the EM Harris Matrix Creator format.
2
+
3
+ Strategy (Approach A): thin bridge from ProjectedGraph to the canonical
4
+ graphml_io.yed_writer.write_extended_matrix_graphml which already produces the
5
+ proper TableNode / swimlane format consumed by yEd Desktop.
6
+
7
+ Output:
8
+ - Standalone GraphML (no palette template merging)
9
+ - ONE group node with <y:TableNode YED_TABLE_NODE> containing one <y:Row>
10
+ per period row from the ProjectedGraph
11
+ - US nodes positioned inside their row's y-range
12
+ - Edges with italianized labels (Copre, Taglia, …) via rapporti_codec
13
+ """
14
+ from __future__ import annotations
15
+
16
+ import tempfile
17
+ import os
18
+ from pathlib import Path
19
+ from typing import Optional
20
+
21
+ from pyarchinit_mini.graphproj.s3d_projector import ProjectedGraph
22
+ from pyarchinit_mini.graphproj.rapporti_codec import display_label, CANONICAL_TO_ITALIAN
23
+
24
+
25
+ def write_graphml(graph: ProjectedGraph, *, palette_path: Optional[Path] = None) -> bytes:
26
+ """Render the projected graph as yEd-compatible GraphML bytes.
27
+
28
+ palette_path is accepted for backward-compatible call-sites but is ignored —
29
+ the new output is a standalone TableNode document, not a palette extension.
30
+ """
31
+ from pyarchinit_mini.harris_swimlane.swimlane_state import CytoscapeElement
32
+ from pyarchinit_mini.harris_swimlane.row_provider import Row as LegacyRow, PERIOD_COLORS
33
+
34
+ # ------------------------------------------------------------------
35
+ # 1. Convert ProjectedGraph.rows → legacy Row objects
36
+ # ------------------------------------------------------------------
37
+ rows: list[LegacyRow] = []
38
+ for i, r in enumerate(graph.rows):
39
+ rows.append(LegacyRow(
40
+ row_id=r.row_id,
41
+ period_name=r.periodo or r.label,
42
+ phase_name=r.fase,
43
+ start_date=None,
44
+ end_date=None,
45
+ color=PERIOD_COLORS[i % len(PERIOD_COLORS)],
46
+ source="period_table" if not r.is_fallback else "fallback",
47
+ ))
48
+
49
+ # ------------------------------------------------------------------
50
+ # 2. Convert ProjectedGraph.nodes → CytoscapeElement list
51
+ # ------------------------------------------------------------------
52
+ # Build a lookup: row_id → index so we can calculate y positions
53
+ row_index = {r.row_id: i for i, r in enumerate(graph.rows)}
54
+ row_height = 200
55
+ node_h, node_w = 30.0, 80.0
56
+ # Track column (x) per row so nodes in the same row are spread horizontally
57
+ col_counter: dict[str, int] = {}
58
+
59
+ nodes: list[CytoscapeElement] = []
60
+ for n in graph.nodes:
61
+ ri = row_index.get(n.row_id, 0)
62
+ col = col_counter.get(n.row_id, 0)
63
+ col_counter[n.row_id] = col + 1
64
+ x = col * (node_w + 20) + 30
65
+ y = ri * row_height + (row_height / 2 - node_h / 2)
66
+
67
+ nodes.append(CytoscapeElement(
68
+ data={
69
+ "id": n.node_id,
70
+ "us": n.us,
71
+ "us_number": n.us,
72
+ "area": n.area or "",
73
+ "unit_type": n.unit_type or "US",
74
+ "description": n.description or "",
75
+ "row": n.row_id,
76
+ "label": str(n.us),
77
+ },
78
+ position={"x": x, "y": y},
79
+ ))
80
+
81
+ # ------------------------------------------------------------------
82
+ # 3. Convert ProjectedGraph.edges → CytoscapeElement list with italian labels
83
+ # ------------------------------------------------------------------
84
+ edges: list[CytoscapeElement] = []
85
+ for e in graph.edges:
86
+ italian = display_label(e.canonical, locale="it")
87
+ edges.append(CytoscapeElement(
88
+ data={
89
+ "id": f"{e.source_id}__{e.canonical}__{e.target_id}",
90
+ "source": e.source_id,
91
+ "target": e.target_id,
92
+ "label": italian,
93
+ "canonical": e.canonical,
94
+ "relationship": CANONICAL_TO_ITALIAN.get(e.canonical, e.canonical),
95
+ },
96
+ ))
97
+
98
+ # ------------------------------------------------------------------
99
+ # 4. Build a minimal state-like object the legacy writer accepts
100
+ # ------------------------------------------------------------------
101
+ class _State:
102
+ def __init__(self):
103
+ self.site = graph.site
104
+ self.group_by = graph.group_by
105
+ self.rows = rows
106
+ self.nodes = nodes
107
+ self.edges = edges
108
+ self.pending_changes = {}
109
+
110
+ state = _State()
111
+
112
+ # ------------------------------------------------------------------
113
+ # 5. Call the canonical writer and return bytes
114
+ # ------------------------------------------------------------------
115
+ from pyarchinit_mini.graphml_io.yed_writer import write_extended_matrix_graphml
116
+
117
+ epochs: list[dict] = []
118
+ # Populate epochs from rows that have dating information
119
+ for r in graph.rows:
120
+ if r.datazione:
121
+ epochs.append({
122
+ "row_id": r.row_id,
123
+ "periodo": r.periodo,
124
+ "fase": r.fase,
125
+ "datazione": r.datazione,
126
+ })
127
+
128
+ with tempfile.NamedTemporaryFile(suffix=".graphml", delete=False) as tmp:
129
+ tmp_path = tmp.name
130
+ try:
131
+ write_extended_matrix_graphml(
132
+ state,
133
+ site_meta={"sito": graph.site},
134
+ epochs=epochs,
135
+ out=Path(tmp_path),
136
+ )
137
+ with open(tmp_path, "rb") as f:
138
+ return f.read()
139
+ finally:
140
+ try:
141
+ os.unlink(tmp_path)
142
+ except OSError:
143
+ pass
@@ -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,16 +45,58 @@ 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
 
62
+ # Canonical → italian display label (for swimlane web + GraphML edge labels).
63
+ CANONICAL_TO_ITALIAN: Dict[str, str] = {
64
+ "overlies": "Copre",
65
+ "is_after": "Coperto da",
66
+ "cuts": "Taglia",
67
+ "is_cut_by": "Tagliato da",
68
+ "fills": "Riempie",
69
+ "is_filled_by": "Riempito da",
70
+ "abuts": "Si appoggia a",
71
+ "is_abutted_by": "Gli si appoggia",
72
+ "has_same_time": "Uguale a",
73
+ "is_bonded_to": "Si lega a",
74
+ "is_before": "Anteriore a",
75
+ }
76
+
77
+ # Canonical → english display label.
78
+ CANONICAL_TO_ENGLISH: Dict[str, str] = {
79
+ "overlies": "Covers",
80
+ "is_after": "Covered by",
81
+ "cuts": "Cuts",
82
+ "is_cut_by": "Cut by",
83
+ "fills": "Fills",
84
+ "is_filled_by": "Filled by",
85
+ "abuts": "Leans on",
86
+ "is_abutted_by": "Leant on by",
87
+ "has_same_time": "Same as",
88
+ "is_bonded_to": "Bonded to",
89
+ "is_before": "Before",
90
+ }
91
+
92
+
93
+ def display_label(canonical: str, locale: str = "it") -> str:
94
+ """Return the localized display label for a canonical relation name."""
95
+ if locale.lower().startswith("en"):
96
+ return CANONICAL_TO_ENGLISH.get(canonical, canonical)
97
+ return CANONICAL_TO_ITALIAN.get(canonical, canonical)
98
+
99
+
49
100
  # English fallbacks (Al-Khutm-style data).
50
101
  _EN_TO_CANONICAL: Dict[str, str] = {
51
102
  "covers": "overlies",
@@ -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
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,14 +217,70 @@ 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))
240
+
241
+ # === Step A: Inverse dedup — drop the redundant inverse direction ===
242
+ # E.g., if (overlies, A→B) exists, drop (is_after, B→A).
243
+ forward_keys: set = set()
244
+ for e in graph.edges:
245
+ if e.canonical in SYMMETRIC:
246
+ continue
247
+ forward_keys.add((e.canonical, e.source_id, e.target_id))
248
+ kept: List[Edge] = []
249
+ for e in graph.edges:
250
+ if e.canonical in SYMMETRIC:
251
+ kept.append(e)
252
+ continue
253
+ inv = INVERSE_PAIRS.get(e.canonical)
254
+ # If the forward counterpart of this inverse is already in the set, drop it
255
+ if inv is not None and (inv, e.target_id, e.source_id) in forward_keys:
256
+ if e.canonical > inv:
257
+ continue # drop; the lexicographically-first orientation wins
258
+ kept.append(e)
259
+ graph.edges = kept
260
+
261
+ # === Step B: Transitive reduction per canonical type ===
262
+ # If A→B and B→C exist under the same canonical, drop A→C.
263
+ try:
264
+ import networkx as nx
265
+ reduced: List[Edge] = []
266
+ by_canon: Dict[str, List[Edge]] = {}
267
+ for e in graph.edges:
268
+ by_canon.setdefault(e.canonical, []).append(e)
269
+ for canon, edges in by_canon.items():
270
+ if canon in SYMMETRIC:
271
+ reduced.extend(edges)
272
+ continue
273
+ dg = nx.DiGraph()
274
+ for ed in edges:
275
+ dg.add_edge(ed.source_id, ed.target_id)
276
+ try:
277
+ tr = nx.transitive_reduction(dg)
278
+ keep_set = set(tr.edges())
279
+ for ed in edges:
280
+ if (ed.source_id, ed.target_id) in keep_set:
281
+ reduced.append(ed)
282
+ except nx.NetworkXError:
283
+ reduced.extend(edges)
284
+ graph.edges = reduced
285
+ except ImportError:
286
+ pass # networkx not available; skip reduction
@@ -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
  }