s3dgraphy 1.6.0.dev30__tar.gz → 1.6.0.dev32__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 (509) hide show
  1. {s3dgraphy-1.6.0.dev30/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev32}/PKG-INFO +1 -1
  2. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/pyproject.toml +1 -1
  3. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/__init__.py +1 -1
  4. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/container.py +136 -8
  5. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
  6. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy.egg-info/SOURCES.txt +1 -0
  7. s3dgraphy-1.6.0.dev32/tests/test_container_layouts.py +63 -0
  8. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_release.py +110 -0
  9. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/LICENSE +0 -0
  10. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/MANIFEST.in +0 -0
  11. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/README.md +0 -0
  12. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/setup.cfg +0 -0
  13. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  14. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  15. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  16. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  17. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
  18. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  19. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  20. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  21. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  22. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  23. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  24. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
  25. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  26. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  27. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
  28. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  29. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  30. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  31. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  32. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
  33. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  34. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  35. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  36. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  37. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  38. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  39. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  40. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  41. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  42. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  43. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  44. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  45. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  46. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  47. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  48. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  49. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  50. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  51. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  52. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  53. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  54. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  55. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  56. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  57. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  58. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  59. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  60. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  61. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  62. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  63. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  64. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  65. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  66. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  67. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  68. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  69. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  70. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  71. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  72. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  73. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  74. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  75. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  76. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  77. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  78. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  79. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  80. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  81. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  82. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  83. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  84. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  85. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  86. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  87. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  88. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  89. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  90. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  91. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  92. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  93. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  94. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  95. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  96. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  97. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  98. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  99. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  100. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  101. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  102. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  103. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  104. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  105. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  106. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  107. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  108. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  109. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  110. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  111. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  112. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  113. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  114. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  115. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  116. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  117. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  118. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  119. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  120. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  121. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  122. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  123. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  124. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  125. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  126. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  127. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  128. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  129. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  130. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  131. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  132. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  133. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  134. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  135. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  136. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  137. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  138. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/acquisition/__init__.py +0 -0
  139. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/acquisition/acquire.py +0 -0
  140. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  141. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/acquisition/mapping.py +0 -0
  142. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/ai_validation.py +0 -0
  143. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/annotation/__init__.py +0 -0
  144. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  145. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/annotation/paradata.py +0 -0
  146. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/annotation/reading.py +0 -0
  147. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/api.py +0 -0
  148. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/__init__.py +0 -0
  149. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/resolver.py +0 -0
  150. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  151. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  152. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  153. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  154. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  155. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  156. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/classification.py +0 -0
  157. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/contract/__init__.py +0 -0
  158. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/contract/connector.py +0 -0
  159. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/contract/consumer.py +0 -0
  160. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/contract/core.py +0 -0
  161. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/contract/reference.py +0 -0
  162. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/crdt.py +0 -0
  163. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  164. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/datamodel.py +0 -0
  165. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/diagnostics.py +0 -0
  166. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dissemination.py +0 -0
  167. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/__init__.py +0 -0
  168. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/capture.py +0 -0
  169. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/corpus.py +0 -0
  170. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/devices.py +0 -0
  171. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/ingest.py +0 -0
  172. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  173. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/dtc/residency.py +0 -0
  174. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/edges/__init__.py +0 -0
  175. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  176. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/edges/connections_loader.py +0 -0
  177. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/edges/edge.py +0 -0
  178. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/editorial.py +0 -0
  179. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/__init__.py +0 -0
  180. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  181. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  182. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  183. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  184. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  185. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  186. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  187. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  188. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  189. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  190. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  191. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  192. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  193. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  194. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  195. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  196. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  197. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  198. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  199. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  200. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  201. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
  202. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  203. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/__init__.py +0 -0
  204. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/aton.py +0 -0
  205. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/gltf.py +0 -0
  206. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/migrate.py +0 -0
  207. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/proxy.py +0 -0
  208. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  209. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/store_backed.py +0 -0
  210. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/geometry/wkt.py +0 -0
  211. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/graph.py +0 -0
  212. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/iiif.py +0 -0
  213. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/__init__.py +0 -0
  214. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/base_importer.py +0 -0
  215. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/csv_importer.py +0 -0
  216. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  217. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  218. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/import_graphml.py +0 -0
  219. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  220. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/metashape_project.py +0 -0
  221. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  222. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  223. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  224. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/sheet_header.py +0 -0
  225. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/source_text.py +0 -0
  226. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  227. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  228. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/importer/xml_importer.py +0 -0
  229. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/indices.py +0 -0
  230. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/language.py +0 -0
  231. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/__init__.py +0 -0
  232. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/authoring.py +0 -0
  233. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  234. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  235. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  236. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  237. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  238. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/registry.py +0 -0
  239. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +0 -0
  240. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  241. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  242. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  243. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/merge/__init__.py +0 -0
  244. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/merge/graph_merger.py +0 -0
  245. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/multigraph/__init__.py +0 -0
  246. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  247. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/__init__.py +0 -0
  248. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/bake.py +0 -0
  249. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/generation.py +0 -0
  250. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/query.py +0 -0
  251. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/registry.py +0 -0
  252. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/narrative/site_story.py +0 -0
  253. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/__init__.py +0 -0
  254. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  255. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/author_node.py +0 -0
  256. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/base_node.py +0 -0
  257. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  258. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/document_node.py +0 -0
  259. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  260. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  261. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  262. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  263. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  264. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  265. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  266. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  267. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  268. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/graph_node.py +0 -0
  269. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/group_node.py +0 -0
  270. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  271. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/license_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/project_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/property_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/representation_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/resource_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/study_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/nodes/translation_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/ownership.py +0 -0
  285. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  286. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  287. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/publication.py +0 -0
  288. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/rapporti.py +0 -0
  289. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resolvers/__init__.py +0 -0
  290. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  291. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  292. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/__init__.py +0 -0
  293. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/addresses.py +0 -0
  294. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/files.py +0 -0
  295. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/fs_backend.py +0 -0
  296. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/minio_backend.py +0 -0
  297. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/resolver.py +0 -0
  298. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  299. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/rights.py +0 -0
  300. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/shelf/__init__.py +0 -0
  301. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/shelf/core.py +0 -0
  302. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/stamp/__init__.py +0 -0
  303. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/stamp/absorb.py +0 -0
  304. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/stamp/emit.py +0 -0
  305. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/stamp/hints.py +0 -0
  306. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/stamp/identity.py +0 -0
  307. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/study.py +0 -0
  308. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/__init__.py +0 -0
  309. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/_db_handle.py +0 -0
  310. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  311. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/_workspace.py +0 -0
  312. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  313. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/edge_registry.py +0 -0
  314. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  315. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/graph_projector.py +0 -0
  316. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  317. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/group_projector.py +0 -0
  318. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/group_store.py +0 -0
  319. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/ingest_result.py +0 -0
  320. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/paradata_store.py +0 -0
  321. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  322. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/rapporti.py +0 -0
  323. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/uuid7.py +0 -0
  324. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  325. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/vocab_types.py +0 -0
  326. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  327. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_detector.py +0 -0
  328. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  329. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  330. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  331. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  332. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  333. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  334. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/temporal/__init__.py +0 -0
  335. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  336. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/__init__.py +0 -0
  337. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  338. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  339. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  340. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  341. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  342. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  343. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  344. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/transforms/__init__.py +0 -0
  345. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  346. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/transforms/compact.py +0 -0
  347. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  348. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/translation.py +0 -0
  349. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/utils/__init__.py +0 -0
  350. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/utils/utils.py +0 -0
  351. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/utils/visual_layout.py +0 -0
  352. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy/zero_hour.py +0 -0
  353. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  354. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy.egg-info/requires.txt +0 -0
  355. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  356. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_acquisition.py +0 -0
  357. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_acquisition_fs.py +0 -0
  358. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_add_resource.py +0 -0
  359. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_ai_validation_nodes.py +0 -0
  360. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_api_surface.py +0 -0
  361. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_asset_dtc_protocol.py +0 -0
  362. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_aton_shapes.py +0 -0
  363. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_attach_only.py +0 -0
  364. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_authority_projection.py +0 -0
  365. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_authority_resolver.py +0 -0
  366. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_blend_locator.py +0 -0
  367. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_canonical_document_rename.py +0 -0
  368. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_canvas_metadata_import.py +0 -0
  369. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_capture_acquisition.py +0 -0
  370. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_capture_rdf_class.py +0 -0
  371. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_chronology_on_request.py +0 -0
  372. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_coating_unit.py +0 -0
  373. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_composite_node_name.py +0 -0
  374. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_connection_resolver.py +0 -0
  375. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_consumer_drift.py +0 -0
  376. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_container.py +0 -0
  377. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_containment_tpq.py +0 -0
  378. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_contract.py +0 -0
  379. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_contract_consumer.py +0 -0
  380. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_convert_command.py +0 -0
  381. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_crdt.py +0 -0
  382. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_datamodel_fingerprint.py +0 -0
  383. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_datamodel_i18n.py +0 -0
  384. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_deterministic_ids.py +0 -0
  385. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_em_sourcelist.py +0 -0
  386. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_file_set_stamp.py +0 -0
  387. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_graphml_without_a_database.py +0 -0
  388. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_image_set_texturing.py +0 -0
  389. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_not_georeferenced.py +0 -0
  390. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_one_act_n_outputs.py +0 -0
  391. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev29_ttl_round_trip.py +0 -0
  392. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dev30_decisions.py +0 -0
  393. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_devices.py +0 -0
  394. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dissemination_tombstones.py +0 -0
  395. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dove_sta_il_testo.py +0 -0
  396. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dtc_corpus.py +0 -0
  397. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dtc_ingest.py +0 -0
  398. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dtc_neighbourhood.py +0 -0
  399. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dtc_projection.py +0 -0
  400. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_dtc_residency.py +0 -0
  401. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_edge_ui_phrases.py +0 -0
  402. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_editorial.py +0 -0
  403. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
  404. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_emjson_roundtrip.py +0 -0
  405. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_emjson_schema_version.py +0 -0
  406. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  407. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_epoch_undated_import.py +0 -0
  408. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_explicit_node_type_marker.py +0 -0
  409. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_extracted_from_unit.py +0 -0
  410. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_filtered_import.py +0 -0
  411. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_fmpxml_importer.py +0 -0
  412. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_fs_backend.py +0 -0
  413. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_functional_units.py +0 -0
  414. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_georeference_scene.py +0 -0
  415. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_gltf_stitch.py +0 -0
  416. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_glyph_paths.py +0 -0
  417. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_graph_indices_edges.py +0 -0
  418. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_graph_scope_migration.py +0 -0
  419. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_hdto_projection.py +0 -0
  420. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_header_key_aliases.py +0 -0
  421. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_i_generi_dei_passi.py +0 -0
  422. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_iiif.py +0 -0
  423. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_il_modo_d_accesso.py +0 -0
  424. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_il_modo_dal_relay.py +0 -0
  425. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_il_proprietario_si_legge.py +0 -0
  426. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_il_riallineamento.py +0 -0
  427. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_importer_edge_hygiene.py +0 -0
  428. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_ipynb_exporter.py +0 -0
  429. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_la_lingua_alla_nascita.py +0 -0
  430. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_la_lingua_dei_dati.py +0 -0
  431. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_la_lingua_nell_op.py +0 -0
  432. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_la_riga_d_intestazione.py +0 -0
  433. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_latex_exporter.py +0 -0
  434. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_le_traduzioni.py +0 -0
  435. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_lossless_roundtrip.py +0 -0
  436. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_mapping_authoring.py +0 -0
  437. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_mapping_csv_and_relations.py +0 -0
  438. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_masonry_unit.py +0 -0
  439. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_material_color.py +0 -0
  440. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_merge_conflicts.py +0 -0
  441. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_metashape_project.py +0 -0
  442. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_migrate_legacy_proxy.py +0 -0
  443. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_minio_backend.py +0 -0
  444. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_authorship.py +0 -0
  445. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_bake_docx.py +0 -0
  446. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_figures.py +0 -0
  447. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_generation.py +0 -0
  448. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_mentions.py +0 -0
  449. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_node.py +0 -0
  450. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_query.py +0 -0
  451. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_scaffolder.py +0 -0
  452. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_site_place.py +0 -0
  453. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_narrative_unvalidated_export.py +0 -0
  454. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_node_datamodel_registry.py +0 -0
  455. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_node_type_map_integrity.py +0 -0
  456. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_one_spelling_writers.py +0 -0
  457. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_pg_importer.py +0 -0
  458. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_photogrammetry_delta.py +0 -0
  459. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_physical_relation_spellings.py +0 -0
  460. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_piu_indirizzi.py +0 -0
  461. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_promotion.py +0 -0
  462. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_property_owners.py +0 -0
  463. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_proxy_resource.py +0 -0
  464. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_proxy_retype.py +0 -0
  465. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_psx_locator.py +0 -0
  466. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_pyarchinit_tier2.py +0 -0
  467. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_qualia_dai_d7_d8.py +0 -0
  468. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_rdf_embedding.py +0 -0
  469. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_rdf_reverse_edges.py +0 -0
  470. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_rdf_roundtrip.py +0 -0
  471. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reading_coords.py +0 -0
  472. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reading_glb.py +0 -0
  473. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reading_migration.py +0 -0
  474. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reading_place.py +0 -0
  475. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reading_rdf.py +0 -0
  476. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_recompute_warnings.py +0 -0
  477. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reproject.py +0 -0
  478. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_file_node.py +0 -0
  479. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_files_implicit.py +0 -0
  480. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_layer.py +0 -0
  481. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_representations.py +0 -0
  482. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_revision.py +0 -0
  483. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_resource_tier.py +0 -0
  484. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_reverse_edges.py +0 -0
  485. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_rm_container_node_group.py +0 -0
  486. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_semantic_purity.py +0 -0
  487. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_shelf.py +0 -0
  488. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_shelf_facets.py +0 -0
  489. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_shelf_hatting.py +0 -0
  490. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_shelf_role_uri_table.py +0 -0
  491. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_shipped_mappings.py +0 -0
  492. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_source_list_mapping.py +0 -0
  493. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_source_text.py +0 -0
  494. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_stamp.py +0 -0
  495. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_stamp_hints.py +0 -0
  496. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_stamp_title_description.py +0 -0
  497. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_store_backed_geometry.py +0 -0
  498. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_stratiminer_api.py +0 -0
  499. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_study_metadata.py +0 -0
  500. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_tileset_resource.py +0 -0
  501. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_ttl_roundtrip.py +0 -0
  502. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_unit_definition.py +0 -0
  503. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_verifica_provenance.py +0 -0
  504. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_visual_assets.py +0 -0
  505. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_wheel_drift.py +0 -0
  506. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  507. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_xlsx_importer_graph_init.py +0 -0
  508. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/tests/test_xlsx_source_column.py +0 -0
  509. {s3dgraphy-1.6.0.dev30 → s3dgraphy-1.6.0.dev32}/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.dev30
