s3dgraphy 1.6.0.dev46__tar.gz → 1.6.0.dev47__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 (552) hide show
  1. {s3dgraphy-1.6.0.dev46/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev47}/PKG-INFO +1 -1
  2. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/pyproject.toml +1 -1
  3. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/__init__.py +1 -1
  4. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/api.py +62 -0
  5. s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/alignment.py +273 -0
  6. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/locate.py +14 -3
  7. s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/moved.py +149 -0
  8. s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/object_store.py +174 -0
  9. s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/storage_rows.py +163 -0
  10. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
  11. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/SOURCES.txt +6 -0
  12. s3dgraphy-1.6.0.dev47/tests/test_bucket_alignment.py +108 -0
  13. s3dgraphy-1.6.0.dev47/tests/test_storage_rows.py +77 -0
  14. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/LICENSE +0 -0
  15. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/MANIFEST.in +0 -0
  16. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/README.md +0 -0
  17. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/setup.cfg +0 -0
  18. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  19. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  20. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  21. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  22. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
  23. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  24. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  25. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  26. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  27. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  28. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  29. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_state_symbols.json +0 -0
  30. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
  31. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  32. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  33. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
  34. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  35. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  36. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  37. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  38. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
  39. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  40. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  41. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  42. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  43. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  44. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  45. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  46. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  47. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  48. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  49. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  50. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  51. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  52. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  53. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  54. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  55. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  56. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  57. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  58. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  59. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  60. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  61. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  62. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  63. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  64. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  65. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  66. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  67. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  68. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  69. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/container.svg +0 -0
  70. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  71. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  72. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  73. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  74. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  75. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  76. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  77. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  78. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  79. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  80. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  81. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  82. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  83. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  84. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  85. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  86. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  87. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  88. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  89. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  90. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  91. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  92. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  93. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  94. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  95. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  96. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  97. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  98. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  99. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  100. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  101. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  102. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  103. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  104. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  105. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  106. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  107. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  108. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  109. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  110. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  111. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  112. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  113. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  114. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  115. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  116. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  117. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/proxy.svg +0 -0
  118. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  119. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  120. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  121. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  122. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  123. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  124. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  125. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  126. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  127. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  128. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  129. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  130. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/tileset.svg +0 -0
  131. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_gltf.svg +0 -0
  132. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_mesh.svg +0 -0
  133. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_scene.svg +0 -0
  134. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_tiles.svg +0 -0
  135. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  136. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  137. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  138. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  139. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  140. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  141. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  142. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  143. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  144. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  145. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  146. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  147. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  148. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  149. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  150. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  151. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/version_for_cases.json +0 -0
  152. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/__init__.py +0 -0
  153. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/acquire.py +0 -0
  154. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  155. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/mapping.py +0 -0
  156. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/ai_validation.py +0 -0
  157. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/__init__.py +0 -0
  158. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  159. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/paradata.py +0 -0
  160. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/reading.py +0 -0
  161. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/__init__.py +0 -0
  162. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/resolver.py +0 -0
  163. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  164. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  165. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  166. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  167. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  168. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  169. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/classification.py +0 -0
  170. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/container.py +0 -0
  171. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/__init__.py +0 -0
  172. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/connector.py +0 -0
  173. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/consumer.py +0 -0
  174. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/core.py +0 -0
  175. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/reference.py +0 -0
  176. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/crdt.py +0 -0
  177. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  178. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/datamodel.py +0 -0
  179. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/diagnostics.py +0 -0
  180. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dissemination.py +0 -0
  181. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/__init__.py +0 -0
  182. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/capture.py +0 -0
  183. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/corpus.py +0 -0
  184. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/devices.py +0 -0
  185. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/ingest.py +0 -0
  186. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  187. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/residency.py +0 -0
  188. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/__init__.py +0 -0
  189. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  190. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/connections_loader.py +0 -0
  191. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/edge.py +0 -0
  192. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/editorial.py +0 -0
  193. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/__init__.py +0 -0
  194. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  195. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  196. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  197. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  198. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  199. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  200. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  201. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  202. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  203. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  204. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  205. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  206. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  207. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  208. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  209. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  210. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  211. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  212. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  213. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  214. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  215. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
  216. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  217. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/__init__.py +0 -0
  218. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/aton.py +0 -0
  219. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/gltf.py +0 -0
  220. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/migrate.py +0 -0
  221. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/proxy.py +0 -0
  222. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  223. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/store_backed.py +0 -0
  224. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/wkt.py +0 -0
  225. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/graph.py +0 -0
  226. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/hdto.py +0 -0
  227. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/iiif.py +0 -0
  228. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/__init__.py +0 -0
  229. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/base_importer.py +0 -0
  230. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/csv_importer.py +0 -0
  231. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  232. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  233. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/import_graphml.py +0 -0
  234. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  235. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/metashape_project.py +0 -0
  236. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  237. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  238. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  239. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/sheet_header.py +0 -0
  240. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/source_text.py +0 -0
  241. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  242. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  243. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/xml_importer.py +0 -0
  244. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/indices.py +0 -0
  245. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/labels.py +0 -0
  246. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/language.py +0 -0
  247. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/links.py +0 -0
  248. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/__init__.py +0 -0
  249. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/authoring.py +0 -0
  250. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  251. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  252. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  253. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  254. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  255. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/registry.py +0 -0
  256. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +0 -0
  257. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  258. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  259. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  260. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/merge/__init__.py +0 -0
  261. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/merge/graph_merger.py +0 -0
  262. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/multigraph/__init__.py +0 -0
  263. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  264. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/__init__.py +0 -0
  265. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/bake.py +0 -0
  266. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/generation.py +0 -0
  267. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/query.py +0 -0
  268. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/registry.py +0 -0
  269. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/site_story.py +0 -0
  270. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/__init__.py +0 -0
  271. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/author_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/base_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/document_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/graph_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/group_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  289. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/license_node.py +0 -0
  290. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  291. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  292. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/project_node.py +0 -0
  293. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/property_node.py +0 -0
  294. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/representation_node.py +0 -0
  295. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  296. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/resource_node.py +0 -0
  297. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  298. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  299. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/study_node.py +0 -0
  300. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/translation_node.py +0 -0
  301. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/ownership.py +0 -0
  302. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/paradata_view.py +0 -0
  303. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  304. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  305. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/project_tree.py +0 -0
  306. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/property_source.py +0 -0
  307. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/publication.py +0 -0
  308. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/rapporti.py +0 -0
  309. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/__init__.py +0 -0
  310. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  311. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  312. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/__init__.py +0 -0
  313. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/addresses.py +0 -0
  314. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/files.py +0 -0
  315. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/fs_backend.py +0 -0
  316. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/minio_backend.py +0 -0
  317. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/resolver.py +0 -0
  318. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  319. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/versions.py +0 -0
  320. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/rights.py +0 -0
  321. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/shelf/__init__.py +0 -0
  322. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/shelf/core.py +0 -0
  323. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/spatiotemporal.py +0 -0
  324. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/__init__.py +0 -0
  325. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/absorb.py +0 -0
  326. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/emit.py +0 -0
  327. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/hints.py +0 -0
  328. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/identity.py +0 -0
  329. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/study.py +0 -0
  330. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/__init__.py +0 -0
  331. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_db_handle.py +0 -0
  332. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  333. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_workspace.py +0 -0
  334. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  335. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/edge_registry.py +0 -0
  336. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  337. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graph_projector.py +0 -0
  338. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  339. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/group_projector.py +0 -0
  340. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/group_store.py +0 -0
  341. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/ingest_result.py +0 -0
  342. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/paradata_store.py +0 -0
  343. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  344. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/rapporti.py +0 -0
  345. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/uuid7.py +0 -0
  346. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  347. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/vocab_types.py +0 -0
  348. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  349. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_detector.py +0 -0
  350. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  351. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  352. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  353. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  354. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  355. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  356. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/temporal/__init__.py +0 -0
  357. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  358. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/__init__.py +0 -0
  359. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  360. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  361. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  362. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  363. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  364. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/node_finder.py +0 -0
  365. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  366. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  367. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/__init__.py +0 -0
  368. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  369. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/compact.py +0 -0
  370. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  371. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/translation.py +0 -0
  372. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/__init__.py +0 -0
  373. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/utils.py +0 -0
  374. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/visual_layout.py +0 -0
  375. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/zero_hour.py +0 -0
  376. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  377. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/requires.txt +0 -0
  378. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  379. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_acquisition.py +0 -0
  380. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_acquisition_fs.py +0 -0
  381. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_add_resource.py +0 -0
  382. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ai_validation_nodes.py +0 -0
  383. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_alternative_labels.py +0 -0
  384. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_api_surface.py +0 -0
  385. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_asset_dtc_protocol.py +0 -0
  386. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_asset_versions.py +0 -0
  387. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_aton_shapes.py +0 -0
  388. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_attach_only.py +0 -0
  389. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_authority_projection.py +0 -0
  390. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_authority_resolver.py +0 -0
  391. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_blend_locator.py +0 -0
  392. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_canonical_document_rename.py +0 -0
  393. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_canvas_metadata_import.py +0 -0
  394. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_capture_acquisition.py +0 -0
  395. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_capture_rdf_class.py +0 -0
  396. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_chronology_on_request.py +0 -0
  397. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_coating_unit.py +0 -0
  398. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_composite_node_name.py +0 -0
  399. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_connection_resolver.py +0 -0
  400. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_consumer_drift.py +0 -0
  401. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_container.py +0 -0
  402. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_container_layouts.py +0 -0
  403. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_containment_tpq.py +0 -0
  404. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_contract.py +0 -0
  405. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_contract_consumer.py +0 -0
  406. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_convert_command.py +0 -0
  407. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_crdt.py +0 -0
  408. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_cycle_message_is_cheap.py +0 -0
  409. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_datamodel_fingerprint.py +0 -0
  410. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_datamodel_i18n.py +0 -0
  411. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_deterministic_ids.py +0 -0
  412. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_em_sourcelist.py +0 -0
  413. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_file_set_stamp.py +0 -0
  414. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_graphml_without_a_database.py +0 -0
  415. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_image_set_texturing.py +0 -0
  416. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_not_georeferenced.py +0 -0
  417. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_one_act_n_outputs.py +0 -0
  418. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_ttl_round_trip.py +0 -0
  419. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev30_decisions.py +0 -0
  420. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_devices.py +0 -0
  421. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dissemination_tombstones.py +0 -0
  422. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dove_sta_il_testo.py +0 -0
  423. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_corpus.py +0 -0
  424. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_ingest.py +0 -0
  425. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_neighbourhood.py +0 -0
  426. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_projection.py +0 -0
  427. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_residency.py +0 -0
  428. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_edge_outside_graph.py +0 -0
  429. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_edge_ui_phrases.py +0 -0
  430. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_editorial.py +0 -0
  431. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
  432. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_no_drawing_keys.py +0 -0
  433. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_roundtrip.py +0 -0
  434. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_schema_version.py +0 -0
  435. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  436. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_epoch_undated_import.py +0 -0
  437. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_explicit_node_type_marker.py +0 -0
  438. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_extracted_from_unit.py +0 -0
  439. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_filtered_import.py +0 -0
  440. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_fmpxml_importer.py +0 -0
  441. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_fs_backend.py +0 -0
  442. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_functional_units.py +0 -0
  443. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_georeference_scene.py +0 -0
  444. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_gltf_stitch.py +0 -0
  445. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_glyph_paths.py +0 -0
  446. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_header_code.py +0 -0
  447. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_helpers_indexed.py +0 -0
  448. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_indices_alive.py +0 -0
  449. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_indices_edges.py +0 -0
  450. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_scope_migration.py +0 -0
  451. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_hdto_projection.py +0 -0
  452. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_hdto_study.py +0 -0
  453. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_header_key_aliases.py +0 -0
  454. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_i_generi_dei_passi.py +0 -0
  455. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_iiif.py +0 -0
  456. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_modo_d_accesso.py +0 -0
  457. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_modo_dal_relay.py +0 -0
  458. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_proprietario_si_legge.py +0 -0
  459. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_riallineamento.py +0 -0
  460. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_importer_edge_hygiene.py +0 -0
  461. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ipynb_exporter.py +0 -0
  462. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_issue27_small_points.py +0 -0
  463. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_alla_nascita.py +0 -0
  464. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_dei_dati.py +0 -0
  465. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_nell_op.py +0 -0
  466. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_riga_d_intestazione.py +0 -0
  467. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_latex_exporter.py +0 -0
  468. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_le_traduzioni.py +0 -0
  469. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_lod_levels.py +0 -0
  470. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_lossless_roundtrip.py +0 -0
  471. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_mapping_authoring.py +0 -0
  472. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_mapping_csv_and_relations.py +0 -0
  473. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_masonry_unit.py +0 -0
  474. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_material_color.py +0 -0
  475. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_merge_conflicts.py +0 -0
  476. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_metashape_project.py +0 -0
  477. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_migrate_legacy_proxy.py +0 -0
  478. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_minio_backend.py +0 -0
  479. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_authorship.py +0 -0
  480. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_bake_docx.py +0 -0
  481. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_figures.py +0 -0
  482. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_generation.py +0 -0
  483. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_mentions.py +0 -0
  484. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_node.py +0 -0
  485. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_query.py +0 -0
  486. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_scaffolder.py +0 -0
  487. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_site_place.py +0 -0
  488. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_unvalidated_export.py +0 -0
  489. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_datamodel_registry.py +0 -0
  490. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_finder.py +0 -0
  491. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_type_map_integrity.py +0 -0
  492. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_one_resolver.py +0 -0
  493. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_one_spelling_writers.py +0 -0
  494. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_op_vocabulary.py +0 -0
  495. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_pg_importer.py +0 -0
  496. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_photogrammetry_delta.py +0 -0
  497. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_physical_relation_spellings.py +0 -0
  498. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_piu_indirizzi.py +0 -0
  499. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_promotion.py +0 -0
  500. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_property_as_source.py +0 -0
  501. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_property_owners.py +0 -0
  502. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_proxy_resource.py +0 -0
  503. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_proxy_retype.py +0 -0
  504. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_psx_locator.py +0 -0
  505. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_pyarchinit_tier2.py +0 -0
  506. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_qualia_dai_d7_d8.py +0 -0
  507. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_embedding.py +0 -0
  508. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_reverse_edges.py +0 -0
  509. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_roundtrip.py +0 -0
  510. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_coords.py +0 -0
  511. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_glb.py +0 -0
  512. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_migration.py +0 -0
  513. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_place.py +0 -0
  514. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_rdf.py +0 -0
  515. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_recompute_warnings.py +0 -0
  516. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_release.py +0 -0
  517. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reproject.py +0 -0
  518. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_file_node.py +0 -0
  519. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_files_implicit.py +0 -0
  520. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_layer.py +0 -0
  521. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_representations.py +0 -0
  522. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_revision.py +0 -0
  523. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_tier.py +0 -0
  524. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reverse_edges.py +0 -0
  525. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rm_container_node_group.py +0 -0
  526. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_semantic_purity.py +0 -0
  527. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf.py +0 -0
  528. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_facets.py +0 -0
  529. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_hatting.py +0 -0
  530. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_role_uri_table.py +0 -0
  531. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shipped_mappings.py +0 -0
  532. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_source_list_mapping.py +0 -0
  533. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_source_text.py +0 -0
  534. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_spatiotemporal_entities.py +0 -0
  535. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stable_study_code.py +0 -0
  536. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp.py +0 -0
  537. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp_hints.py +0 -0
  538. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp_title_description.py +0 -0
  539. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_store_backed_geometry.py +0 -0
  540. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stratiminer_api.py +0 -0
  541. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_study_metadata.py +0 -0
  542. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_tileset_resource.py +0 -0
  543. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ttl_roundtrip.py +0 -0
  544. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_unit_definition.py +0 -0
  545. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_verifica_provenance.py +0 -0
  546. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_version_for.py +0 -0
  547. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_visual_assets.py +0 -0
  548. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_wheel_drift.py +0 -0
  549. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  550. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_importer_graph_init.py +0 -0
  551. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_source_column.py +0 -0
  552. {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/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.dev46
3
+ Version: 1.6.0.dev47
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.dev46"
7
+ version = "1.6.0.dev47"
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.dev46"
1
+ __version__ = "1.6.0.dev47"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -3058,6 +3058,68 @@ def resolve_file(entry: Dict[str, Any], **kwargs) -> Dict[str, Any]:
3058
3058
  return resolve(entry, **kwargs)
3059
3059
 
3060
3060
 
3061
+ # ── S1 · the Storage list and «find moved» (E.D., 11 Oct 2026) ────────────────
3062
+ def storage_rows(graph: Graph, results: Sequence[Dict[str, Any]],
3063
+ graph_name: str = "") -> List[Dict[str, Any]]:
3064
+ """The files of ``graph`` as ONE list: master, versions by computed level,
3065
+ files of a set, links of a document — with uses, tier, document, the RMs
3066
+ that use each, and its state. ``results`` is :func:`resolve_files`. EMtools
3067
+ and EMStudio draw these rows. See :mod:`s3dgraphy.resources.storage_rows`."""
3068
+ from .resources.storage_rows import storage_rows as _rows
3069
+ return _rows(graph, list(results), graph_name)
3070
+
3071
+
3072
+ def find_moved_files(graph: Graph, results: Sequence[Dict[str, Any]],
3073
+ folders: Sequence[str], **kwargs) -> List[Dict[str, Any]]:
3074
+ """For the files that are ``missing`` (or an empty copy), the candidates found
3075
+ in ``folders`` — by sha256, then by name and size — each saying HOW it was
3076
+ recognised. Proposes only: nothing is changed. See
3077
+ :mod:`s3dgraphy.resources.moved`."""
3078
+ from .resources.moved import find_moved
3079
+ return find_moved(graph, list(results), folders, **kwargs)
3080
+
3081
+
3082
+ # ── B1 · disk ↔ bucket: the two copies, and what may be let go (E.D., 11 Oct 2026) ──
3083
+ def open_object_store(name: Optional[str] = None, config: Any = None):
3084
+ """The object store of the Resource layer — any S3-compatible one (MinIO
3085
+ today). ``S3_*`` environment, ``EM_OBJECT_STORE`` to choose another
3086
+ implementation (:func:`s3dgraphy.resources.object_store.register_store`)."""
3087
+ from .resources.object_store import open_store
3088
+ return open_store(name, config)
3089
+
3090
+
3091
+ def bucket_alignment(graph: Graph, results: Sequence[Dict[str, Any]], store: Any = None, *,
3092
+ deep: bool = False, **kwargs) -> List[Dict[str, Any]]:
3093
+ """How the disk copy and the bucket copy of each file stand: ``aligned`` (the
3094
+ sha256 of both, read now), ``same_size``, ``differ``, ``disk_only``,
3095
+ ``bucket_only``, ``neither``, ``unknown``. Reads only. See
3096
+ :mod:`s3dgraphy.resources.alignment`."""
3097
+ from .resources.alignment import bucket_alignment as _al
3098
+ return _al(graph, list(results), store or open_object_store(), deep=deep, **kwargs)
3099
+
3100
+
3101
+ def plan_free_local(graph: Graph, aligned: Sequence[Dict[str, Any]], **kwargs) -> List[Dict[str, Any]]:
3102
+ """The files whose local copy may be freed (aligned, verified): ``safe`` for a
3103
+ distribution, ``confirm`` for a master or an original, each with its warning."""
3104
+ from .resources.alignment import free_plan
3105
+ return free_plan(graph, list(aligned), **kwargs)
3106
+
3107
+
3108
+ def free_local_copies(plan: Sequence[Dict[str, Any]], store: Any = None, **kwargs) -> List[Dict[str, Any]]:
3109
+ """Free the local copies of a plan: the bytes are compared again just before
3110
+ each one leaves; moved to a quarantine folder, or deleted with
3111
+ ``permanent=True``; a master only with ``confirm_masters=True``."""
3112
+ from .resources.alignment import free_local
3113
+ return free_local(list(plan), store or open_object_store(), **kwargs)
3114
+
3115
+
3116
+ def promote_to_bucket(graph: Graph, resource_id: str, path: str, store: Any = None, **kwargs) -> Dict[str, Any]:
3117
+ """Upload, READ BACK and verify, then record the bucket as the primary address
3118
+ and keep the disk path as an address too."""
3119
+ from .resources.alignment import promote_verified
3120
+ return promote_verified(graph, resource_id, path, store or open_object_store(), **kwargs)
3121
+
3122
+
3061
3123
  # ── C1 · the standard tree of an EM project (E.D., 4 Oct 2026) ─────────────────
3062
3124
  def create_em_project(parent: str, name: str, **kwargs) -> Dict[str, Any]:
3063
3125
  """«New EM project…»: EM/ (DosCo/, proxies/), RB/, SB/, RM/, README.md,
@@ -0,0 +1,273 @@
1
+ """Disk ↔ bucket · are the two copies the same bytes, and what may be let go.
2
+
3
+ A resource may live on the disk and in the bucket at once (two addresses of ONE
4
+ resource, :mod:`s3dgraphy.resources.addresses`). This says, for each file, how
5
+ the two stand — and plans, and carries out, the freeing of the local copy once
6
+ the bucket holds it.
7
+
8
+ ALIGNMENT, per file (``bucket_alignment``):
9
+
10
+ * ``aligned`` — on both, and the sha256 of the bucket's bytes is the disk
11
+ file's (read this time: the only state that is a proof);
12
+ * ``same_size`` — on both, same size, digests not compared (the light check);
13
+ * ``differ`` — on both and NOT the same: another size, or another sha256.
14
+ Stop and look: neither copy is to be trusted over the other
15
+ without a date;
16
+ * ``disk_only`` — on the disk; the bucket has no object for it;
17
+ * ``bucket_only``— in the bucket; no copy on this computer;
18
+ * ``neither`` — recorded in the bucket, not found there, not on the disk;
19
+ * ``unknown`` — the store did not answer, or there is nothing to compare.
20
+
21
+ FREEING (``free_plan`` → ``free_local``): only an ``aligned`` file can be freed,
22
+ and the bytes are compared AGAIN right before anything leaves the disk — a check
23
+ of yesterday is not a check. A DISTRIBUTION (a LOD, a GLB for the web) is remade
24
+ from its master: freeing it costs a button. A MASTER, an untiered resource and
25
+ the original documents are NOT remade by anybody: they are freed only on an
26
+ explicit confirm, and the plan says how many OTHER independent copies the graph
27
+ knows. By default the file is moved to a quarantine folder (reversible);
28
+ ``permanent=True`` deletes it. Nothing is written into the graph here except
29
+ what ``promote_verified`` records.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import os
35
+ import shutil
36
+ from typing import Any, Callable, Dict, Iterable, List, Optional
37
+
38
+ from .addresses import addresses, _write
39
+ from .locate import entries_of, sha256_hex
40
+ from .object_store import ObjectStore, StoreError
41
+
42
+ STATES = ("aligned", "same_size", "differ", "disk_only", "bucket_only", "neither", "unknown")
43
+ SURE = ("aligned",)
44
+
45
+
46
+ def _sha256_file(path: str) -> str:
47
+ import hashlib
48
+ h = hashlib.sha256()
49
+ with open(path, "rb") as fh:
50
+ for chunk in iter(lambda: fh.read(1 << 20), b""):
51
+ h.update(chunk)
52
+ return h.hexdigest()
53
+
54
+
55
+ def _tier_and_copies(graph, node_id: str, nodes, set_of):
56
+ node = nodes.get(node_id)
57
+ d = getattr(node, "data", None) or {}
58
+ owner = nodes.get(set_of.get(node_id)) if set_of.get(node_id) else None
59
+ od = getattr(owner, "data", None) or {}
60
+ return str(d.get("tier") or od.get("tier") or "")
61
+
62
+
63
+ def _bucket_locator(node, store: ObjectStore) -> Optional[str]:
64
+ for a in addresses(node):
65
+ if store.key_of(a["locator"]) is not None:
66
+ return a["locator"]
67
+ return None
68
+
69
+
70
+ def bucket_alignment(graph, results: List[Dict[str, Any]], store: ObjectStore, *,
71
+ deep: bool = False, hasher: Optional[Callable[[str], str]] = None,
72
+ only: Optional[Iterable[str]] = None) -> List[Dict[str, Any]]:
73
+ """For every resource that is on the disk or has a bucket address, how the
74
+ two stand. ``results`` is what ``resolve_files`` answered (its ``path`` is
75
+ the disk copy). ``deep`` reads the bucket's bytes and compares the sha256;
76
+ without it only existence and size are compared (no bytes leave the store).
77
+ ``only`` limits the check to some resource ids. Reads only."""
78
+ hasher = hasher or _sha256_file
79
+ wanted = set(only) if only is not None else None
80
+ nodes = {n.node_id: n for n in getattr(graph, "nodes", [])}
81
+ set_of = {e.edge_target: e.edge_source for e in getattr(graph, "edges", [])
82
+ if e.edge_type == "has_file"}
83
+ by_id = {r["id"]: r for r in results}
84
+ out: List[Dict[str, Any]] = []
85
+ for e in entries_of(graph):
86
+ rid = e["id"]
87
+ if wanted is not None and rid not in wanted:
88
+ continue
89
+ node = nodes.get(rid)
90
+ r = by_id.get(rid) or {}
91
+ path = r.get("path") or ""
92
+ on_disk = bool(path) and os.path.isfile(path)
93
+ loc = _bucket_locator(node, store)
94
+ if not on_disk and not loc:
95
+ continue
96
+ row = {"id": rid, "name": e["name"], "path": path if on_disk else "",
97
+ "bucket": loc or "", "key": store.key_of(loc) if loc else "",
98
+ "tier": _tier_and_copies(graph, rid, nodes, set_of),
99
+ "size_disk": os.path.getsize(path) if on_disk else None,
100
+ "size_bucket": None, "sha256": sha256_hex(r.get("sha256") or e["checksum"]),
101
+ "state": "unknown", "note": "", "verified": False}
102
+ if not loc:
103
+ row["state"], row["note"] = "disk_only", "the graph records no bucket copy"
104
+ out.append(row)
105
+ continue
106
+ try:
107
+ st = store.stat(row["key"])
108
+ except StoreError as exc:
109
+ row["note"] = str(exc)
110
+ out.append(row)
111
+ continue
112
+ if st is None:
113
+ row["state"] = "disk_only" if on_disk else "neither"
114
+ row["note"] = "the graph says the bucket has it; the object is not there"
115
+ out.append(row)
116
+ continue
117
+ row["size_bucket"] = st["size"]
118
+ if not on_disk:
119
+ row["state"] = "bucket_only"
120
+ out.append(row)
121
+ continue
122
+ if st["size"] != row["size_disk"]:
123
+ row["state"], row["note"] = "differ", "not the same size"
124
+ out.append(row)
125
+ continue
126
+ row["state"] = "same_size"
127
+ if deep:
128
+ try:
129
+ theirs = store.sha256(row["key"])
130
+ mine = hasher(path)
131
+ except (StoreError, OSError) as exc:
132
+ row["note"] = str(exc)
133
+ out.append(row)
134
+ continue
135
+ row["sha256"] = mine
136
+ if theirs == mine:
137
+ row["state"], row["verified"] = "aligned", True
138
+ else:
139
+ row["state"], row["note"] = "differ", "same size, not the same bytes"
140
+ out.append(row)
141
+ return out
142
+
143
+
144
+ def free_plan(graph, aligned: List[Dict[str, Any]], *, protect: Iterable[str] = ()) -> List[Dict[str, Any]]:
145
+ """What may be freed from the rows ``bucket_alignment`` gave (only the
146
+ ``aligned`` ones; run it with ``deep=True``). Each item: ``{id, name, path,
147
+ size, level, warning, copies}`` — ``level`` is ``safe`` (a distribution: it
148
+ is remade from its master) or ``confirm`` (a master, an untiered resource,
149
+ a document: nobody remakes it). ``copies`` counts the OTHER addresses the
150
+ graph records (not this disk path, not the bucket). ``protect`` lists
151
+ folders whose files are never planned (the cache, a project's ``.em_cache``)."""
152
+ nodes = {n.node_id: n for n in getattr(graph, "nodes", [])}
153
+ keep = [os.path.abspath(p) for p in protect if p]
154
+ plan = []
155
+ for r in aligned:
156
+ if r["state"] != "aligned" or not r["path"]:
157
+ continue
158
+ if any(os.path.abspath(r["path"]).startswith(k + os.sep) for k in keep):
159
+ continue
160
+ others = [a for a in addresses(nodes.get(r["id"]))
161
+ if a["locator"] != r["bucket"] and os.path.abspath(a["locator"]) != os.path.abspath(r["path"])
162
+ and a.get("ok") is not False]
163
+ distribution = r["tier"] == "distribution"
164
+ warning = ("" if distribution else
165
+ ("This is a MASTER or an original: nobody can remake it. "
166
+ if r["tier"] == "master" else
167
+ "This is an original (not a derived version): nobody can remake it. ")
168
+ + (f"The graph knows {len(others)} other copy(ies)." if others else
169
+ "The graph knows NO other copy than the bucket's."))
170
+ plan.append({"id": r["id"], "name": r["name"], "path": r["path"],
171
+ "size": r["size_disk"] or 0, "level": "safe" if distribution else "confirm",
172
+ "warning": warning, "copies": len(others), "bucket": r["bucket"],
173
+ "key": r["key"]})
174
+ return plan
175
+
176
+
177
+ def free_local(plan: List[Dict[str, Any]], store: ObjectStore, *, confirm_masters: bool = False,
178
+ permanent: bool = False, quarantine: str = "",
179
+ hasher: Optional[Callable[[str], str]] = None) -> List[Dict[str, Any]]:
180
+ """Carry the plan out. For EVERY file the bucket's sha256 and the disk
181
+ file's are compared again just before it leaves; a difference, an error or
182
+ a missing object refuses that file and touches nothing. ``confirm`` items
183
+ are skipped unless ``confirm_masters``. The file is moved into
184
+ ``quarantine`` (kept relative to its own folder's name, never overwriting),
185
+ or deleted when ``permanent``. Returns ``[{id, path, action, reason,
186
+ bytes}]`` with action ``freed`` | ``quarantined`` | ``refused`` | ``skipped``."""
187
+ hasher = hasher or _sha256_file
188
+ report = []
189
+
190
+ def rec(item, action, reason="", moved_to=""):
191
+ report.append({"id": item["id"], "path": item["path"], "action": action,
192
+ "reason": reason, "bytes": item["size"] if action in ("freed", "quarantined") else 0,
193
+ "moved_to": moved_to})
194
+
195
+ for item in plan:
196
+ path = item["path"]
197
+ if item["level"] == "confirm" and not confirm_masters:
198
+ rec(item, "skipped", "a master or an original: it needs your explicit confirm")
199
+ continue
200
+ if not os.path.isfile(path):
201
+ rec(item, "refused", "the file is not on the disk any more")
202
+ continue
203
+ try:
204
+ st = store.stat(item["key"])
205
+ if st is None:
206
+ rec(item, "refused", "the bucket does not have the object")
207
+ continue
208
+ theirs, mine = store.sha256(item["key"]), hasher(path)
209
+ except (StoreError, OSError) as exc:
210
+ rec(item, "refused", f"could not verify: {exc}")
211
+ continue
212
+ if theirs != mine:
213
+ rec(item, "refused", "the bytes of the bucket are not the disk file's: nothing was touched")
214
+ continue
215
+ try:
216
+ if permanent:
217
+ os.remove(path)
218
+ rec(item, "freed")
219
+ else:
220
+ if not quarantine:
221
+ rec(item, "refused", "no quarantine folder given")
222
+ continue
223
+ os.makedirs(quarantine, exist_ok=True)
224
+ dest = os.path.join(quarantine, os.path.basename(path))
225
+ n = 1
226
+ while os.path.exists(dest):
227
+ n += 1
228
+ stem, ext = os.path.splitext(os.path.basename(path))
229
+ dest = os.path.join(quarantine, f"{stem}.{n}{ext}")
230
+ shutil.move(path, dest)
231
+ rec(item, "quarantined", moved_to=dest)
232
+ except OSError as exc:
233
+ rec(item, "refused", f"could not remove it: {exc}")
234
+ return report
235
+
236
+
237
+ def promote_verified(graph, resource_id: str, path: str, store: ObjectStore, *,
238
+ hasher: Optional[Callable[[str], str]] = None) -> Dict[str, Any]:
239
+ """Upload ``path`` to the bucket under the resource's own id, READ IT BACK
240
+ and compare the sha256, and only then record the bucket as an address of the
241
+ resource — keeping the disk copy as an address too (the older promotion
242
+ replaced ``data.url`` and the disk path was lost). The bucket address becomes
243
+ the primary (``data.url``: what Heriverse reads); the disk path stays in
244
+ ``data.addresses`` as ``resident``. Refuses, writing nothing, when the bytes
245
+ read back are not the file's."""
246
+ node = graph.find_node_by_id(resource_id)
247
+ if node is None:
248
+ raise ValueError(f"no resource {resource_id!r}")
249
+ hasher = hasher or _sha256_file
250
+ if not os.path.isfile(path):
251
+ raise ValueError(f"{path!r} is not a file")
252
+ key = store.key_for(resource_id, os.path.basename(path))
253
+ store.put(path, key)
254
+ mine, theirs = hasher(path), store.sha256(key)
255
+ if mine != theirs:
256
+ raise StoreError(f"the bucket's bytes are not the file's after the upload "
257
+ f"({theirs[:12]}… ≠ {mine[:12]}…): nothing was recorded")
258
+ data = node.data if isinstance(getattr(node, "data", None), dict) else {}
259
+ node.data = data
260
+ data.setdefault("checksum", "sha256:" + mine)
261
+ bucket = store.locator(key)
262
+ current = addresses(node)
263
+ # the disk path is recorded unless the resource already has a local address
264
+ disk = path if not any("://" not in a["locator"] for a in current) else None
265
+ entries = [{"locator": bucket, "residency": "resident"}]
266
+ for a in current:
267
+ if a["locator"] != bucket:
268
+ entries.append({k: v for k, v in a.items() if k != "primary"})
269
+ if disk:
270
+ entries.append({"locator": path, "residency": "resident"})
271
+ data["url"] = bucket
272
+ _write(node, entries)
273
+ return {"id": resource_id, "key": key, "bucket": bucket, "sha256": mine}
@@ -171,15 +171,24 @@ def resolve(entry: Dict[str, Any], *, project_root: Optional[str] = None,
171
171
  look = parsed[0] if parsed else ""
172
172
  elif locator.startswith("psx://"):
173
173
  look = ""
174
- if not path and look and not remote and not look.startswith(("blend://", "psx://")):
175
- for cand in local_candidates(look, bases):
174
+ # a resource may have SEVERAL addresses of the same bytes (the disk and the
175
+ # bucket): when the primary is not a local one, a local address is tried too
176
+ cand_look = "" if remote else look
177
+ if not cand_look:
178
+ for other in entry.get("addresses") or ():
179
+ o = str(other or "")
180
+ if o and o != locator and not o.lower().startswith(_REMOTE + ("blend://", "psx://")):
181
+ cand_look = o
182
+ break
183
+ if not path and cand_look and not cand_look.startswith(("blend://", "psx://")):
184
+ for cand in local_candidates(cand_look, bases):
176
185
  if os.path.isfile(cand) or os.path.isdir(cand):
177
186
  if os.path.isfile(cand) and is_empty_copy(cand):
178
187
  empty = empty or cand
179
188
  continue
180
189
  path = cand
181
190
  break
182
- positions.append({"kind": "path", "where": path or empty or locator,
191
+ positions.append({"kind": "path", "where": path or empty or cand_look,
183
192
  "ok": bool(path)})
184
193
  elif locator.startswith(("blend://", "psx://")) and not look:
185
194
  positions.append({"kind": "path", "where": locator, "ok": None})
@@ -236,6 +245,8 @@ def entries_of(graph: Any) -> List[Dict[str, Any]]:
236
245
  out.append({"id": node.node_id, "name": str(getattr(node, "name", "") or ""),
237
246
  "node_type": node.node_type,
238
247
  "locator": str(data.get("url") or getattr(node, "url", "") or ""),
248
+ "addresses": [str(a["locator"]) for a in (data.get("addresses") or [])
249
+ if isinstance(a, dict) and a.get("locator")],
239
250
  "checksum": data.get("checksum") or ""})
240
251
  return out
241
252
 
@@ -0,0 +1,149 @@
1
+ """Find moved · where did the files that are not here any more go?
2
+
3
+ A file the graph points at can be «missing» because the folder was renamed, the
4
+ project copied to another disk, a DosCo reordered. The identity of the file did
5
+ not change: its sha256 (when the graph has it), its size and its name. This
6
+ looks for it in the folders it is given and PROPOSES — it never changes the
7
+ graph and never moves a byte; the tool that calls it shows the candidates and
8
+ the person says yes (the relink is the one ``Find here…`` already makes).
9
+
10
+ Each candidate says HOW it was recognised, from the surest:
11
+
12
+ * ``exact`` — the same name and the same sha256;
13
+ * ``exact_renamed`` — another name, the same sha256 (the bytes are the file's);
14
+ * ``probable`` — the same name and the same size, the graph has no sha256;
15
+ * ``possible`` — the same name only.
16
+
17
+ One walk of the folders serves every missing file; bytes are hashed only for
18
+ files of the expected size, and within a budget (``max_hash_bytes``), so a
19
+ project of hundreds of gigabytes is not read whole. Pure I/O on the local disk.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import hashlib
25
+ import os
26
+ from typing import Any, Callable, Dict, Iterable, List, Optional
27
+
28
+ from .locate import entries_of, sha256_hex
29
+ from .storage_rows import last_segment
30
+
31
+ HOW = ("exact", "exact_renamed", "probable", "possible")
32
+ _SKIP_DIRS = {".git", "node_modules", "__pycache__", ".Trash", ".Spotlight-V100", ".fseventsd"}
33
+
34
+
35
+ def _sha256_file(path: str) -> str:
36
+ h = hashlib.sha256()
37
+ with open(path, "rb") as fh:
38
+ for chunk in iter(lambda: fh.read(1 << 20), b""):
39
+ h.update(chunk)
40
+ return h.hexdigest()
41
+
42
+
43
+ def _walk(folders: Iterable[str], max_files: int):
44
+ """``(by_name, by_size)`` of every file under ``folders`` (hidden folders of
45
+ tools and the cache are not entered; a symlink to a folder is not followed)."""
46
+ by_name: Dict[str, List[str]] = {}
47
+ by_size: Dict[int, List[str]] = {}
48
+ seen, count = set(), 0
49
+ for top in folders:
50
+ top = os.path.abspath(os.path.expanduser(str(top or "")))
51
+ if not os.path.isdir(top):
52
+ continue
53
+ for dirpath, dirnames, filenames in os.walk(top, followlinks=False):
54
+ dirnames[:] = [d for d in dirnames if d not in _SKIP_DIRS]
55
+ for fn in filenames:
56
+ full = os.path.join(dirpath, fn)
57
+ if full in seen:
58
+ continue
59
+ seen.add(full)
60
+ try:
61
+ size = os.path.getsize(full)
62
+ except OSError:
63
+ continue
64
+ if size == 0:
65
+ continue # an empty copy is not a find
66
+ by_name.setdefault(fn.lower(), []).append(full)
67
+ by_size.setdefault(size, []).append(full)
68
+ count += 1
69
+ if count >= max_files:
70
+ return by_name, by_size
71
+ return by_name, by_size
72
+
73
+
74
+ def find_moved(graph, results: List[Dict[str, Any]], folders: Iterable[str], *,
75
+ hasher: Optional[Callable[[str], str]] = None,
76
+ max_files: int = 400_000, max_hash_bytes: int = 4 << 30,
77
+ states: Iterable[str] = ("missing", "empty_copy")) -> List[Dict[str, Any]]:
78
+ """For every resource of ``results`` in one of ``states``, the files found
79
+ in ``folders`` that may be it: ``[{id, name, state, wanted: {sha256, size,
80
+ name}, matches: [{path, how, size}]}]`` — only resources with at least one
81
+ match, the surest match first. ``results`` is what ``resolve_files``
82
+ answered; nothing is written."""
83
+ hasher = hasher or _sha256_file
84
+ states = set(states)
85
+ info = {e["id"]: e for e in entries_of(graph)}
86
+ nodes = {n.node_id: n for n in getattr(graph, "nodes", [])}
87
+ wanted_rows = []
88
+ for r in results:
89
+ if r.get("state") not in states or r.get("files"):
90
+ continue # a set's state is its files' own
91
+ e = info.get(r["id"])
92
+ if e is None:
93
+ continue
94
+ data = getattr(nodes.get(r["id"]), "data", None) or {}
95
+ locs = [e["locator"]] + [a.get("locator") for a in (data.get("addresses") or [])
96
+ if isinstance(a, dict)]
97
+ name = next((s for s in (last_segment(x) for x in locs if isinstance(x, str) and x)
98
+ if s and not s.lower().startswith("sha256:")), "")
99
+ size = data.get("size_bytes")
100
+ wanted_rows.append((r, {"sha256": sha256_hex(e["checksum"]), "name": name,
101
+ "size": int(size) if isinstance(size, (int, float)) else 0}))
102
+ if not wanted_rows:
103
+ return []
104
+ by_name, by_size = _walk(folders, max_files)
105
+ budget = [max_hash_bytes]
106
+ cache: Dict[str, str] = {}
107
+
108
+ def digest(path: str, size: int) -> str:
109
+ if path in cache:
110
+ return cache[path]
111
+ if size > budget[0]:
112
+ return ""
113
+ budget[0] -= size
114
+ try:
115
+ cache[path] = hasher(path) or ""
116
+ except OSError:
117
+ cache[path] = ""
118
+ return cache[path]
119
+
120
+ out = []
121
+ for r, w in wanted_rows:
122
+ found: Dict[str, Dict[str, Any]] = {}
123
+
124
+ def add(path: str, how: str) -> None:
125
+ if path not in found or HOW.index(how) < HOW.index(found[path]["how"]):
126
+ found[path] = {"path": path, "how": how, "size": os.path.getsize(path)}
127
+
128
+ same_name = by_name.get(w["name"].lower(), []) if w["name"] else []
129
+ if w["sha256"]:
130
+ pool = {p: True for p in same_name}
131
+ if w["size"]:
132
+ for p in by_size.get(w["size"], []):
133
+ pool.setdefault(p, False)
134
+ for path, named in pool.items():
135
+ if digest(path, os.path.getsize(path)) == w["sha256"]:
136
+ add(path, "exact" if named else "exact_renamed")
137
+ for path in same_name: # the name is here, the bytes are not the graph's
138
+ if path not in found:
139
+ add(path, "possible")
140
+ else:
141
+ for path in same_name:
142
+ size_ok = bool(w["size"]) and os.path.getsize(path) == w["size"]
143
+ add(path, "probable" if size_ok else "possible")
144
+ if found:
145
+ out.append({"id": r["id"], "name": r.get("name") or w["name"], "state": r["state"],
146
+ "wanted": w,
147
+ "matches": sorted(found.values(),
148
+ key=lambda m: (HOW.index(m["how"]), m["path"]))})
149
+ return out