s3dgraphy 1.6.0.dev36__tar.gz → 1.6.0.dev38__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 (521) hide show
  1. {s3dgraphy-1.6.0.dev36/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev38}/PKG-INFO +1 -1
  2. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/pyproject.toml +1 -1
  3. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/datamodel_translations.json +21 -0
  4. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_qualia_types.json +26 -3
  5. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/__init__.py +1 -1
  6. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/api.py +35 -0
  7. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/rdf_exporter.py +36 -0
  8. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/import_graphml.py +9 -0
  9. s3dgraphy-1.6.0.dev38/src/s3dgraphy/labels.py +253 -0
  10. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/merge/graph_merger.py +24 -12
  11. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
  12. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy.egg-info/SOURCES.txt +2 -0
  13. s3dgraphy-1.6.0.dev38/tests/test_alternative_labels.py +138 -0
  14. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_importer_edge_hygiene.py +14 -0
  15. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_qualia_dai_d7_d8.py +3 -3
  16. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_release.py +60 -5
  17. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/LICENSE +0 -0
  18. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/MANIFEST.in +0 -0
  19. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/README.md +0 -0
  20. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/setup.cfg +0 -0
  21. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  22. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  23. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  24. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  25. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  26. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  27. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  28. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  29. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  30. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_state_symbols.json +0 -0
  31. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
  32. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  33. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  34. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
  35. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  36. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  37. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  38. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  39. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
  40. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  41. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  42. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  43. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  44. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  45. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  46. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  47. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  48. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  49. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  50. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  51. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  52. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  53. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  54. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  55. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  56. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  57. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  58. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  59. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  60. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  61. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  62. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  63. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  64. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  65. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  66. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  67. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  68. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  69. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  70. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  71. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  72. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  73. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  74. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  75. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  76. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  77. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  78. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  79. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  80. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  81. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  82. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  83. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  84. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  85. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  86. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  87. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  88. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  89. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  90. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  91. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  92. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  93. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  94. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  95. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  96. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  97. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  98. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  99. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  100. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  101. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  102. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  103. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  104. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  105. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  106. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  107. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  108. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  109. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  110. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  111. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  112. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  113. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  114. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  115. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  116. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  117. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  118. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  119. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  120. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  121. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  122. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  123. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  124. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  125. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  126. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  127. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  128. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  129. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  130. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  131. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  132. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  133. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  134. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  135. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  136. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  137. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  138. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  139. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  140. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  141. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  142. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  143. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  144. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  145. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/acquisition/__init__.py +0 -0
  146. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/acquisition/acquire.py +0 -0
  147. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  148. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/acquisition/mapping.py +0 -0
  149. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/ai_validation.py +0 -0
  150. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/annotation/__init__.py +0 -0
  151. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  152. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/annotation/paradata.py +0 -0
  153. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/annotation/reading.py +0 -0
  154. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/__init__.py +0 -0
  155. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/resolver.py +0 -0
  156. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  157. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  158. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  159. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  160. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  161. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  162. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/classification.py +0 -0
  163. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/container.py +0 -0
  164. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/contract/__init__.py +0 -0
  165. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/contract/connector.py +0 -0
  166. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/contract/consumer.py +0 -0
  167. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/contract/core.py +0 -0
  168. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/contract/reference.py +0 -0
  169. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/crdt.py +0 -0
  170. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  171. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/datamodel.py +0 -0
  172. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/diagnostics.py +0 -0
  173. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dissemination.py +0 -0
  174. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/__init__.py +0 -0
  175. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/capture.py +0 -0
  176. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/corpus.py +0 -0
  177. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/devices.py +0 -0
  178. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/ingest.py +0 -0
  179. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  180. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/dtc/residency.py +0 -0
  181. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/edges/__init__.py +0 -0
  182. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  183. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/edges/connections_loader.py +0 -0
  184. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/edges/edge.py +0 -0
  185. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/editorial.py +0 -0
  186. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/__init__.py +0 -0
  187. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  188. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  189. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  190. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  191. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  192. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  193. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  194. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  195. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  196. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  197. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  198. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  199. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  200. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  201. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  202. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  203. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  204. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  205. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  206. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  207. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  208. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  209. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/__init__.py +0 -0
  210. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/aton.py +0 -0
  211. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/gltf.py +0 -0
  212. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/migrate.py +0 -0
  213. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/proxy.py +0 -0
  214. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  215. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/store_backed.py +0 -0
  216. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/geometry/wkt.py +0 -0
  217. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/graph.py +0 -0
  218. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/iiif.py +0 -0
  219. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/__init__.py +0 -0
  220. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/base_importer.py +0 -0
  221. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/csv_importer.py +0 -0
  222. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  223. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  224. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  225. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/metashape_project.py +0 -0
  226. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  227. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  228. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  229. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/sheet_header.py +0 -0
  230. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/source_text.py +0 -0
  231. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  232. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  233. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/importer/xml_importer.py +0 -0
  234. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/indices.py +0 -0
  235. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/language.py +0 -0
  236. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/__init__.py +0 -0
  237. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/authoring.py +0 -0
  238. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  239. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  240. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  241. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  242. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  243. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/registry.py +0 -0
  244. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +0 -0
  245. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  246. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  247. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  248. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/merge/__init__.py +0 -0
  249. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/multigraph/__init__.py +0 -0
  250. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  251. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/__init__.py +0 -0
  252. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/bake.py +0 -0
  253. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/generation.py +0 -0
  254. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/query.py +0 -0
  255. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/registry.py +0 -0
  256. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/narrative/site_story.py +0 -0
  257. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/__init__.py +0 -0
  258. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  259. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/author_node.py +0 -0
  260. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/base_node.py +0 -0
  261. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  262. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/document_node.py +0 -0
  263. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  264. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  265. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  266. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  267. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  268. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  269. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  270. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  271. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/graph_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/group_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/license_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/project_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/property_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/representation_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/resource_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/study_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/nodes/translation_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/ownership.py +0 -0
  289. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  290. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  291. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/project_tree.py +0 -0
  292. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/publication.py +0 -0
  293. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/rapporti.py +0 -0
  294. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resolvers/__init__.py +0 -0
  295. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  296. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  297. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/__init__.py +0 -0
  298. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/addresses.py +0 -0
  299. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/files.py +0 -0
  300. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/fs_backend.py +0 -0
  301. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/locate.py +0 -0
  302. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/minio_backend.py +0 -0
  303. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/resolver.py +0 -0
  304. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  305. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/resources/versions.py +0 -0
  306. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/rights.py +0 -0
  307. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/shelf/__init__.py +0 -0
  308. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/shelf/core.py +0 -0
  309. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/stamp/__init__.py +0 -0
  310. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/stamp/absorb.py +0 -0
  311. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/stamp/emit.py +0 -0
  312. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/stamp/hints.py +0 -0
  313. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/stamp/identity.py +0 -0
  314. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/study.py +0 -0
  315. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/__init__.py +0 -0
  316. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/_db_handle.py +0 -0
  317. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  318. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/_workspace.py +0 -0
  319. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  320. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/edge_registry.py +0 -0
  321. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  322. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/graph_projector.py +0 -0
  323. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  324. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/group_projector.py +0 -0
  325. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/group_store.py +0 -0
  326. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/ingest_result.py +0 -0
  327. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/paradata_store.py +0 -0
  328. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  329. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/rapporti.py +0 -0
  330. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/uuid7.py +0 -0
  331. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  332. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/vocab_types.py +0 -0
  333. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  334. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_detector.py +0 -0
  335. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  336. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  337. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  338. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  339. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  340. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  341. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/temporal/__init__.py +0 -0
  342. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  343. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/__init__.py +0 -0
  344. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  345. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  346. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  347. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  348. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  349. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/node_finder.py +0 -0
  350. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  351. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  352. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/transforms/__init__.py +0 -0
  353. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  354. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/transforms/compact.py +0 -0
  355. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  356. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/translation.py +0 -0
  357. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/utils/__init__.py +0 -0
  358. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/utils/utils.py +0 -0
  359. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/utils/visual_layout.py +0 -0
  360. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy/zero_hour.py +0 -0
  361. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  362. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy.egg-info/requires.txt +0 -0
  363. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  364. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_acquisition.py +0 -0
  365. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_acquisition_fs.py +0 -0
  366. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_add_resource.py +0 -0
  367. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_ai_validation_nodes.py +0 -0
  368. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_api_surface.py +0 -0
  369. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_asset_dtc_protocol.py +0 -0
  370. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_asset_versions.py +0 -0
  371. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_aton_shapes.py +0 -0
  372. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_attach_only.py +0 -0
  373. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_authority_projection.py +0 -0
  374. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_authority_resolver.py +0 -0
  375. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_blend_locator.py +0 -0
  376. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_canonical_document_rename.py +0 -0
  377. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_canvas_metadata_import.py +0 -0
  378. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_capture_acquisition.py +0 -0
  379. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_capture_rdf_class.py +0 -0
  380. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_chronology_on_request.py +0 -0
  381. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_coating_unit.py +0 -0
  382. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_composite_node_name.py +0 -0
  383. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_connection_resolver.py +0 -0
  384. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_consumer_drift.py +0 -0
  385. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_container.py +0 -0
  386. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_container_layouts.py +0 -0
  387. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_containment_tpq.py +0 -0
  388. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_contract.py +0 -0
  389. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_contract_consumer.py +0 -0
  390. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_convert_command.py +0 -0
  391. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_crdt.py +0 -0
  392. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_datamodel_fingerprint.py +0 -0
  393. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_datamodel_i18n.py +0 -0
  394. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_deterministic_ids.py +0 -0
  395. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_em_sourcelist.py +0 -0
  396. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_file_set_stamp.py +0 -0
  397. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_graphml_without_a_database.py +0 -0
  398. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_image_set_texturing.py +0 -0
  399. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_not_georeferenced.py +0 -0
  400. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_one_act_n_outputs.py +0 -0
  401. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev29_ttl_round_trip.py +0 -0
  402. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dev30_decisions.py +0 -0
  403. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_devices.py +0 -0
  404. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dissemination_tombstones.py +0 -0
  405. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dove_sta_il_testo.py +0 -0
  406. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dtc_corpus.py +0 -0
  407. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dtc_ingest.py +0 -0
  408. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dtc_neighbourhood.py +0 -0
  409. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dtc_projection.py +0 -0
  410. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_dtc_residency.py +0 -0
  411. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_edge_ui_phrases.py +0 -0
  412. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_editorial.py +0 -0
  413. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
  414. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_emjson_roundtrip.py +0 -0
  415. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_emjson_schema_version.py +0 -0
  416. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  417. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_epoch_undated_import.py +0 -0
  418. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_explicit_node_type_marker.py +0 -0
  419. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_extracted_from_unit.py +0 -0
  420. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_filtered_import.py +0 -0
  421. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_fmpxml_importer.py +0 -0
  422. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_fs_backend.py +0 -0
  423. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_functional_units.py +0 -0
  424. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_georeference_scene.py +0 -0
  425. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_gltf_stitch.py +0 -0
  426. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_glyph_paths.py +0 -0
  427. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_graph_indices_edges.py +0 -0
  428. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_graph_scope_migration.py +0 -0
  429. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_hdto_projection.py +0 -0
  430. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_header_key_aliases.py +0 -0
  431. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_i_generi_dei_passi.py +0 -0
  432. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_iiif.py +0 -0
  433. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_il_modo_d_accesso.py +0 -0
  434. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_il_modo_dal_relay.py +0 -0
  435. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_il_proprietario_si_legge.py +0 -0
  436. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_il_riallineamento.py +0 -0
  437. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_ipynb_exporter.py +0 -0
  438. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_la_lingua_alla_nascita.py +0 -0
  439. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_la_lingua_dei_dati.py +0 -0
  440. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_la_lingua_nell_op.py +0 -0
  441. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_la_riga_d_intestazione.py +0 -0
  442. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_latex_exporter.py +0 -0
  443. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_le_traduzioni.py +0 -0
  444. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_lod_levels.py +0 -0
  445. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_lossless_roundtrip.py +0 -0
  446. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_mapping_authoring.py +0 -0
  447. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_mapping_csv_and_relations.py +0 -0
  448. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_masonry_unit.py +0 -0
  449. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_material_color.py +0 -0
  450. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_merge_conflicts.py +0 -0
  451. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_metashape_project.py +0 -0
  452. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_migrate_legacy_proxy.py +0 -0
  453. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_minio_backend.py +0 -0
  454. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_authorship.py +0 -0
  455. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_bake_docx.py +0 -0
  456. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_figures.py +0 -0
  457. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_generation.py +0 -0
  458. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_mentions.py +0 -0
  459. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_node.py +0 -0
  460. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_query.py +0 -0
  461. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_scaffolder.py +0 -0
  462. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_site_place.py +0 -0
  463. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_narrative_unvalidated_export.py +0 -0
  464. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_node_datamodel_registry.py +0 -0
  465. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_node_finder.py +0 -0
  466. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_node_type_map_integrity.py +0 -0
  467. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_one_resolver.py +0 -0
  468. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_one_spelling_writers.py +0 -0
  469. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_op_vocabulary.py +0 -0
  470. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_pg_importer.py +0 -0
  471. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_photogrammetry_delta.py +0 -0
  472. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_physical_relation_spellings.py +0 -0
  473. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_piu_indirizzi.py +0 -0
  474. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_promotion.py +0 -0
  475. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_property_owners.py +0 -0
  476. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_proxy_resource.py +0 -0
  477. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_proxy_retype.py +0 -0
  478. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_psx_locator.py +0 -0
  479. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_pyarchinit_tier2.py +0 -0
  480. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_rdf_embedding.py +0 -0
  481. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_rdf_reverse_edges.py +0 -0
  482. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_rdf_roundtrip.py +0 -0
  483. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reading_coords.py +0 -0
  484. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reading_glb.py +0 -0
  485. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reading_migration.py +0 -0
  486. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reading_place.py +0 -0
  487. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reading_rdf.py +0 -0
  488. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_recompute_warnings.py +0 -0
  489. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reproject.py +0 -0
  490. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_file_node.py +0 -0
  491. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_files_implicit.py +0 -0
  492. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_layer.py +0 -0
  493. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_representations.py +0 -0
  494. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_revision.py +0 -0
  495. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_resource_tier.py +0 -0
  496. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_reverse_edges.py +0 -0
  497. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_rm_container_node_group.py +0 -0
  498. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_semantic_purity.py +0 -0
  499. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_shelf.py +0 -0
  500. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_shelf_facets.py +0 -0
  501. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_shelf_hatting.py +0 -0
  502. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_shelf_role_uri_table.py +0 -0
  503. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_shipped_mappings.py +0 -0
  504. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_source_list_mapping.py +0 -0
  505. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_source_text.py +0 -0
  506. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_stamp.py +0 -0
  507. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_stamp_hints.py +0 -0
  508. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_stamp_title_description.py +0 -0
  509. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_store_backed_geometry.py +0 -0
  510. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_stratiminer_api.py +0 -0
  511. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_study_metadata.py +0 -0
  512. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_tileset_resource.py +0 -0
  513. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_ttl_roundtrip.py +0 -0
  514. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_unit_definition.py +0 -0
  515. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_verifica_provenance.py +0 -0
  516. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_visual_assets.py +0 -0
  517. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_wheel_drift.py +0 -0
  518. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  519. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_xlsx_importer_graph_init.py +0 -0
  520. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_xlsx_source_column.py +0 -0
  521. {s3dgraphy-1.6.0.dev36 → s3dgraphy-1.6.0.dev38}/tests/test_zero_hour.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev36