3
+ Version: 1.6.0.dev32
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.dev30"
7
+ version = "1.6.0.dev32"
8
8
  description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,4 +1,4 @@
1
- __version__ = "1.6.0.dev30"
1
+ __version__ = "1.6.0.dev32"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -9,9 +9,24 @@ The decision (E.D., 2026-08-13): **an em.json/emj is always a container**::
9
9
  "shelf": { ... em_collection: "ShelfGraph" },
10
10
  "dtc": { ... em_collection: "DTCCorpus" }
11
11
  },
12
- "active_graph_id": "<graph id>"
12
+ "active_graph_id": "<graph id>",
13
+ "layout": { ...the active graph's layout, a copy... }
13
14
  }
14
15
 
16
+ **One layout per graph (2026-10-02).** Each member carries its own arrangement
17
+ INSIDE its section, ``graphs.<id>.layout`` (positions, lanes, canvas, folded
18
+ groups — the single-graph ``layout`` object, unchanged). The file-level
19
+ ``layout`` stays, written as a COPY of the active graph's, for whoever reads only
20
+ that (Heriverse, the files written before today). Reading:
21
+ ``graphs.<id>.layout`` when the member has one; otherwise the file-level
22
+ ``layout`` goes to ONE graph — the one whose nodes it positions, else the
23
+ active one (or the only one); the other graphs of an old file have no arrangement and are laid out afresh, which the reader
24
+ says once. Until today the file had ONE layout for every graph, and whichever
25
+ graph was saved first gave it away: measured on San Pietro, the layout in the
26
+ file was an empty seed's and the real graph had lost every position.
27
+ ``EMStudio/frontend/src/container.ts`` applies the same rule, and the shared
28
+ fixture ``tests/fixtures/container-layout-parity.json`` keeps the two equal.
29
+
15
30
  A study is one or more graphs plus its shelf and its **documentation** (the DTC
16
31
  corpus, 2026-08-17: acquisitions, transformations and the resources they are
17
32
  about — a forest that shares its leaves, and ontologically not a matrix); a
@@ -62,7 +77,7 @@ import json
62
77
  import os
63
78
  from dataclasses import dataclass, field
64
79
  from pathlib import Path
65
- from typing import Any, Dict, List, Optional, Tuple
80
+ from typing import Any, Dict, Iterable, List, Optional, Tuple
66
81
 
67
82
  from . import crdt
68
83
  from .graph import Graph
@@ -70,6 +85,9 @@ from .graph import Graph
70
85
  #: The key that makes a document a container.
71
86
  GRAPHS_KEY = "graphs"
72
87
 
88
+ #: Where a member keeps its own arrangement: ``graphs.<id>.layout``.
89
+ LAYOUT_KEY = "layout"
90
+
73
91
  #: The conventional member id of the project shelf. Any id works — the marker
74
92
  #: (`graph.data["em_collection"] == "ShelfGraph"`) is what identifies it — but
75
93
  #: this is the one Heriverse uses, so writing it keeps the two aligned.
@@ -154,8 +172,15 @@ def content_digest(doc: Dict[str, Any]) -> str:
154
172
  """
155
173
  import hashlib
156
174
 
175
+ # a member's own layout is arrangement, not content: moving a box inside
176
+ # one graph of a project is no more a revision than it was at file level
177
+ graphs = {
178
+ gid: ({k: v for k, v in section.items() if k != LAYOUT_KEY}
179
+ if isinstance(section, dict) else section)
180
+ for gid, section in (doc.get(GRAPHS_KEY) or {}).items()
181
+ }
157
182
  payload = {
158
- GRAPHS_KEY: doc.get(GRAPHS_KEY) or {},
183
+ GRAPHS_KEY: graphs,
159
184
  "active_graph_id": doc.get("active_graph_id"),
160
185
  }
161
186
  blob = json.dumps(payload, sort_keys=True, ensure_ascii=False,
@@ -185,7 +210,13 @@ class Container:
185
210
  corpus: Optional[Graph] = None
186
211
  active_graph_id: Optional[str] = None
187
212
  header: Dict[str, Any] = field(default_factory=dict)
213
+ #: The ACTIVE graph's layout, for a caller that has one graph and one
214
+ #: arrangement (``export_emjson``). Used only for the active graph, and only
215
+ #: when ``layouts`` has no entry for it — it is never given to another graph.
188
216
  layout: Dict[str, Any] = field(default_factory=dict)
217
+ #: One layout per graph id (``graphs.<id>.layout`` in the file). A graph with
218
+ #: no entry has no arrangement and is laid out afresh by whoever draws it.
219
+ layouts: Dict[str, Dict[str, Any]] = field(default_factory=dict)
189
220
  #: P3 · which revision of the work this is (None = never versioned; the
190
221
  #: first write gives it a v1 rather than pretending it always had one)
191
222
  version: Optional[ProjectVersion] = None
@@ -202,6 +233,21 @@ class Container:
202
233
  """A container-of-one — the shape a legacy file opens as."""
203
234
  return len(self.graphs) == 1
204
235
 
236
+ def layout_of(self, graph_id: Optional[str]) -> Optional[Dict[str, Any]]:
237
+ """The layout of ONE graph, or None when it has none.
238
+
239
+ `layouts` first; the convenience `layout` only for the active graph. A
240
+ graph is never handed another graph's arrangement — that was the bug.
241
+ """
242
+ if graph_id is None:
243
+ return None
244
+ if graph_id in self.layouts:
245
+ return self.layouts[graph_id]
246
+ active = self.active_graph_id or next(iter(self.graphs), None)
247
+ if graph_id == active and self.layout:
248
+ return self.layout
249
+ return None
250
+
205
251
 
206
252
  def is_container(doc: Any) -> bool:
207
253
  """True when the document carries the `graphs` map.