3
+ Version: 1.6.0.dev38
4
4
  Summary: 3D Stratigraphic Graph Management Library for archaeological and heritage applications
5
5
  Author-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
6
6
  Maintainer-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "s3dgraphy"
7
- version = "1.6.0.dev36"
7
+ version = "1.6.0.dev38"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -2324,6 +2324,27 @@
2324
2324
  "de": "Ästhetischer Wert"
2325
2325
  }
2326
2326
  },
2327
+ "alternative_label": {
2328
+ "label": {
2329
+ "en": "Alternative Label",
2330
+ "validated_it": false,
2331
+ "validated_el": false,
2332
+ "validated_he": false,
2333
+ "validated_es": false,
2334
+ "validated_pl": false,
2335
+ "validated_ro": false,
2336
+ "validated_fr": false,
2337
+ "validated_de": false,
2338
+ "it": "Etichetta alternativa",
2339
+ "el": "Εναλλακτική ετικέτα",
2340
+ "he": "תווית חלופית",
2341
+ "es": "Etiqueta alternativa",
2342
+ "pl": "Etykieta alternatywna",
2343
+ "ro": "Etichetă alternativă",
2344
+ "fr": "Libellé alternatif",
2345
+ "de": "Alternative Bezeichnung"
2346
+ }
2347
+ },
2327
2348
  "area": {
2328
2349
  "label": {
2329
2350
  "en": "Area",
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "metadata": {
3
- "version": "1.6.6",
4
- "last_updated": "2026-10-01",
3
+ "version": "1.6.7",
4
+ "last_updated": "2026-10-05",
5
5
  "maintainers": ["Emanuel Demetrescu"],
6
6
  "license": "CC-BY-SA-4.0",
7
7
  "license_note": "Share-alike per allinearsi agli strumenti terminologici da cui questo datamodel prende gli ancoraggi (ICCD CC BY-SA 3.0 IT) e perche' una derivazione resti aperta. Gli identificatori AAT/CIDOC citati nei `mappings` sono RIFERIMENTI, non contenuto incorporato: lo share-alike non si propaga ai vocabolari altrui, che mantengono i propri termini.",
8
- "changelog": "v1.6.6 (dev27, 2026-10-31, decided by E.D. 2026-10-01): cultural_interpretive.semantic.attribution gains an optional `note` in its schema and `natural_language_fields: [\"note\"]` — the object is not text, its note is, and only the note carries a language tag (rdf_exporter._Datamodel.natural_language_fields). v1.6.5 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, domanda 3): the doubtful qualia, MEASURED. contextual.administrative.intervention_history is prose (a history of conservation interventions) and gains `natural_language: true`. provenance_history, exhibition_history, publication_history and contextual.ownership.ownership_chain are `object_chain` WITHOUT a schema: no field of theirs is declared and no code reads a structure, so what a PropertyNode stores is ONE string (the chain as written) — the whole string is marked. cultural_interpretive.semantic.attribution is an `object` WITH separate fields (attributed_to: an E39 Actor reference, attribution_type: a closed list, confidence: a float): none of them is a note, so nothing is marked — the rule is to mark only the note, and this object has none. Its value today travels as one string (\"attributed to Phidias\") and leaves untagged; marking it would need a `note` field in its schema, which is E.D.'s to add. inventory_number stays a code. v1.6.4 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): cultural_interpretive.iconographic.narrative_content gains `natural_language: true` — its value is prose and leaves in RDF with its language tag (crm:P90_has_value \"la guerra di Troia\"@it), the language coming from the property node's data.lang, else the study's working language. data_type alone does not say it: inventory_number is a string too, and it is a CODE, so it is not marked and never tagged. No other quale marked: the ones whose value may be prose (intervention_history, attribution, the *_history and ownership_chain object chains) are waiting for E.D. v1.6.3 (MICRO em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — every em: term of em.ttl is cited by a datamodel): epistemic.confidence.confidence_level.mappings gains specialised_alternative 'em:confidenceLevel', the em.ttl literal form of the same scalar, declared and NOT emitted (the exporter keeps crminf:I6_Belief_Value via J5). Mapping text only, no quale changed. v1.6.2: added two descriptive qualia of the stratigraphic unit asked for by the DAI record (iDAI.field Layer, D7/D8) — proposte da Cowork per E.D., 28 set 2026, dalla scheda DAI: `feature_shape` (spatial; the shape in plan or section named with a term, AAT 300056273, E55_Type) and `boundary_distinctness` (material; how sharp the limits are: abrupt / clear / gradual / diffuse, E55_Type, no AAT evident). Both controlled vocabularies with indicative seed values; templates declare their own. v1.6.1: added the spatial qualia `geometry` — the PROXY as a quale. The geometry-without-material of a unit becomes a PropertyNode whose payload is a SemanticShapeNode (has_semantic_shape), so the proxy inherits the paradata chain a lone node could not have, and one proxy can be synthesised from several sources. CIDOC default crmgeo:SP5_Geometric_Place_Expression, flagged `confirm_with: Felicetti` (E36 is the alternative, to be decided together with em:AnnotationRegion). v1.6.0: version realigned to the EM language version (EM 1.6) — supersedes the standalone 4.x line (last was 4.2), so all EM JSON config files now share the 1.6.x scheme. Added optional `rationale` + `example` fields to qualia entries (a plain-language why + a concrete case), shown by the EMStudio vocabulary picker when creating a PropertyNode. Seeded for the temporal qualia (absolute_time_start / absolute_time_end / dating_method); to be filled in for the rest incrementally. Prior (4.x) history: v4.2 added rationale/example scaffolding; v4.1: expanded spatial elevation qualia for pyArchInit us_table quote (all E54_Dimension): elevation_relative, elevation_min_absolute, elevation_max_absolute, elevation_min_relative, elevation_max_relative, elevation_min_usm, elevation_max_usm (the generic 'elevation' = absolute MASL, used by quota_abs). Each pyArchInit quota column maps to its own qualia id so they don't collide on the single-PropertyNode-per-property_name rule. v4.0: verified all v3.0 CIDOC-CRM mappings (correct). Expanded with: volume, area, circumference in dimensional; color, texture, finish, patina, hardness, porosity in material; damage_type, fragility, completeness in state; tool_marks, joining_technique in technical; bounding_box, footprint_area in spatial; duration, terminus_post_quem, terminus_ante_quem, relative_chronology in temporal; ceremonial_function, ritual_function, defensive_function, domestic_function, symbolic_function in telic; school, workshop, period_attribution in stylistic. NEW subcategories: iconographic + semantic under cultural_interpretive (iconographic_subject, narrative_content, iconographic_program, aesthetic_value, religious_significance, monumental_status, attribution). Added provenance_history, exhibition_history, publication_history under administrative; NEW ownership subcategory (current_custodian, ownership_chain). NEW CATEGORY epistemic — meta-qualia central to EM paradata model (confidence_level, certainty_level, uncertainty_factors, methodology_used, validation_method, source_quality, primary_contributor, review_status, last_modified)."
8
+ "changelog": "v1.6.7 (MICRO le decisioni della sera, 2026-10-05, asked by E.D. 2026-10-04): contextual.administrative gains `alternative_label` — another label of the element in a source (a numbering of another excavation, of a thesis), analogous to skos:altLabel, projected as crm:P1_is_identified_by → E41_Appellation. The first quale declared `repeatable: true`: one PropertyNode per label, never a list in one value, and the merger keys it with its value (two labels are two claims). Its source is the ordinary paradata chain (property has_data_provenance → extractor extracted_from → document); an optional data.scheme names the numbering. The element's own label (area.settore.tipoNumero) is unchanged. s3dgraphy.labels writes and reads them. v1.6.6 (dev27, 2026-10-31, decided by E.D. 2026-10-01): cultural_interpretive.semantic.attribution gains an optional `note` in its schema and `natural_language_fields: [\"note\"]` — the object is not text, its note is, and only the note carries a language tag (rdf_exporter._Datamodel.natural_language_fields). v1.6.5 (MICRO le traduzioni, 2026-10-29, decided by E.D. 2026-10-01, domanda 3): the doubtful qualia, MEASURED. contextual.administrative.intervention_history is prose (a history of conservation interventions) and gains `natural_language: true`. provenance_history, exhibition_history, publication_history and contextual.ownership.ownership_chain are `object_chain` WITHOUT a schema: no field of theirs is declared and no code reads a structure, so what a PropertyNode stores is ONE string (the chain as written) — the whole string is marked. cultural_interpretive.semantic.attribution is an `object` WITH separate fields (attributed_to: an E39 Actor reference, attribution_type: a closed list, confidence: a float): none of them is a note, so nothing is marked — the rule is to mark only the note, and this object has none. Its value today travels as one string (\"attributed to Phidias\") and leaves untagged; marking it would need a `note` field in its schema, which is E.D.'s to add. inventory_number stays a code. v1.6.4 (MICRO la lingua dei dati, 2026-10-27, decided by E.D. 2026-09-28): cultural_interpretive.iconographic.narrative_content gains `natural_language: true` — its value is prose and leaves in RDF with its language tag (crm:P90_has_value \"la guerra di Troia\"@it), the language coming from the property node's data.lang, else the study's working language. data_type alone does not say it: inventory_number is a string too, and it is a CODE, so it is not marked and never tagged. No other quale marked: the ones whose value may be prose (intervention_history, attribution, the *_history and ownership_chain object chains) are waiting for E.D. v1.6.3 (MICRO em.ttl nel datamodel, 2026-10-26, decided by E.D. 2026-10-01 — every em: term of em.ttl is cited by a datamodel): epistemic.confidence.confidence_level.mappings gains specialised_alternative 'em:confidenceLevel', the em.ttl literal form of the same scalar, declared and NOT emitted (the exporter keeps crminf:I6_Belief_Value via J5). Mapping text only, no quale changed. v1.6.2: added two descriptive qualia of the stratigraphic unit asked for by the DAI record (iDAI.field Layer, D7/D8) — proposte da Cowork per E.D., 28 set 2026, dalla scheda DAI: `feature_shape` (spatial; the shape in plan or section named with a term, AAT 300056273, E55_Type) and `boundary_distinctness` (material; how sharp the limits are: abrupt / clear / gradual / diffuse, E55_Type, no AAT evident). Both controlled vocabularies with indicative seed values; templates declare their own. v1.6.1: added the spatial qualia `geometry` — the PROXY as a quale. The geometry-without-material of a unit becomes a PropertyNode whose payload is a SemanticShapeNode (has_semantic_shape), so the proxy inherits the paradata chain a lone node could not have, and one proxy can be synthesised from several sources. CIDOC default crmgeo:SP5_Geometric_Place_Expression, flagged `confirm_with: Felicetti` (E36 is the alternative, to be decided together with em:AnnotationRegion). v1.6.0: version realigned to the EM language version (EM 1.6) — supersedes the standalone 4.x line (last was 4.2), so all EM JSON config files now share the 1.6.x scheme. Added optional `rationale` + `example` fields to qualia entries (a plain-language why + a concrete case), shown by the EMStudio vocabulary picker when creating a PropertyNode. Seeded for the temporal qualia (absolute_time_start / absolute_time_end / dating_method); to be filled in for the rest incrementally. Prior (4.x) history: v4.2 added rationale/example scaffolding; v4.1: expanded spatial elevation qualia for pyArchInit us_table quote (all E54_Dimension): elevation_relative, elevation_min_absolute, elevation_max_absolute, elevation_min_relative, elevation_max_relative, elevation_min_usm, elevation_max_usm (the generic 'elevation' = absolute MASL, used by quota_abs). Each pyArchInit quota column maps to its own qualia id so they don't collide on the single-PropertyNode-per-property_name rule. v4.0: verified all v3.0 CIDOC-CRM mappings (correct). Expanded with: volume, area, circumference in dimensional; color, texture, finish, patina, hardness, porosity in material; damage_type, fragility, completeness in state; tool_marks, joining_technique in technical; bounding_box, footprint_area in spatial; duration, terminus_post_quem, terminus_ante_quem, relative_chronology in temporal; ceremonial_function, ritual_function, defensive_function, domestic_function, symbolic_function in telic; school, workshop, period_attribution in stylistic. NEW subcategories: iconographic + semantic under cultural_interpretive (iconographic_subject, narrative_content, iconographic_program, aesthetic_value, religious_significance, monumental_status, attribution). Added provenance_history, exhibition_history, publication_history under administrative; NEW ownership subcategory (current_custodian, ownership_chain). NEW CATEGORY epistemic — meta-qualia central to EM paradata model (confidence_level, certainty_level, uncertainty_factors, methodology_used, validation_method, source_quality, primary_contributor, review_status, last_modified)."
9
9
  },
10
10
  "qualia_categories": [
11
11
  {
@@ -1071,6 +1071,29 @@
1071
1071
  ],
1072
1072
  "_description_todo": "This subcategory shipped with no description, so its tooltip was empty in the EMStudio vocabulary picker (the only one of 17). The three proposals above match the register of the sibling subcategories — short noun phrase; the longer one mirrors `ownership`, which already defines itself AGAINST this one ('distinct from administrative qualia which cover legal/inventory aspects'). Pick one, move it into `description`, and delete these two keys.",
1073
1073
  "qualia": [
1074
+ {
1075
+ "id": "alternative_label",
1076
+ "name": "Alternative Label",
1077
+ "description": "Another label by which the element is known in a source — a numbering of another excavation, of a thesis, of an archive — with that source as paradata. Repeatable: one property per label. The element's own label (the rule area.settore.tipoNumero) does not change.",
1078
+ "mappings": {
1079
+ "cidoc_crm": "E41_Appellation",
1080
+ "unit_predicate": "crm:P1_is_identified_by",
1081
+ "skos": "skos:altLabel",
1082
+ "mapping_note": "The label is an appellation of the unit (E41, reached with P1_is_identified_by), the same relation skos:altLabel states for a concept; its source is the ordinary paradata chain (has_data_provenance → extractor → extracted_from → the document that uses the label), so it is cited like every other assertion. A numbering it belongs to is data.scheme."
1083
+ },
1084
+ "data_type": "string",
1085
+ "repeatable": true,
1086
+ "schema": {
1087
+ "label": "string",
1088
+ "scheme": "string"
1089
+ },
1090
+ "rationale": "Units of one site are often named differently by the people who dug and studied it: the oldest excavation names them without numbers, a later one numbers them, a thesis numbers them again where the official numbering is missing (E.D., Templu Mare). Keeping every such label, each with the source that uses it, is what lets a reader of any of those publications find the unit — and the search finds them.",
1091
+ "example": "1.US10 is «US 1004» in the 2013 excavation report (scheme «scavo 2013») and «A.12» in Demetrescu's thesis (scheme «tesi Demetrescu»): two alternative_label properties, each with an extractor from its document.",
1092
+ "expected_extractors": [
1093
+ "archival_research",
1094
+ "bibliographic_research"
1095
+ ]
1096
+ },
1074
1097
  {
1075
1098
  "id": "inventory_number",
1076
1099
  "name": "Inventory Number",
@@ -1,4 +1,4 @@
1
- __version__ = "1.6.0.dev36"
1
+ __version__ = "1.6.0.dev38"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -284,6 +284,41 @@ def shared_properties(graph: Graph) -> List[Dict[str, Any]]:
284
284
  return _shared(graph)
285
285
 
286
286
 
287
+ # ── A1 · the alternative labels of a unit, each with its source ─────────────
288
+ def add_alternative_label(graph: Graph, unit_id: str, label: str, *,
289
+ sources: Optional[Sequence[str]] = None,
290
+ scheme: Optional[str] = None,
291
+ author: Optional[str] = None) -> Dict[str, Any]:
292
+ """Another label of ``unit_id`` (quale ``alternative_label``, like
293
+ skos:altLabel): ONE PropertyNode per label, its sources as paradata
294
+ (property → extractor → the document that uses the label), an optional
295
+ ``scheme`` (the numbering it belongs to). The unit's own label does not
296
+ change. Same label, unit and scheme again → the same nodes.
297
+ See :mod:`s3dgraphy.labels`."""
298
+ from .labels import add_alternative_label as _add
299
+ return _add(graph, unit_id, label, sources=sources, scheme=scheme, author=author)
300
+
301
+
302
+ def alternative_labels(graph: Graph, unit_id: str) -> List[Dict[str, Any]]:
303
+ """``[{property_id, label, scheme, sources: [{id, name, extractor_id}]}]``."""
304
+ from .labels import alternative_labels as _labels
305
+ return _labels(graph, unit_id)
306
+
307
+
308
+ def remove_alternative_label(graph: Graph, unit_id: str, property_id: str) -> bool:
309
+ """Take one alternative label off a unit (its extractors stay)."""
310
+ from .labels import remove_alternative_label as _remove
311
+ return _remove(graph, unit_id, property_id)
312
+
313
+
314
+ def find_by_label(graph: Graph, text: str, *, exact: bool = False) -> List[Dict[str, Any]]:
315
+ """The nodes whose label or one of whose alternative labels matches
316
+ ``text`` (case-insensitive, substring unless ``exact``): ``[{node_id,
317
+ name, matched, scheme}]``."""
318
+ from .labels import find_by_label as _find
319
+ return _find(graph, text, exact=exact)
320
+
321
+
287
322
  # ── human authorship with AI support, and its verification ──────────────────
288
323
  def unvalidated_ai(graph: Graph) -> List[Dict[str, Any]]:
289
324
  """Every node made with AI (``data.ai_assisted``) that no person has
@@ -266,6 +266,7 @@ class _Datamodel:
266
266
  #: quale id → the fields of an OBJECT value that are natural language
267
267
  #: (dev27: attribution.note) — the object is not text, its note is
268
268
  self._qualia_natural_language_fields: Dict[str, Tuple[str, ...]] = {}
269
+ self._qualia_unit_predicates: Dict[str, Tuple[str, str]] = {}
269
270
  self._build_qualia_index(self.qualia_types)
270
271
 
271
272
  #: reverse edge name → canonical edge name. The connections datamodel
@@ -312,6 +313,14 @@ class _Datamodel:
312
313
  if qid and isinstance(fields, list):
313
314
  self._qualia_natural_language_fields[qid] = tuple(
314
315
  str(f) for f in fields)
316
+ # A1 · a quale that ALSO says something of its unit with a
317
+ # predicate of its own (alternative_label: the unit is
318
+ # identified by the label, P1, and the label is its
319
+ # skos:altLabel)
320
+ if qid and mappings.get("unit_predicate"):
321
+ self._qualia_unit_predicates[qid] = (
322
+ str(mappings["unit_predicate"]),
323
+ str(mappings.get("skos") or ""))
315
324
 
316
325
  # ─── public lookups ─────────────────────────────────────────────────────
317
326
 
@@ -560,6 +569,13 @@ class _Datamodel:
560
569
  return key
561
570
  return None
562
571
 
572
+ def unit_predicate_for(self, property_type: Optional[str]):
573
+ """``(unit_predicate, skos_predicate)`` of a quale that declares one
574
+ (``mappings.unit_predicate``), else None."""
575
+ if not property_type:
576
+ return None
577
+ return self._qualia_unit_predicates.get(property_type)
578
+
563
579
  def get_qualia_crm_iri(self, property_type: Optional[str]) -> Optional[URIRef]:
564
580
  """Resolve a property_type string to its CIDOC class IRI.
565
581
 
@@ -1052,6 +1068,26 @@ class RDFExporter:
1052
1068
  EM.inheritsQualia,
1053
1069
  self._node_iri(g.graph_id, edge.edge_target)))
1054
1070
 
1071
+ # A1 · the qualia with a predicate of their own on the unit: an
1072
+ # alternative_label leaves as <unit> crm:P1_is_identified_by <label>
1073
+ # and <unit> skos:altLabel "the label" — beside em:hasQualia, so a
1074
+ # reader that knows only CIDOC or only SKOS finds it too
1075
+ for edge in g.edges:
1076
+ if edge.edge_type != "has_property":
1077
+ continue
1078
+ pn = g.find_node_by_id(edge.edge_target)
1079
+ ptype = getattr(pn, "property_type", None) or getattr(pn, "name", None)
1080
+ pred = self.datamodel.unit_predicate_for(ptype)
1081
+ if pn is None or pred is None:
1082
+ continue
1083
+ unit_iri = self._node_iri(g.graph_id, edge.edge_source)
1084
+ if pred[0]:
1085
+ ctx.add((unit_iri, _resolve_prefixed(pred[0]),
1086
+ self._node_iri(g.graph_id, pn.node_id)))
1087
+ value = str(getattr(pn, "value", "") or "").strip()
1088
+ if pred[1] and value:
1089
+ ctx.add((unit_iri, _resolve_prefixed(pred[1]), Literal(value)))
1090
+
1055
1091
  # CRMinf belief propositions (J4 → I17) — needs the full edge
1056
1092
  # topology, so it runs as a post-pass after nodes and edges.
1057
1093
  self._emit_belief_propositions(g, ctx)
@@ -3442,6 +3442,15 @@ class GraphMLImporter:
3442
3442
  edge_type = "combines"
3443
3443
  # print(f"Enhanced to combines: CombinerNode -> ExtractorNode")
3444
3444
 
3445
+ # DocumentNode -> PropertyNode: the document's own property (its
3446
+ # dating, `absolute_time_start` drawn beside a master document),
3447
+ # the reading `_enrich_canonical_documents` already gives it.
3448
+ # Measured on Templu Mare (4 Oct 2026): five of these came out
3449
+ # generic_connection and reached the room that way.
3450
+ elif (isinstance(source_node, DocumentNode)
3451
+ and isinstance(target_node, PropertyNode)):
3452
+ edge_type = "has_property"
3453
+
3445
3454
  # PropertyNode -> DocumentNode. BUGFIX-CONN3: this is read as
3446
3455
  # has_documentation (P70i_is_documented_in) — the honest shortcut
3447
3456
  # when a legacy yEd dashed connector links a property to a source
@@ -0,0 +1,253 @@
1
+ """A1 · the alternative labels of a unit, each with its source.
2
+
3
+ The case (E.D., Templu Mare): in the oldest excavation the units have a name
4
+ and no number, in the 2013 one they are numbered, and for his doctoral thesis
5
+ E.D. used a numbering of his own because the official one was missing. A unit
6
+ must be able to carry several alternative labels, each with where it comes
7
+ from.
8
+
9
+ **The main label does not change.** It is the one of the rule
10
+ ``area.settore.tipoNumero`` (``1.US10``), unique in the graph — inside Blender
11
+ two objects cannot have the same name. An alternative label is a PROPERTY of
12
+ the unit, quale ``alternative_label`` (``em_qualia_types.json``, analogous to
13
+ ``skos:altLabel``, projected as ``crm:P1_is_identified_by`` → ``E41_Appellation``):
14
+
15
+ * repeatable — ONE PropertyNode PER LABEL, never a list in one value;
16
+ * its source is PARADATA, the ordinary chain: property ``has_data_provenance``
17
+ → extractor ``extracted_from`` → the document that uses that label (the 2013
18
+ excavation report, the thesis). So the source is citable like every other
19
+ assertion in EM, and a label read in two documents has two extractors and a
20
+ combiner, as any property does;
21
+ * an optional ``scheme`` (``"scavo 2013"``, ``"tesi Demetrescu"``) names the
22
+ numbering it belongs to, for filtering.
23
+
24
+ Ids are deterministic (``uuid5``), so writing the same label again for the same
25
+ unit and scheme lands on the same nodes instead of piling up copies — the same
26
+ discipline as ``geometry/proxy.py`` and ``annotation/paradata.py``.
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import uuid
32
+ from typing import Any, Dict, List, Optional, Sequence
33
+
34
+ from .graph import Graph
35
+ from .nodes.combiner_node import CombinerNode
36
+ from .nodes.extractor_node import ExtractorNode
37
+ from .nodes.property_node import PropertyNode
38
+
39
+ #: the quale, registered in em_qualia_types.json (contextual ▸ identification)
40
+ ALTERNATIVE_LABEL = "alternative_label"
41
+
42
+ _NS = uuid.uuid5(uuid.NAMESPACE_URL, "https://w3id.org/em/alternative-label")
43
+
44
+
45
+ def _id(key: str) -> str:
46
+ return str(uuid.uuid5(_NS, key))
47
+
48
+
49
+ def _norm(text: Any) -> str:
50
+ return " ".join(str(text or "").split())
51
+
52
+
53
+ def property_id_for(unit_id: str, label: str, scheme: Optional[str] = None) -> str:
54
+ """The id of the PropertyNode carrying ``label`` (in ``scheme``) for a unit."""
55
+ return _id(f"altlabel|{unit_id}|{_norm(scheme).casefold()}|{_norm(label)}")
56
+
57
+
58
+ def _edge(graph: Graph, source_id: str, target_id: str, edge_type: str,
59
+ out: Dict[str, Any]) -> None:
60
+ """One edge, or a warning — never a generic_connection."""
61
+ source = graph.find_node_by_id(source_id)
62
+ target = graph.find_node_by_id(target_id)
63
+ if source is None or target is None:
64
+ out["warnings"].append(f"alternative label: '{edge_type}' not created, an endpoint is missing")
65
+ return
66
+ if not graph.validate_connection(source.node_type, target.node_type, edge_type):
67
+ out["warnings"].append(
68
+ f"alternative label: '{edge_type}' is not allowed from "
69
+ f"{type(source).__name__} to {type(target).__name__}; NOT created")
70
+ return
71
+ edge_id = _id(f"edge|{source_id}|{edge_type}|{target_id}")
72
+ if graph.find_edge_by_id(edge_id) is None:
73
+ graph.add_edge(edge_id, source_id, target_id, edge_type)
74
+ out["created"] = True
75
+ out["edge_ids"].append(edge_id)
76
+
77
+
78
+ def add_alternative_label(graph: Graph, unit_id: str, label: str, *,
79
+ sources: Optional[Sequence[str]] = None,
80
+ scheme: Optional[str] = None,
81
+ author: Optional[str] = None) -> Dict[str, Any]:
82
+ """Give a unit an alternative label, with its sources.
83
+
84
+ Args:
85
+ unit_id: the node the label names (a stratigraphic unit, a document…:
86
+ whatever ``has_property`` admits as a source).
87
+ label: the label as the source writes it (``"US 1004"``, ``"Ambiente
88
+ B"``). Spaces are normalised; nothing else is changed.
89
+ sources: the ids of the documents (or annotation regions, or units)
90
+ that use this label. One source → one extractor; several → one
91
+ extractor each joined by a combiner.
92
+ scheme: the numbering the label belongs to (``"scavo 2013"``).
93
+ author: written as ``data.author`` on the created nodes.
94
+
95
+ Returns ``{property_id, extractor_ids, combiner_id, created, edge_ids,
96
+ warnings}``. Raises ValueError for an empty label.
97
+ """
98
+ text = _norm(label)
99
+ if not text:
100
+ raise ValueError("an alternative label needs a text")
101
+ out: Dict[str, Any] = {"property_id": property_id_for(unit_id, text, scheme),
102
+ "extractor_ids": [], "combiner_id": None,
103
+ "created": False, "edge_ids": [], "warnings": []}
104
+ unit = graph.find_node_by_id(unit_id)
105
+ if unit is None:
106
+ raise ValueError(f"no node '{unit_id}' in the graph")
107
+ if _norm(getattr(unit, "name", "")) == text:
108
+ out["warnings"].append(
109
+ f"alternative label: '{text}' is the unit's own label; written anyway")
110
+ pid = out["property_id"]
111
+ if graph.find_node_by_id(pid) is None:
112
+ prop = PropertyNode(node_id=pid, name=ALTERNATIVE_LABEL, value=text,
113
+ property_type=ALTERNATIVE_LABEL)
114
+ if scheme:
115
+ prop.data["scheme"] = _norm(scheme)
116
+ if author:
117
+ prop.data["author"] = author
118
+ graph.add_node(prop)
119
+ out["created"] = True
120
+ _edge(graph, unit_id, pid, "has_property", out)
121
+
122
+ for source_id in [s for s in (sources or []) if s]:
123
+ src = graph.find_node_by_id(source_id)
124
+ if src is None:
125
+ out["warnings"].append(f"alternative label: source '{source_id}' is not in the graph")
126
+ continue
127
+ eid = _id(f"extractor|{pid}|{source_id}")
128
+ if graph.find_node_by_id(eid) is None:
129
+ ext = ExtractorNode(node_id=eid,
130
+ name=f"{text} in {getattr(src, 'name', source_id)}",
131
+ description=f"the label «{text}» as {getattr(src, 'name', source_id)} uses it")
132
+ if author:
133
+ ext.data["author"] = author
134
+ graph.add_node(ext)
135
+ out["created"] = True
136
+ _edge(graph, eid, source_id, "extracted_from", out)
137
+ out["extractor_ids"].append(eid)
138
+
139
+ if len(out["extractor_ids"]) > 1:
140
+ cid = _id(f"combiner|{pid}")
141
+ if graph.find_node_by_id(cid) is None:
142
+ comb = CombinerNode(node_id=cid, name=f"{text} · sources",
143
+ description="the same label in several sources")
144
+ if author:
145
+ comb.data["author"] = author
146
+ graph.add_node(comb)
147
+ out["created"] = True
148
+ out["combiner_id"] = cid
149
+ for eid in out["extractor_ids"]:
150
+ _edge(graph, cid, eid, "combines", out)
151
+ _edge(graph, pid, cid, "has_data_provenance", out)
152
+ elif out["extractor_ids"]:
153
+ _edge(graph, pid, out["extractor_ids"][0], "has_data_provenance", out)
154
+ return out
155
+
156
+
157
+ def _is_alt_label(node: Any) -> bool:
158
+ return (getattr(node, "node_type", "") == "property"
159
+ and (getattr(node, "property_type", None) == ALTERNATIVE_LABEL
160
+ or getattr(node, "name", None) == ALTERNATIVE_LABEL))
161
+
162
+
163
+ def _sources_of(graph: Graph, prop_id: str) -> List[Dict[str, str]]:
164
+ """The documents a property is read from, through its extractors (and a
165
+ combiner if there is one)."""
166
+ out: List[Dict[str, str]] = []
167
+ frontier = [e.edge_target for e in graph.edges
168
+ if e.edge_source == prop_id and e.edge_type == "has_data_provenance"]
169
+ seen = set()
170
+ while frontier:
171
+ nid = frontier.pop(0)
172
+ if nid in seen:
173
+ continue
174
+ seen.add(nid)
175
+ node = graph.find_node_by_id(nid)
176
+ nt = getattr(node, "node_type", "")
177
+ if nt == "combiner":
178
+ frontier += [e.edge_target for e in graph.edges
179
+ if e.edge_source == nid and e.edge_type == "combines"]
180
+ elif nt == "extractor":
181
+ for e in graph.edges:
182
+ if e.edge_source == nid and e.edge_type == "extracted_from":
183
+ doc = graph.find_node_by_id(e.edge_target)
184
+ out.append({"id": e.edge_target, "name": str(getattr(doc, "name", "") or e.edge_target),
185
+ "extractor_id": nid})
186
+ return out
187
+
188
+
189
+ def alternative_labels(graph: Graph, unit_id: str) -> List[Dict[str, Any]]:
190
+ """The alternative labels of a unit: ``[{property_id, label, scheme,
191
+ sources: [{id, name, extractor_id}]}]``, in the order of the graph."""
192
+ out = []
193
+ for e in graph.edges:
194
+ if e.edge_source != unit_id or e.edge_type != "has_property":
195
+ continue
196
+ prop = graph.find_node_by_id(e.edge_target)
197
+ if prop is None or not _is_alt_label(prop):
198
+ continue
199
+ data = getattr(prop, "data", None) or {}
200
+ out.append({"property_id": prop.node_id, "label": str(getattr(prop, "value", "") or ""),
201
+ "scheme": str(data.get("scheme") or ""),
202
+ "sources": _sources_of(graph, prop.node_id)})
203
+ return out
204
+
205
+
206
+ def remove_alternative_label(graph: Graph, unit_id: str, property_id: str) -> bool:
207
+ """Take a label off a unit: the edge goes, and the property with it when no
208
+ other node holds it (its extractors stay: they are readings of a source)."""
209
+ gone = [e for e in graph.edges if e.edge_source == unit_id
210
+ and e.edge_target == property_id and e.edge_type == "has_property"]
211
+ for e in gone:
212
+ graph.remove_edge(e.edge_id)
213
+ if gone and not any(e.edge_target == property_id and e.edge_type == "has_property"
214
+ for e in graph.edges):
215
+ graph.remove_node(property_id)
216
+ return bool(gone)
217
+
218
+
219
+ def find_by_label(graph: Graph, text: str, *, exact: bool = False) -> List[Dict[str, Any]]:
220
+ """The nodes whose label OR one of whose alternative labels matches
221
+ ``text`` (case-insensitive; a substring unless ``exact``):
222
+ ``[{node_id, name, matched, scheme}]`` — ``matched`` is the label that
223
+ answered, ``scheme`` its numbering (empty for the main label)."""
224
+ q = _norm(text).casefold()
225
+ if not q:
226
+ return []
227
+ hit = (lambda s: s.casefold() == q) if exact else (lambda s: q in s.casefold())
228
+ out: List[Dict[str, Any]] = []
229
+ seen = set()
230
+ for n in graph.nodes:
231
+ name = _norm(getattr(n, "name", ""))
232
+ # the paradata that carry a label in their own name (the extractor «US
233
+ # 1004 in D.2013…») are readings OF a label, not nodes it names
234
+ if getattr(n, "node_type", "") in ("property", "extractor", "combiner"):
235
+ continue
236
+ if name and hit(name):
237
+ out.append({"node_id": n.node_id, "name": name, "matched": name, "scheme": ""})
238
+ seen.add(n.node_id)
239
+ by_id = {n.node_id: n for n in graph.nodes}
240
+ for e in graph.edges:
241
+ if e.edge_type != "has_property" or e.edge_source in seen:
242
+ continue
243
+ prop = by_id.get(e.edge_target)
244
+ if prop is None or not _is_alt_label(prop):
245
+ continue
246
+ label = _norm(getattr(prop, "value", ""))
247
+ if label and hit(label):
248
+ owner = by_id.get(e.edge_source)
249
+ out.append({"node_id": e.edge_source, "name": _norm(getattr(owner, "name", "")),
250
+ "matched": label,
251
+ "scheme": str((getattr(prop, "data", None) or {}).get("scheme") or "")})
252
+ seen.add(e.edge_source)
253
+ return out
@@ -38,6 +38,10 @@ from ..edges.edge import Edge
38
38
  # spellings ``is_bonded_to`` / ``is_physically_equal_to`` (the datamodel's
39
39
  # ``spelling_of``) are still recognised, and COMPARED under the canonical name
40
40
  # (``_canonical_spelling``), so two spellings of one bond are not a conflict.
41
+ #: The qualia a unit may carry more than once, one PropertyNode each
42
+ #: (``repeatable: true`` in em_qualia_types.json).
43
+ REPEATABLE_QUALIA = frozenset({"alternative_label"})
44
+
41
45
  STRATIGRAPHIC_EDGE_TYPES = {
42
46
  'overlies', 'is_overlain_by',
43
47
  'cuts', 'is_cut_by',
@@ -639,10 +643,7 @@ class GraphMerger:
639
643
  cand = incoming.find_node_by_id(edge.edge_target)
640
644
  if not isinstance(cand, PropertyNode):
641
645
  continue
642
- cand_type = cand.property_type
643
- if not cand_type or cand_type == 'string':
644
- cand_type = cand.name
645
- if cand_type == prop_type:
646
+ if self._qualia_key(cand) == prop_type:
646
647
  inc_pn = cand
647
648
  break
648
649
  if inc_pn is None:
@@ -784,10 +785,7 @@ class GraphMerger:
784
785
  cand = graph.find_node_by_id(e.edge_target)
785
786
  if not isinstance(cand, PropertyNode):
786
787
  continue
787
- cand_type = cand.property_type
788
- if not cand_type or cand_type == 'string':
789
- cand_type = cand.name
790
- if cand_type == prop_type:
788
+ if self._qualia_key(cand) == prop_type:
791
789
  pn_to_remove = cand
792
790
  break
793
791
  if pn_to_remove is None:
@@ -989,12 +987,26 @@ class GraphMerger:
989
987
  pn = graph.find_node_by_id(edge.edge_target)
990
988
  if not host_name or not isinstance(pn, PropertyNode):
991
989
  continue
992
- prop_type = pn.property_type
993
- if not prop_type or prop_type == 'string':
994
- prop_type = pn.name or 'definition'
995
- out[(host_name, prop_type)] = pn
990
+ out[(host_name, self._qualia_key(pn))] = pn
996
991
  return out
997
992
 
993
+ @staticmethod
994
+ def _qualia_key(pn: PropertyNode) -> str:
995
+ """The quale a PropertyNode answers, as the maps key it: its
996
+ ``property_type`` (its name when the type is missing or the legacy
997
+ ``"string"``). A REPEATABLE quale (``alternative_label``: one
998
+ PropertyNode per label, A1 5 Oct 2026) is keyed with its value too —
999
+ two labels of one unit are two claims, so a label the table adds is
1000
+ ``qualia_added`` and never a ``qualia_changed`` of the other one."""
1001
+ prop_type = pn.property_type
1002
+ if not prop_type or prop_type == 'string':
1003
+ prop_type = pn.name or 'definition'
1004
+ if prop_type in REPEATABLE_QUALIA:
1005
+ value = " ".join(str(getattr(pn, "value", "") or "").split())
1006
+ scheme = " ".join(str((getattr(pn, "data", None) or {}).get("scheme") or "").split())
1007
+ return f"{prop_type}={value}" + (f" [{scheme}]" if scheme else "")
1008
+ return prop_type
1009
+
998
1010
  @staticmethod
999
1011
  def _pn_display_value(pn: PropertyNode) -> str:
1000
1012
  """Display value for a PropertyNode — falls back to
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev36
3
+ Version: 1.6.0.dev38
4
4
  Summary: 3D Stratigraphic Graph Management Library for archaeological and heritage applications
5
5
  Author-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
6
6
  Maintainer-email: Emanuel Demetrescu <emanuel.demetrescu@cnr.it>
@@ -15,6 +15,7 @@ src/s3dgraphy/editorial.py
15
15
  src/s3dgraphy/graph.py
16
16
  src/s3dgraphy/iiif.py
17
17
  src/s3dgraphy/indices.py
18
+ src/s3dgraphy/labels.py
18
19
  src/s3dgraphy/language.py
19
20
  src/s3dgraphy/ownership.py
20
21
  src/s3dgraphy/project_tree.py
@@ -358,6 +359,7 @@ tests/test_acquisition.py
358
359
  tests/test_acquisition_fs.py
359
360
  tests/test_add_resource.py
360
361
  tests/test_ai_validation_nodes.py
362
+ tests/test_alternative_labels.py
361
363
  tests/test_api_surface.py
362
364
  tests/test_asset_dtc_protocol.py
363
365
  tests/test_asset_versions.py