@@ -231,6 +277,63 @@ def is_dtc_corpus_member(graph_section: Any) -> bool:
231
277
  return is_dtc_corpus(graph_section)
232
278
 
233
279
 
280
+ def resolve_layouts(graph_ids: List[str],
281
+ own: Dict[str, Dict[str, Any]],
282
+ file_layout: Dict[str, Any],
283
+ active_graph_id: Optional[str],
284
+ node_ids: Optional[Dict[str, Iterable[str]]] = None,
285
+ ) -> Tuple[Dict[str, Dict[str, Any]], List[str]]:
286
+ """Which layout each graph of a file gets, and which ones get none.
287
+
288
+ THE reading rule, the same as ``container.ts::resolveLayouts``:
289
+
290
+ 1. a member that carries ``graphs.<id>.layout`` keeps its own;
291
+ 2. otherwise the file-level ``layout`` goes to ONE graph and to no other: in a
292
+ file written before per-graph layouts it was the arrangement of one graph,
293
+ and giving it to the rest was the bug. That graph is the one whose nodes
294
+ the layout positions (``node_ids``, most positions wins) — NOT simply the
295
+ active one: an old file kept the layout of the graph laid out LAST, which
296
+ may be a seed that is not the active graph (San Pietro, dev.17: the seed's
297
+ three positions went to the real graph, which then saved them as its own
298
+ and was never laid out). Ties, a layout with no positions, or no
299
+ ``node_ids`` → the ACTIVE graph, or the only one;
300
+ 3. the remaining graphs get nothing and are laid out afresh. They are
301
+ returned as ``fresh`` only for an OLD file — one with a layout to give and
302
+ no member carrying its own: there, a graph's positions may have been lost
303
+ to another's, and that is worth saying once. In a file written with
304
+ per-graph layouts a graph without one simply has none (never laid out),
305
+ and saying so at every open would be noise.
306
+ """
307
+ layouts: Dict[str, Dict[str, Any]] = {}
308
+ fresh: List[str] = []
309
+ heir = active_graph_id if active_graph_id in graph_ids else (
310
+ graph_ids[0] if graph_ids else None)
311
+ if len(graph_ids) == 1:
312
+ heir = graph_ids[0]
313
+ elif file_layout and node_ids:
314
+ placed = set((file_layout.get("positions") or {}).keys())
315
+ counts = {gid: len(placed & set(node_ids.get(gid) or ()))
316
+ for gid in graph_ids if gid not in own}
317
+ best = max(counts.values(), default=0)
318
+ if best > 0 and counts.get(heir, 0) < best:
319
+ heir = next(gid for gid in graph_ids if counts.get(gid, 0) == best)
320
+ for gid in graph_ids:
321
+ if gid in own:
322
+ layouts[gid] = own[gid]
323
+ elif gid == heir and file_layout:
324
+ layouts[gid] = file_layout
325
+ elif file_layout and not own:
326
+ fresh.append(gid)
327
+ return layouts, fresh
328
+
329
+
330
+ def layout_fresh_warning(fresh: List[str]) -> str:
331
+ """The one sentence about the graphs of an old file that had no layout."""
332
+ return (f"{len(fresh)} graph(s) of this file carry no layout of their own "
333
+ f"(written before per-graph layouts): laid out afresh — "
334
+ f"{', '.join(fresh)}")
335
+
336
+
234
337
  def parse_container(doc: Dict[str, Any], *,
235
338
  project_root: Optional[str] = None) -> Tuple[Container, List[str]]:
236
339
  """Read a container OR a legacy single-graph document.
@@ -249,7 +352,8 @@ def parse_container(doc: Dict[str, Any], *,
249
352
  raise EmJsonImportError("not an em.json document")
250
353
 
251
354
  header = dict(doc.get("header") or {})
252
- layout = dict(doc.get("layout") or {})
355
+ file_layout = doc.get(LAYOUT_KEY)
356
+ file_layout = dict(file_layout) if isinstance(file_layout, dict) else {}
253
357
 
254
358
  if not is_container(doc):
255
359
  # LEGACY single-graph: read it with the reader that has always read it,
@@ -259,18 +363,22 @@ def parse_container(doc: Dict[str, Any], *,
259
363
  graphs={graph.graph_id: graph},
260
364
  active_graph_id=graph.graph_id,
261
365
  header=header,
262
- layout=layout,
366
+ layouts={graph.graph_id: file_layout} if file_layout else {},
263
367
  version=ProjectVersion.from_dict(doc.get(VERSION_KEY)),
264
368
  )
265
369
  return container, list(graph_warnings)
266
370
 
267
- container = Container(header=header, layout=layout,
371
+ container = Container(header=header,
268
372
  version=ProjectVersion.from_dict(doc.get(VERSION_KEY)))
373
+ own_layouts: Dict[str, Dict[str, Any]] = {}
374
+ node_ids: Dict[str, List[str]] = {}
269
375
  members = doc[GRAPHS_KEY]
270
376
  for member_id, section in members.items():
271
377
  if not isinstance(section, dict):
272
378
  warnings.append(f"container member '{member_id}' is not a graph; skipped")
273
379
  continue
380
+ own = section.get(LAYOUT_KEY)
381
+ section = {k: v for k, v in section.items() if k != LAYOUT_KEY}
274
382
  # Each member is parsed by the SAME single-graph reader, by handing it a
275
383
  # one-graph document. The alternative — a second parser for members —
276
384
  # would be a second place for the em.json semantics to live.
@@ -295,6 +403,11 @@ def parse_container(doc: Dict[str, Any], *,
295
403
  container.corpus = graph
296
404
  else:
297
405
  container.graphs[graph.graph_id] = graph
406
+ node_ids[graph.graph_id] = [
407
+ str(n.get("id")) for n in (section.get("nodes") or [])
408
+ if isinstance(n, dict) and n.get("id") is not None]
409
+ if isinstance(own, dict):
410
+ own_layouts[graph.graph_id] = dict(own)
298
411
 
299
412
  active = doc.get("active_graph_id")
300
413
  if isinstance(active, str) and active in container.graphs:
@@ -306,6 +419,12 @@ def parse_container(doc: Dict[str, Any], *,
306
419
  f"falling back to the first graph")
307
420
  container.active_graph_id = next(iter(container.graphs), None)
308
421
 
422
+ container.layouts, fresh = resolve_layouts(
423
+ list(container.graphs), own_layouts, file_layout, container.active_graph_id,
424
+ node_ids)
425
+ if fresh:
426
+ warnings.append(layout_fresh_warning(fresh))
427
+
309
428
  if not container.graphs and (container.shelf is not None
310
429
  or container.corpus is not None):
311
430
  held = " and ".join(
@@ -337,6 +456,9 @@ def build_container(container: Container) -> Dict[str, Any]:
337
456
  graphs: Dict[str, Any] = {}
338
457
  for graph_id, graph in container.graphs.items():
339
458
  graphs[graph_id] = _member_section(graph)
459
+ own = container.layout_of(graph_id)
460
+ if own:
461
+ graphs[graph_id][LAYOUT_KEY] = own
340
462
  if container.shelf is not None:
341
463
  shelf_id = container.shelf.graph_id or SHELF_MEMBER_ID
342
464
  graphs[shelf_id] = _member_section(container.shelf)
@@ -369,8 +491,10 @@ def build_container(container: Container) -> Dict[str, Any]:
369
491
  active = container.active_graph_id or next(iter(container.graphs), None)
370
492
  if active:
371
493
  doc["active_graph_id"] = active
372
- if container.layout:
373
- doc["layout"] = container.layout
494
+ # the file-level copy, for whoever reads only that: the ACTIVE graph's
495
+ active_layout = container.layout_of(active)
496
+ if active_layout:
497
+ doc[LAYOUT_KEY] = active_layout
374
498
  if container.version is not None:
375
499
  doc[VERSION_KEY] = container.version.as_dict()
376
500
  return doc
@@ -855,6 +979,10 @@ def merge_into_container(container: Container, other: Container) -> MergeReport:
855
979
  report.merged_graphs.append(graph_id)
856
980
  else:
857
981
  container.graphs[graph_id] = incoming
982
+ # …with its own arrangement: a graph that arrives whole arrives laid out
983
+ theirs = other.layout_of(graph_id)
984
+ if theirs:
985
+ container.layouts[graph_id] = theirs
858
986
  report.added_graphs.append(graph_id)
859
987
  report.added_nodes += len(list(incoming.nodes))
860
988
  report.added_edges += len(list(incoming.edges))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev30
3
+ Version: 1.6.0.dev32
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>
@@ -370,6 +370,7 @@ tests/test_composite_node_name.py
370
370
  tests/test_connection_resolver.py
371
371
  tests/test_consumer_drift.py
372
372
  tests/test_container.py
373
+ tests/test_container_layouts.py
373
374
  tests/test_containment_tpq.py
374
375
  tests/test_contract.py
375
376
  tests/test_contract_consumer.py
@@ -0,0 +1,63 @@
1
+ """One layout per graph in the em.json container (MICRO-OGNI-FILE-I-SUOI-GRAFI, F4).
2
+
3
+ The cases live in `tests/fixtures/container-layout-parity.json`, and EMStudio's
4
+ `check-container.mjs` reads a byte copy of the same file: the two readers and the
5
+ two writers of the container are held to ONE rule, case by case.
6
+ """
7
+
8
+ import json
9
+ import pathlib
10
+
11
+ import pytest
12
+
13
+ from s3dgraphy.container import (build_container, content_digest,
14
+ parse_container)
15
+
16
+ FIXTURE = pathlib.Path(__file__).parent / "fixtures" / "container-layout-parity.json"
17
+ CASES = json.loads(FIXTURE.read_text(encoding="utf-8"))["cases"]
18
+
19
+
20
+ @pytest.mark.parametrize("case", CASES, ids=[c["name"] for c in CASES])
21
+ def test_reading_gives_each_graph_its_own_layout(case):
22
+ container, warnings = parse_container(json.loads(json.dumps(case["doc"])))
23
+ assert container.layouts == case["expect"]["layouts"]
24
+ fresh = [w for w in warnings if "laid out afresh" in w]
25
+ if case["expect"]["fresh"]:
26
+ assert len(fresh) == 1, "said ONCE, not once per graph"
27
+ for gid in case["expect"]["fresh"]:
28
+ assert gid in fresh[0]
29
+ else:
30
+ assert fresh == []
31
+
32
+
33
+ @pytest.mark.parametrize("case", CASES, ids=[c["name"] for c in CASES])
34
+ def test_writing_puts_each_layout_in_its_section(case):
35
+ container, _ = parse_container(json.loads(json.dumps(case["doc"])))
36
+ doc = build_container(container)
37
+ for gid, want in case["built"]["members"].items():
38
+ assert doc["graphs"][gid].get("layout") == want, gid
39
+ assert doc.get("layout") == case["built"]["layout"]
40
+ # …and the round trip reads back what it wrote, with nothing left to say
41
+ again, warnings = parse_container(json.loads(json.dumps(doc)))
42
+ want_layouts = {g: l for g, l in case["built"]["members"].items() if l}
43
+ assert again.layouts == want_layouts
44
+ assert not [w for w in warnings if "laid out afresh" in w]
45
+
46
+
47
+ def test_moving_a_box_in_one_graph_is_not_a_new_version():
48
+ case = next(c for c in CASES if c["name"].startswith("new container"))
49
+ container, _ = parse_container(json.loads(json.dumps(case["doc"])))
50
+ first = content_digest(build_container(container))
51
+ container.layouts["a"] = {"positions": {"US1": {"x": 500, "y": 9, "w": 90, "h": 30}}}
52
+ assert content_digest(build_container(container)) == first
53
+
54
+
55
+ def test_the_convenience_layout_never_reaches_another_graph():
56
+ """`Container.layout` (what `export_emjson` sets) is the ACTIVE graph's."""
57
+ case = next(c for c in CASES if c["name"].startswith("no layout anywhere"))
58
+ container, _ = parse_container(json.loads(json.dumps(case["doc"])))
59
+ container.layout = {"positions": {"US1": {"x": 1, "y": 1, "w": 90, "h": 30}}}
60
+ doc = build_container(container)
61
+ assert doc["graphs"]["a"]["layout"] == container.layout
62
+ assert "layout" not in doc["graphs"]["b"]
63
+ assert doc["layout"] == container.layout
@@ -627,3 +627,113 @@ def test_a_long_wait_says_the_jobs_and_their_step(world):
627
627
  assert "linux done ✓" in out
628
628
  # not a terminal: a new line per change of state, not one per look
629
629
  assert out.count(f"▸ 2 · publish.yml for v{D}") <= 3
630
+
631
+
632
+ # ── the confirmations count down (E.D., 3 Oct 2026) ──────────────────────────
633
+ #
634
+ # On a FAKE TERMINAL (a pty: `isatty()` is true and keys arrive one at a time,
635
+ # as from a person): no key → yes at zero; «n» → stop; Enter → yes at once.
636
+
637
+ def _release_module():
638
+ import importlib.util
639
+ spec = importlib.util.spec_from_file_location("em_release", RELEASE)
640
+ mod = importlib.util.module_from_spec(spec)
641
+ spec.loader.exec_module(mod)
642
+ return mod
643
+
644
+
645
+ @pytest.fixture
646
+ def terminal():
647
+ pty = pytest.importorskip("pty") # noqa: F841 — POSIX only, like the countdown
648
+ import io
649
+ master, slave = os.openpty()
650
+ stdin = os.fdopen(slave, "rb", buffering=0)
651
+ out = io.StringIO()
652
+ yield master, stdin, out
653
+ stdin.close()
654
+ os.close(master)
655
+
656
+
657
+ def test_the_countdown_says_yes_at_zero(terminal):
658
+ import time
659
+ master, stdin, out = terminal
660
+ R = _release_module()
661
+ t0 = time.monotonic()
662
+ assert R.countdown_confirm("Push these 3 repositories?", 1, stdin=stdin, stdout=out) is True
663
+ assert time.monotonic() - t0 >= 0.9
664
+ said = out.getvalue()
665
+ assert "Push these 3 repositories? [Y/n] — yes in 1 s (n to stop)" in said
666
+ assert "yes (no answer in 1 s)" in said
667
+ assert "\r" in said # the same line, rewritten
668
+
669
+
670
+ def _press(master, key, after=0.3):
671
+ """a key, pressed while the question is counting (not before: those are thrown away)"""
672
+ import threading
673
+ threading.Timer(after, lambda: os.write(master, key)).start()
674
+
675
+
676
+ def test_the_countdown_stops_on_n(terminal):
677
+ master, stdin, out = terminal
678
+ R = _release_module()
679
+ _press(master, b"n")
680
+ assert R.countdown_confirm("Commit EMStudio?", 10, stdin=stdin, stdout=out) is False
681
+ assert out.getvalue().rstrip().endswith("— no\033[K")
682
+
683
+
684
+ def test_the_countdown_goes_at_once_on_enter(terminal):
685
+ import time
686
+ master, stdin, out = terminal
687
+ R = _release_module()
688
+ _press(master, b"\n")
689
+ t0 = time.monotonic()
690
+ assert R.countdown_confirm("Commit EMStudio?", 10, stdin=stdin, stdout=out) is True
691
+ assert time.monotonic() - t0 < 1.5
692
+ assert "— yes\033[K" in out.getvalue()
693
+
694
+
695
+ def test_the_countdown_gives_the_terminal_back(terminal):
696
+ import termios
697
+ master, stdin, out = terminal
698
+ R = _release_module()
699
+ before = termios.tcgetattr(stdin.fileno())
700
+ _press(master, b"y")
701
+ R.countdown_confirm("Go on?", 10, stdin=stdin, stdout=out)
702
+ after = termios.tcgetattr(stdin.fileno())
703
+ # PENDIN is the KERNEL's («input to reprint»), set by itself after a mode change
704
+ pendin = getattr(termios, "PENDIN", 0)
705
+ before[3] &= ~pendin
706
+ after[3] &= ~pendin
707
+ assert after == before
708
+
709
+
710
+ def test_a_key_pressed_before_the_question_is_not_an_answer(terminal):
711
+ master, stdin, out = terminal
712
+ R = _release_module()
713
+ os.write(master, b"n") # typed ahead, before anything was asked
714
+ assert R.countdown_confirm("Go on?", 1, stdin=stdin, stdout=out) is True
715
+ assert "yes (no answer in 1 s)" in out.getvalue()
716
+
717
+
718
+ def test_the_seconds_come_from_the_environment(monkeypatch):
719
+ R = _release_module()
720
+ monkeypatch.delenv("EM_RELEASE_CONFIRM_SECONDS", raising=False)
721
+ assert R.confirm_seconds() == 10
722
+ monkeypatch.setenv("EM_RELEASE_CONFIRM_SECONDS", "3")
723
+ assert R.confirm_seconds() == 3
724
+ monkeypatch.setenv("EM_RELEASE_CONFIRM_SECONDS", "0")
725
+ assert R.confirm_seconds() == 0
726
+ monkeypatch.setenv("EM_RELEASE_CONFIRM_SECONDS", "dieci")
727
+ assert R.confirm_seconds() == 10
728
+
729
+
730
+ def test_without_a_terminal_and_without_yes_nobody_says_yes(monkeypatch, capsys):
731
+ import io
732
+ R = _release_module()
733
+ c = R.Ctx(V, None, False, False, False)
734
+ monkeypatch.setattr(sys, "stdin", io.StringIO("")) # not a tty, nothing on it
735
+ assert c.ask("Push these 3 repositories?") is False
736
+ assert "stdin is not a terminal" in capsys.readouterr().out
737
+ monkeypatch.setattr(sys, "stdin", io.StringIO("y\n")) # a pipe that answers: as before
738
+ assert c.ask("Push these 3 repositories?") is True
739
+ assert R.Ctx(V, None, False, False, True).ask("anything?") is True # --yes
File without changes