s3dgraphy 1.6.0.dev54__tar.gz → 1.6.0.dev55__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 (566) hide show
  1. {s3dgraphy-1.6.0.dev54/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev55}/PKG-INFO +1 -1
  2. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/pyproject.toml +1 -1
  3. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/__init__.py +1 -1
  4. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/api.py +7 -3
  5. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/__init__.py +14 -4
  6. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/engine.py +275 -55
  7. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/node.py +11 -4
  8. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
  9. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_room_import.py +125 -0
  10. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_room_import_inventory.py +8 -0
  11. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/LICENSE +0 -0
  12. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/MANIFEST.in +0 -0
  13. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/README.md +0 -0
  14. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/setup.cfg +0 -0
  15. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  16. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  17. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  18. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
  19. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
  20. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  21. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  22. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  23. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  24. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  25. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  26. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_state_symbols.json +0 -0
  27. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
  28. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  29. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  30. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
  31. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  32. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  33. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  34. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  35. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
  36. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  37. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  38. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  39. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  40. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  41. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  42. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  43. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  44. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  45. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  46. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  47. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  48. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  49. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  50. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  51. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  52. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  53. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  54. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  55. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  56. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  57. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  58. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  59. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  60. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  61. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  62. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  63. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
  64. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  65. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  66. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/container.svg +0 -0
  67. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  68. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  69. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  70. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  71. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  72. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  73. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  74. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  75. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  76. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  77. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  78. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  79. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  80. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  81. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  82. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
  83. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
  84. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
  85. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
  86. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
  87. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
  88. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
  89. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
  90. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
  91. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
  92. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
  93. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
  94. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
  95. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
  96. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
  97. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
  98. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  99. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
  100. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  101. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  102. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
  103. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  104. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  105. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
  106. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  107. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
  108. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  109. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  110. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
  111. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  112. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  113. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  114. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/proxy.svg +0 -0
  115. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
  116. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  117. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  118. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  119. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
  120. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  121. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  122. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  123. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  124. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  125. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  126. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  127. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/tileset.svg +0 -0
  128. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/version_gltf.svg +0 -0
  129. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/version_mesh.svg +0 -0
  130. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/version_scene.svg +0 -0
  131. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/2D/version_tiles.svg +0 -0
  132. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  133. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  134. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  135. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  136. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  137. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  138. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  139. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  140. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  141. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  142. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  143. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  144. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  145. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  146. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  147. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  148. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/JSON_config/version_for_cases.json +0 -0
  149. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/__main__.py +0 -0
  150. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/acquisition/__init__.py +0 -0
  151. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/acquisition/acquire.py +0 -0
  152. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/acquisition/descriptor.py +0 -0
  153. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/acquisition/mapping.py +0 -0
  154. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/ai_validation.py +0 -0
  155. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/annotation/__init__.py +0 -0
  156. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
  157. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/annotation/paradata.py +0 -0
  158. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/annotation/reading.py +0 -0
  159. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/__init__.py +0 -0
  160. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/resolver.py +0 -0
  161. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  162. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  163. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  164. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  165. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  166. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  167. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/classification.py +0 -0
  168. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/container.py +0 -0
  169. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/contract/__init__.py +0 -0
  170. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/contract/connector.py +0 -0
  171. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/contract/consumer.py +0 -0
  172. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/contract/core.py +0 -0
  173. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/contract/reference.py +0 -0
  174. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/crdt.py +0 -0
  175. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  176. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/datamodel.py +0 -0
  177. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/diagnostics.py +0 -0
  178. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dissemination.py +0 -0
  179. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/__init__.py +0 -0
  180. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/capture.py +0 -0
  181. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/corpus.py +0 -0
  182. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/devices.py +0 -0
  183. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/ingest.py +0 -0
  184. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
  185. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/dtc/residency.py +0 -0
  186. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/edges/__init__.py +0 -0
  187. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  188. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/edges/connections_loader.py +0 -0
  189. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/edges/edge.py +0 -0
  190. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/editorial.py +0 -0
  191. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/__init__.py +0 -0
  192. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  193. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  194. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  195. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  196. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  197. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  198. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  199. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  200. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  201. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  202. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  203. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  204. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  205. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  206. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  207. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  208. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  209. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  210. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  211. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  212. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  213. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
  214. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  215. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/__init__.py +0 -0
  216. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/aton.py +0 -0
  217. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/gltf.py +0 -0
  218. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/migrate.py +0 -0
  219. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/proxy.py +0 -0
  220. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/reading_glb.py +0 -0
  221. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/store_backed.py +0 -0
  222. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/geometry/wkt.py +0 -0
  223. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/graph.py +0 -0
  224. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/hdto.py +0 -0
  225. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/iiif.py +0 -0
  226. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/__init__.py +0 -0
  227. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/base_importer.py +0 -0
  228. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/csv_importer.py +0 -0
  229. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  230. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
  231. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/import_graphml.py +0 -0
  232. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  233. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/metashape_project.py +0 -0
  234. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  235. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  236. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  237. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/sheet_header.py +0 -0
  238. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/source_text.py +0 -0
  239. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  240. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  241. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/importer/xml_importer.py +0 -0
  242. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/indices.py +0 -0
  243. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/labels.py +0 -0
  244. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/language.py +0 -0
  245. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/links.py +0 -0
  246. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/__init__.py +0 -0
  247. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/authoring.py +0 -0
  248. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  249. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  250. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  251. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  252. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  253. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/registry.py +0 -0
  254. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +0 -0
  255. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  256. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  257. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  258. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/merge/__init__.py +0 -0
  259. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/merge/graph_merger.py +0 -0
  260. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/multigraph/__init__.py +0 -0
  261. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  262. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/__init__.py +0 -0
  263. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/bake.py +0 -0
  264. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/generation.py +0 -0
  265. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/query.py +0 -0
  266. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/registry.py +0 -0
  267. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/narrative/site_story.py +0 -0
  268. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/__init__.py +0 -0
  269. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  270. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/author_node.py +0 -0
  271. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/base_node.py +0 -0
  272. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  273. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/document_node.py +0 -0
  274. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  275. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
  276. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  277. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  278. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  279. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  280. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  281. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  282. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
  283. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/graph_node.py +0 -0
  284. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/group_node.py +0 -0
  285. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  286. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  287. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/license_node.py +0 -0
  288. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  289. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  290. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/project_node.py +0 -0
  291. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/property_node.py +0 -0
  292. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/representation_node.py +0 -0
  293. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
  294. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/resource_node.py +0 -0
  295. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  296. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  297. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/study_node.py +0 -0
  298. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/nodes/translation_node.py +0 -0
  299. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/ownership.py +0 -0
  300. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/paradata_view.py +0 -0
  301. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
  302. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/photogrammetry/delta.py +0 -0
  303. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/project_tree.py +0 -0
  304. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/property_source.py +0 -0
  305. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/publication.py +0 -0
  306. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/rapporti.py +0 -0
  307. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resolvers/__init__.py +0 -0
  308. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  309. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  310. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/__init__.py +0 -0
  311. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/addresses.py +0 -0
  312. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/alignment.py +0 -0
  313. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/files.py +0 -0
  314. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/fs_backend.py +0 -0
  315. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/locate.py +0 -0
  316. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/minio_backend.py +0 -0
  317. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/moved.py +0 -0
  318. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/object_store.py +0 -0
  319. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/resolver.py +0 -0
  320. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/storage_rows.py +0 -0
  321. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/tiles3tz.py +0 -0
  322. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/resources/versions.py +0 -0
  323. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/rights.py +0 -0
  324. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/access.py +0 -0
  325. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/errors.py +0 -0
  326. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/inventory.py +0 -0
  327. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/pack.py +0 -0
  328. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/room_import/trust.py +0 -0
  329. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/shelf/__init__.py +0 -0
  330. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/shelf/core.py +0 -0
  331. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/spatiotemporal.py +0 -0
  332. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/stamp/__init__.py +0 -0
  333. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/stamp/absorb.py +0 -0
  334. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/stamp/emit.py +0 -0
  335. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/stamp/hints.py +0 -0
  336. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/stamp/identity.py +0 -0
  337. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/study.py +0 -0
  338. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/__init__.py +0 -0
  339. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/_db_handle.py +0 -0
  340. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  341. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/_workspace.py +0 -0
  342. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  343. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/edge_registry.py +0 -0
  344. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  345. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/graph_projector.py +0 -0
  346. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  347. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/group_projector.py +0 -0
  348. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/group_store.py +0 -0
  349. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/ingest_result.py +0 -0
  350. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/paradata_store.py +0 -0
  351. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  352. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/rapporti.py +0 -0
  353. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/uuid7.py +0 -0
  354. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  355. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/vocab_types.py +0 -0
  356. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  357. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_detector.py +0 -0
  358. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  359. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  360. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  361. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  362. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  363. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  364. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/temporal/__init__.py +0 -0
  365. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  366. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/__init__.py +0 -0
  367. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  368. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  369. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/deliverable_report.py +0 -0
  370. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
  371. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
  372. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/node_finder.py +0 -0
  373. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  374. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  375. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/transforms/__init__.py +0 -0
  376. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  377. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/transforms/compact.py +0 -0
  378. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  379. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/translation.py +0 -0
  380. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/utils/__init__.py +0 -0
  381. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/utils/utils.py +0 -0
  382. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/utils/visual_layout.py +0 -0
  383. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy/zero_hour.py +0 -0
  384. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy.egg-info/SOURCES.txt +0 -0
  385. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  386. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy.egg-info/requires.txt +0 -0
  387. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  388. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_acquisition.py +0 -0
  389. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_acquisition_fs.py +0 -0
  390. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_add_resource.py +0 -0
  391. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_ai_validation_nodes.py +0 -0
  392. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_alternative_labels.py +0 -0
  393. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_api_surface.py +0 -0
  394. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_asset_dtc_protocol.py +0 -0
  395. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_asset_versions.py +0 -0
  396. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_aton_shapes.py +0 -0
  397. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_attach_only.py +0 -0
  398. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_authority_projection.py +0 -0
  399. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_authority_resolver.py +0 -0
  400. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_blend_locator.py +0 -0
  401. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_bucket_alignment.py +0 -0
  402. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_canonical_document_rename.py +0 -0
  403. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_canvas_metadata_import.py +0 -0
  404. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_capture_acquisition.py +0 -0
  405. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_capture_rdf_class.py +0 -0
  406. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_chronology_on_request.py +0 -0
  407. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_coating_unit.py +0 -0
  408. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_composite_node_name.py +0 -0
  409. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_connection_resolver.py +0 -0
  410. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_consumer_drift.py +0 -0
  411. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_container.py +0 -0
  412. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_container_layouts.py +0 -0
  413. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_containment_tpq.py +0 -0
  414. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_contract.py +0 -0
  415. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_contract_consumer.py +0 -0
  416. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_convert_command.py +0 -0
  417. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_crdt.py +0 -0
  418. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_cycle_message_is_cheap.py +0 -0
  419. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_datamodel_fingerprint.py +0 -0
  420. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_datamodel_i18n.py +0 -0
  421. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_deterministic_ids.py +0 -0
  422. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_em_sourcelist.py +0 -0
  423. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_file_set_stamp.py +0 -0
  424. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_graphml_without_a_database.py +0 -0
  425. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_image_set_texturing.py +0 -0
  426. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_not_georeferenced.py +0 -0
  427. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_one_act_n_outputs.py +0 -0
  428. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev29_ttl_round_trip.py +0 -0
  429. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dev30_decisions.py +0 -0
  430. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_devices.py +0 -0
  431. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dissemination_tombstones.py +0 -0
  432. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dove_sta_il_testo.py +0 -0
  433. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dtc_corpus.py +0 -0
  434. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dtc_ingest.py +0 -0
  435. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dtc_neighbourhood.py +0 -0
  436. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dtc_projection.py +0 -0
  437. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_dtc_residency.py +0 -0
  438. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_edge_outside_graph.py +0 -0
  439. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_edge_ui_phrases.py +0 -0
  440. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_editorial.py +0 -0
  441. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
  442. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_emjson_no_drawing_keys.py +0 -0
  443. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_emjson_roundtrip.py +0 -0
  444. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_emjson_schema_version.py +0 -0
  445. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
  446. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_epoch_undated_import.py +0 -0
  447. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_explicit_node_type_marker.py +0 -0
  448. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_extracted_from_unit.py +0 -0
  449. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_filtered_import.py +0 -0
  450. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_fmpxml_importer.py +0 -0
  451. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_fs_backend.py +0 -0
  452. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_functional_units.py +0 -0
  453. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_georeference_scene.py +0 -0
  454. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_gltf_stitch.py +0 -0
  455. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_glyph_paths.py +0 -0
  456. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_graph_header_code.py +0 -0
  457. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_graph_helpers_indexed.py +0 -0
  458. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_graph_indices_alive.py +0 -0
  459. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_graph_indices_edges.py +0 -0
  460. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_graph_scope_migration.py +0 -0
  461. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_hdto_projection.py +0 -0
  462. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_hdto_study.py +0 -0
  463. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_header_key_aliases.py +0 -0
  464. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_i_generi_dei_passi.py +0 -0
  465. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_iiif.py +0 -0
  466. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_il_modo_d_accesso.py +0 -0
  467. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_il_modo_dal_relay.py +0 -0
  468. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_il_proprietario_si_legge.py +0 -0
  469. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_il_riallineamento.py +0 -0
  470. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_importer_edge_hygiene.py +0 -0
  471. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_ipynb_exporter.py +0 -0
  472. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_issue27_small_points.py +0 -0
  473. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_la_lingua_alla_nascita.py +0 -0
  474. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_la_lingua_dei_dati.py +0 -0
  475. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_la_lingua_nell_op.py +0 -0
  476. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_la_riga_d_intestazione.py +0 -0
  477. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_latex_exporter.py +0 -0
  478. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_le_traduzioni.py +0 -0
  479. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_lod_levels.py +0 -0
  480. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_lossless_roundtrip.py +0 -0
  481. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_mapping_authoring.py +0 -0
  482. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_mapping_csv_and_relations.py +0 -0
  483. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_masonry_unit.py +0 -0
  484. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_material_color.py +0 -0
  485. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_merge_conflicts.py +0 -0
  486. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_metashape_project.py +0 -0
  487. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_migrate_legacy_proxy.py +0 -0
  488. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_minio_backend.py +0 -0
  489. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_authorship.py +0 -0
  490. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_bake_docx.py +0 -0
  491. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_figures.py +0 -0
  492. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_generation.py +0 -0
  493. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_mentions.py +0 -0
  494. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_node.py +0 -0
  495. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_query.py +0 -0
  496. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_scaffolder.py +0 -0
  497. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_site_place.py +0 -0
  498. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_narrative_unvalidated_export.py +0 -0
  499. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_node_datamodel_registry.py +0 -0
  500. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_node_finder.py +0 -0
  501. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_node_type_map_integrity.py +0 -0
  502. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_one_resolver.py +0 -0
  503. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_one_spelling_writers.py +0 -0
  504. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_op_vocabulary.py +0 -0
  505. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_pg_importer.py +0 -0
  506. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_photogrammetry_delta.py +0 -0
  507. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_physical_relation_spellings.py +0 -0
  508. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_piu_indirizzi.py +0 -0
  509. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_promote_keeps_proxy_type.py +0 -0
  510. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_promotion.py +0 -0
  511. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_property_as_source.py +0 -0
  512. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_property_owners.py +0 -0
  513. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_proxy_resource.py +0 -0
  514. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_proxy_retype.py +0 -0
  515. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_psx_locator.py +0 -0
  516. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_pyarchinit_tier2.py +0 -0
  517. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_qualia_dai_d7_d8.py +0 -0
  518. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_rdf_embedding.py +0 -0
  519. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_rdf_reverse_edges.py +0 -0
  520. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_rdf_roundtrip.py +0 -0
  521. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reading_coords.py +0 -0
  522. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reading_glb.py +0 -0
  523. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reading_migration.py +0 -0
  524. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reading_place.py +0 -0
  525. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reading_rdf.py +0 -0
  526. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_recompute_warnings.py +0 -0
  527. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_release.py +0 -0
  528. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reproject.py +0 -0
  529. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_file_node.py +0 -0
  530. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_files_implicit.py +0 -0
  531. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_layer.py +0 -0
  532. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_representations.py +0 -0
  533. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_revision.py +0 -0
  534. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_resource_tier.py +0 -0
  535. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_reverse_edges.py +0 -0
  536. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_rm_container_node_group.py +0 -0
  537. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_room_import_access.py +0 -0
  538. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_room_import_trust.py +0 -0
  539. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_semantic_purity.py +0 -0
  540. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_shelf.py +0 -0
  541. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_shelf_facets.py +0 -0
  542. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_shelf_hatting.py +0 -0
  543. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_shelf_role_uri_table.py +0 -0
  544. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_shipped_mappings.py +0 -0
  545. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_source_list_mapping.py +0 -0
  546. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_source_text.py +0 -0
  547. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_spatiotemporal_entities.py +0 -0
  548. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_stable_study_code.py +0 -0
  549. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_stamp.py +0 -0
  550. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_stamp_hints.py +0 -0
  551. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_stamp_title_description.py +0 -0
  552. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_storage_rows.py +0 -0
  553. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_store_backed_geometry.py +0 -0
  554. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_stratiminer_api.py +0 -0
  555. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_study_metadata.py +0 -0
  556. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_tileset_resource.py +0 -0
  557. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_ttl_roundtrip.py +0 -0
  558. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_unit_definition.py +0 -0
  559. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_verifica_provenance.py +0 -0
  560. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_version_for.py +0 -0
  561. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_visual_assets.py +0 -0
  562. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_wheel_drift.py +0 -0
  563. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
  564. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_xlsx_importer_graph_init.py +0 -0
  565. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/tests/test_xlsx_source_column.py +0 -0
  566. {s3dgraphy-1.6.0.dev54 → s3dgraphy-1.6.0.dev55}/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.dev54
3
+ Version: 1.6.0.dev55
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.dev54"
7
+ version = "1.6.0.dev55"
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.dev54"
1
+ __version__ = "1.6.0.dev55"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -3069,7 +3069,8 @@ def resolve_file(entry: Dict[str, Any], **kwargs) -> Dict[str, Any]:
3069
3069
 
3070
3070
 
3071
3071
  # ── a study into a room, from a folder (MICRO-ROOM-IMPORT, 15 Oct 2026) ──────
3072
- def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = None,
3072
+ def room_import(em_json: Optional[str] = None, *, node: str, room: str,
3073
+ title: Optional[str] = None,
3073
3074
  base_dir: Optional[str] = None, visibility: str = "restricted",
3074
3075
  token: Optional[str] = None, dry_run: bool = False,
3075
3076
  pack_tilesets: Optional[str] = None, **kwargs) -> Dict[str, Any]:
@@ -3079,8 +3080,11 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
3079
3080
  hosted keeping their path, the graph is seated last as operations, then
3080
3081
  ``study-access``. ``dry_run``: the plan only, nothing written.
3081
3082
  ``pack_tilesets="3tz"``: a tileset folder goes up as one canonical
3082
- ``.3tz``. → the report. The one engine of the three doors (the command,
3083
- EMStudio, EM Tools); see :mod:`s3dgraphy.room_import`."""
3083
+ ``.3tz``. ``container=`` (a study held in memory) with ``base_dirs=``
3084
+ instead of the path; the person's choices as ``per_group``/``per_batch``/
3085
+ ``per_item``, ``move``, ``lots``; ``before_seed`` for what a client adds
3086
+ before the graph is seated. → the report. The one engine of the three
3087
+ doors (the command, EMStudio, EM Tools); see :mod:`s3dgraphy.room_import`."""
3084
3088
  from .room_import import room_import as _run
3085
3089
  return _run(em_json, node=node, room=room, title=title, base_dir=base_dir,
3086
3090
  visibility=visibility, token=token, dry_run=dry_run,
@@ -52,13 +52,23 @@ written by dtcstamp (s3Dgraphy stays a reader), a sibling representation
52
52
  (`dtc_derived_from` the folder, a DTC step `packing` with its stamp); the
53
53
  folder stays as a reference. See :mod:`.pack`.
54
54
 
55
+ A CLIENT WITH A DIALOG (EM Tools' «Bring into a room») calls the two halves:
56
+ :func:`prepare` (the room, then the plan, from the study it holds in memory:
57
+ `container=`, `base_dirs=`), shows the rows, and :func:`execute` with the
58
+ person's choices (:func:`apply_choices` per group / batch / item, `move` for
59
+ «Move here», the confirmed `lots`) and its hook for what only the client can
60
+ make (`before_seed`: EM Tools publishes the scene's models there, so they are
61
+ in the one seeding).
62
+
55
63
  Defaults to confirm (E.D.): the name `room_import` / `room-import`, a new
56
64
  room's visibility `restricted`.
57
65
  """
58
66
 
59
- from .engine import (JOURNAL_NAME, Interrupted, Journal, make_plan, markdown,
60
- room_import, summarise_plan)
67
+ from .engine import (JOURNAL_NAME, Interrupted, Journal, apply_choices,
68
+ birth_sections, execute, make_plan, markdown, plan_report,
69
+ prepare, room_import, summarise_plan)
61
70
  from .errors import RoomError
62
71
 
63
- __all__ = ["JOURNAL_NAME", "Interrupted", "Journal", "RoomError", "make_plan",
64
- "markdown", "room_import", "summarise_plan"]
72
+ __all__ = ["JOURNAL_NAME", "Interrupted", "Journal", "RoomError", "apply_choices",
73
+ "birth_sections", "execute", "make_plan", "markdown", "plan_report",
74
+ "prepare", "room_import", "summarise_plan"]
@@ -376,10 +376,16 @@ def _open_room(node: str, token: Optional[str], room: str, title: str,
376
376
 
377
377
  def _upload_all(units: List[Dict[str, Any]], *, node: str, room: str,
378
378
  token: Optional[str], journal: Journal, workers: int,
379
- by_reference: bool, stop_after: Optional[int] = None
379
+ by_reference: bool, stop_after: Optional[int] = None,
380
+ progress: Optional[Callable[[str, int, int], None]] = None,
381
+ hold: Optional[Callable[[], Any]] = None,
382
+ on_bytes: Optional[Callable[[int], None]] = None
380
383
  ) -> Dict[str, Any]:
381
384
  """Every unit not on the node goes up, in a pool. One failure is one row of
382
- the report; an unreachable node stops the run (the journal is kept)."""
385
+ the report; an unreachable node stops the run (the journal is kept).
386
+ `hold()` before each file and each piece (a client's «Pause»); `on_bytes(n)`
387
+ as the bytes are read out, from the WORKERS (a client that draws hands it
388
+ to its own thread)."""
383
389
  total = sum(int(u["size"] or 0) for u in units)
384
390
  done = {"files": 0, "bytes": 0, "referenced": 0, "already": 0}
385
391
  failed: List[Dict[str, str]] = []
@@ -388,6 +394,8 @@ def _upload_all(units: List[Dict[str, Any]], *, node: str, room: str,
388
394
  stop = threading.Event()
389
395
 
390
396
  def one(u):
397
+ if hold is not None:
398
+ hold()
391
399
  if stop.is_set():
392
400
  return
393
401
  if by_reference:
@@ -402,8 +410,18 @@ def _upload_all(units: List[Dict[str, Any]], *, node: str, room: str,
402
410
  if exc.status != 409:
403
411
  raise
404
412
  # a node that keeps the bytes it is given: upload them there
413
+ read = [0]
414
+
415
+ def piece_read(sent, _size):
416
+ if on_bytes is not None and sent > read[0]:
417
+ on_bytes(sent - read[0])
418
+ read[0] = sent
419
+
405
420
  info = nodeio.upload_asset(node, room, u["path"], u["sha256"],
406
- u["media_type"], token)
421
+ u["media_type"], token,
422
+ piece_read if on_bytes is not None else None, hold=hold)
423
+ if info.get("already") and read[0]:
424
+ on_bytes(-read[0]) # the node had them after all: nothing was read out
407
425
  journal.note_file(u["sha256"], "already" if info.get("already") else "uploaded",
408
426
  u["size"])
409
427
  with lock:
@@ -426,6 +444,15 @@ def _upload_all(units: List[Dict[str, Any]], *, node: str, room: str,
426
444
  u = futures[fut]
427
445
  try:
428
446
  fut.result()
447
+ if progress is not None:
448
+ # here, in the caller's thread: Blender's progress bar
449
+ # must not be touched from a worker
450
+ with lock:
451
+ sent = done["bytes"]
452
+ try:
453
+ progress(os.path.basename(u["path"] or ""), sent, total)
454
+ except Exception: # noqa: BLE001 — a client's bar is not the run
455
+ pass
429
456
  except RoomError as exc:
430
457
  if exc.status is None or exc.status == 401:
431
458
  stop.set()
@@ -603,36 +630,73 @@ def _seed(container, *, node: str, room: str, token: Optional[str],
603
630
  return out
604
631
 
605
632
 
606
- def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = None,
607
- base_dir: Optional[str] = None, visibility: str = "restricted",
608
- token: Optional[str] = None, dry_run: bool = False,
609
- pack_tilesets: Optional[str] = None, journal_path: Optional[str] = None,
610
- work_dir: Optional[str] = None, report_dir: Optional[str] = None,
611
- by_reference: bool = False, workers: int = 4, reseed: bool = False,
612
- elsewhere: str = "host",
613
- stop_after: Optional[int] = None) -> Dict[str, Any]:
614
- """Bring the study of `em_json` and every file of its folder into `room` on
615
- `node`. → the report (also written as json + md unless `dry_run`)."""
633
+ def _study(em_json: Optional[str], container: Any) -> Tuple[Any, List[str]]:
634
+ """The study: from its file, or the one a client holds in memory (EM Tools:
635
+ the graphs of the scene, the file's shelf). Anything with `graphs` (id →
636
+ Graph), `shelf` and `active_graph_id` — a :class:`~s3dgraphy.container.Container`."""
637
+ if container is not None:
638
+ return container, []
639
+ if not em_json:
640
+ raise ValueError("room_import needs an em.json or a container")
641
+ return _load(em_json)
642
+
643
+
644
+ def _title_of(container: Any, em_json: Optional[str]) -> str:
645
+ active = None
646
+ try:
647
+ active = container.active()
648
+ except Exception: # noqa: BLE001 — a container-like without active()
649
+ gid = getattr(container, "active_graph_id", None)
650
+ active = (getattr(container, "graphs", {}) or {}).get(gid)
651
+ name = getattr(active, "name", "") or ""
652
+ if isinstance(name, dict):
653
+ # a graph's name in several languages (`{"default": …}`): measured on
654
+ # 15 Oct 2026, the title was the dict written out
655
+ name = name.get("default") or next(iter(name.values()), "")
656
+ name = str(name or "")
657
+ if name:
658
+ return name
659
+ return os.path.basename(em_json).split(".")[0] if em_json else ""
660
+
661
+
662
+ def prepare(em_json: Optional[str] = None, *, container: Any = None,
663
+ node: str, room: str, title: Optional[str] = None,
664
+ base_dir: Optional[str] = None, base_dirs: Optional[Iterable[str]] = None,
665
+ token: Optional[str] = None, dry_run: bool = False,
666
+ pack_tilesets: Optional[str] = None, journal_path: Optional[str] = None,
667
+ work_dir: Optional[str] = None, workers: int = 4) -> Dict[str, Any]:
668
+ """The first half of the gesture: the room (created, or taken up again —
669
+ unless `dry_run`), then the PLAN, every file the study names in its group.
670
+ Nothing is uploaded. → the run, for :func:`plan_report` and :func:`execute`.
671
+
672
+ A client with a dialog (EM Tools) calls this, shows `run["plan"]["rows"]`,
673
+ collects the person's choices, and then calls :func:`execute` with them.
674
+ `container` is the study a client holds in memory (its graphs are
675
+ rewritten IN PLACE when the files are hosted); `base_dirs` are where its
676
+ relative paths are looked for (the DosCo, the em.json's folder, the
677
+ .blend's folder), the first one also where the journal goes when no
678
+ `em_json` says where."""
616
679
  from . import pack as packing
617
680
 
618
681
  started = time.time()
619
682
  t0 = time.monotonic()
620
683
  nodeio.seen_requests(reset=True)
621
684
  node = node.strip().rstrip("/")
622
- em_json = os.path.abspath(em_json)
623
- if visibility not in VISIBILITIES:
624
- raise ValueError(f"visibility is restricted or public, not {visibility!r}")
625
- if elsewhere not in ELSEWHERE:
626
- raise ValueError(f"elsewhere is one of {ELSEWHERE}, not {elsewhere!r}")
685
+ em_json = os.path.abspath(em_json) if em_json else ""
627
686
  if pack_tilesets not in (None, "", "3tz"):
628
687
  raise ValueError(f"--pack-tilesets knows 3tz, not {pack_tilesets!r}")
629
- base = os.path.abspath(base_dir or os.path.dirname(em_json))
630
- journal_path = journal_path or os.path.join(os.path.dirname(em_json), JOURNAL_NAME)
688
+ bases = [os.path.abspath(b) for b in (base_dirs or ()) if b]
689
+ if base_dir or not bases:
690
+ if not (base_dir or em_json):
691
+ raise ValueError("room_import needs base_dirs when there is no em.json")
692
+ bases.insert(0, os.path.abspath(base_dir or os.path.dirname(em_json)))
693
+ bases = list(dict.fromkeys(bases))
694
+ journal_path = journal_path or os.path.join(
695
+ os.path.dirname(em_json) if em_json else bases[0], JOURNAL_NAME)
631
696
  journal = Journal(journal_path, node=node, room=room, write=not dry_run)
632
- container, warnings = _load(em_json)
697
+ container, warnings = _study(em_json, container)
633
698
  members = _members(container)
634
- title = title or str(getattr(container.active(), "name", "") or "") or \
635
- os.path.basename(em_json).split(".")[0]
699
+ title = title or _title_of(container, em_json) or room
636
700
  timings: Dict[str, float] = {}
637
701
 
638
702
  # THE ROOM BEFORE ANY QUESTION ABOUT ITS FILES. Measured on 15 Oct 2026: a
@@ -648,8 +712,8 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
648
712
  probe = _room_exists(node, token, room)
649
713
  else:
650
714
  where = _open_room(node, token, room, title, birth_sections(members),
651
- container.active_graph_id, journal)
652
- plan = make_plan(container, base_dirs=[base], node=node, room=room,
715
+ getattr(container, "active_graph_id", None), journal)
716
+ plan = make_plan(container, base_dirs=bases, node=node, room=room,
653
717
  token=token if probe else None, journal=journal, workers=workers,
654
718
  trees=inventory.CHOICE_REFERENCE if pack_tilesets else inventory.CHOICE_UPLOAD,
655
719
  probe=probe)
@@ -670,7 +734,7 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
670
734
  # its file on this disk, also when the node already has it (a
671
735
  # row the HEAD answered for carries no path)
672
736
  sib_path = (sib_row or {}).get("path") or inventory.resolve_path(
673
- str(sib.data.get("url") or ""), [base])
737
+ str(sib.data.get("url") or ""), bases)
674
738
  check = packing.reusable(sib, sib_path, folder_digest)
675
739
  if check["ok"]:
676
740
  packs.append({"tree": r["id"], "reused": sib.node_id,
@@ -688,7 +752,7 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
688
752
  packs.append(made)
689
753
  if any("archive_id" in p for p in packs):
690
754
  # the new siblings are resources like any other: planned again
691
- plan = make_plan(container, base_dirs=[base, work], node=node, room=room,
755
+ plan = make_plan(container, base_dirs=bases + [work], node=node, room=room,
692
756
  token=token, journal=journal, workers=workers,
693
757
  trees=inventory.CHOICE_REFERENCE, probe=probe)
694
758
  for p in packs:
@@ -697,23 +761,115 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
697
761
  raise RoomError(f"the packed archive {p['path']} was not found again")
698
762
  timings["pack"] = round(time.monotonic() - t0 - timings["plan"], 1)
699
763
 
700
- summary = summarise_plan(plan, elsewhere=elsewhere)
701
- report: Dict[str, Any] = {
702
- "em_json": em_json, "base_dir": base, "node": node, "room": room, "title": title,
703
- "visibility": visibility, "dry_run": dry_run, "pack_tilesets": pack_tilesets or "",
704
- "elsewhere": elsewhere, "asked_the_node": probe,
705
- "started_at": datetime.datetime.fromtimestamp(started).isoformat(timespec="seconds"),
706
- "plan": summary, "packs": packs, "warnings": warnings[:20],
764
+ return {"em_json": em_json, "container": container, "members": members,
765
+ "base_dirs": bases, "node": node, "room": room, "title": title,
766
+ "token": token, "dry_run": dry_run, "pack_tilesets": pack_tilesets or "",
767
+ "journal": journal, "journal_path": journal_path, "where": where,
768
+ "probe": probe, "plan": plan, "packs": packs, "warnings": warnings,
769
+ "timings": timings, "t0": t0, "started": started, "workers": workers}
770
+
771
+
772
+ def plan_report(run: Dict[str, Any], *, elsewhere: str = "host",
773
+ visibility: str = "restricted") -> Dict[str, Any]:
774
+ """What :func:`prepare` found, as the report's first half (the dry run's
775
+ whole report)."""
776
+ plan = run["plan"]
777
+ return {
778
+ "em_json": run["em_json"], "base_dir": run["base_dirs"][0],
779
+ "base_dirs": run["base_dirs"], "node": run["node"], "room": run["room"],
780
+ "title": run["title"], "visibility": visibility, "dry_run": run["dry_run"],
781
+ "pack_tilesets": run["pack_tilesets"], "elsewhere": elsewhere,
782
+ "asked_the_node": run["probe"],
783
+ "started_at": datetime.datetime.fromtimestamp(run["started"]).isoformat(timespec="seconds"),
784
+ "plan": summarise_plan(plan, elsewhere=elsewhere), "packs": run["packs"],
785
+ "warnings": run["warnings"][:20],
707
786
  "missing": [{"id": r["id"], "name": r["name"], "locator": r["locator"],
708
787
  "note": r.get("note", "")}
709
788
  for r in plan["rows"] if r["group"] == inventory.GROUP_MISSING],
710
789
  }
711
- if dry_run:
712
- report["requests"] = nodeio.seen_requests()
713
- report["seconds"] = round(time.monotonic() - t0, 1)
714
- report["timings"] = timings
715
- return report
716
790
 
791
+
792
+ def apply_choices(run: Dict[str, Any], *, per_group: Optional[Dict[str, str]] = None,
793
+ per_batch: Optional[Dict[str, str]] = None,
794
+ per_item: Optional[Dict[str, str]] = None) -> Dict[str, Any]:
795
+ """The person's choices on the plan (`inventory.apply_choices`: item >
796
+ batch > group), and the work they mean recounted: a file left as a
797
+ reference or skipped is not a unit any more, a tree left as a reference
798
+ has no files to send. → the plan."""
799
+ plan = run["plan"]
800
+ inventory.apply_choices(plan["rows"], per_group=per_group, per_batch=per_batch,
801
+ per_item=per_item)
802
+ trees = [r for r in plan["rows"] if r.get("tree") and r["choice"] == inventory.CHOICE_UPLOAD]
803
+ keep = {t["id"] for t in trees}
804
+ plan["trees"] = trees
805
+ plan["members"] = [m for m in plan["members"] if m["tree_of"] in keep]
806
+ token = run["token"] if run["probe"] else None
807
+ head = _head_fn(run["node"], run["room"], token) if run["probe"] \
808
+ else (lambda _hexd: (False, None))
809
+ plan["units"] = _units(plan["rows"], plan["members"], head, run["journal"])
810
+ return plan
811
+
812
+
813
+ def _bucket_lots(run: Dict[str, Any], lots: Iterable[Dict[str, Any]]) -> List[str]:
814
+ """L1 · each CONFIRMED session of photos becomes ONE acquisition in its
815
+ graph (`api.bucket_acquisition`, the serial node). → the acquisition ids."""
816
+ from ..api import bucket_acquisition
817
+ graphs = dict(run["members"])
818
+ active = getattr(run["container"], "active_graph_id", None)
819
+ made = []
820
+ for lot in lots or ():
821
+ if lot.get("confirmed") is False or not lot.get("ids"):
822
+ continue
823
+ graph = graphs.get(lot.get("graph_id") or active) or next(iter(graphs.values()))
824
+ out = bucket_acquisition(
825
+ graph, list(lot["ids"]), name=f"Photos · {lot.get('name') or ''}".strip(),
826
+ metadata={"camera": lot.get("camera"), "taken_from": lot.get("from"),
827
+ "taken_to": lot.get("to"),
828
+ "source": lot.get("source") or "room-import"})
829
+ made.append(str(out.get("acquisition_id") or out.get("id") or ""))
830
+ return made
831
+
832
+
833
+ def execute(run: Dict[str, Any], *, visibility: str = "restricted",
834
+ elsewhere: str = "host", move: Optional[Iterable[str]] = None,
835
+ lots: Optional[Iterable[Dict[str, Any]]] = None,
836
+ before_seed: Optional[Callable[[Dict[str, Any]], Optional[Dict[str, Any]]]] = None,
837
+ progress: Optional[Callable[[str, int, int], None]] = None,
838
+ report_dir: Optional[str] = None, by_reference: bool = False,
839
+ reseed: bool = False, stop_after: Optional[int] = None,
840
+ hold: Optional[Callable[[], Any]] = None,
841
+ on_bytes: Optional[Callable[[int], None]] = None) -> Dict[str, Any]:
842
+ """The second half: the files up, the resources hosted, the graph seated,
843
+ `study-access`, the report (json + md in `report_dir`).
844
+
845
+ The person's choices: on the plan (:func:`apply_choices`, before this);
846
+ `move` — the rows (ids) or digests at home in another room the person
847
+ said «Move here» for (`elsewhere="move"`: all of them); `lots` — the
848
+ confirmed sessions of photos, one acquisition each. `before_seed(info)` is
849
+ the client's hook for the resources only IT can make — EM Tools exports
850
+ the scene's models and publishes them (`promote_model`) — called after the
851
+ files are up and hosted, BEFORE the graph is seated, so they are in the one
852
+ seeding. `info` is `{node, room, token, container, plan}`; it answers
853
+ `{uploaded, bytes, already, failed: [sentence], filled: [resource id]}`
854
+ (any of them), counted in the report. `progress(name, sent, total)`:
855
+ bytes, after each file. `hold()` — a client's «Pause»: called before each
856
+ file and each piece, it returns when the run may go on (truthy if it
857
+ waited); `on_bytes(n)` — the bytes as they are read out, from the upload
858
+ workers."""
859
+ if run["dry_run"]:
860
+ raise ValueError("a dry run is not executed: prepare it again without dry_run")
861
+ if visibility not in VISIBILITIES:
862
+ raise ValueError(f"visibility is restricted or public, not {visibility!r}")
863
+ if elsewhere not in ELSEWHERE:
864
+ raise ValueError(f"elsewhere is one of {ELSEWHERE}, not {elsewhere!r}")
865
+ node, room, token = run["node"], run["room"], run["token"]
866
+ journal, journal_path = run["journal"], run["journal_path"]
867
+ plan, where, members = run["plan"], run["where"], run["members"]
868
+ t0, timings, workers = run["t0"], run["timings"], run["workers"]
869
+ container = run["container"]
870
+
871
+ summary = summarise_plan(plan, elsewhere=elsewhere)
872
+ report = plan_report(run, elsewhere=elsewhere, visibility=visibility)
717
873
  try:
718
874
  report["room_state"] = where
719
875
  t1 = time.monotonic()
@@ -722,7 +878,8 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
722
878
  _say(f"{len(todo)} file(s) to send, {inventory.human_size(sum(int(u['size'] or 0) for u in todo))}")
723
879
  uploads = _upload_all(todo, node=node, room=room, token=token, journal=journal,
724
880
  workers=workers, by_reference=by_reference,
725
- stop_after=stop_after)
881
+ stop_after=stop_after, progress=progress,
882
+ hold=hold, on_bytes=on_bytes)
726
883
  for u in plan["units"].values():
727
884
  if u["present"]:
728
885
  journal.note_file(u["sha256"], "already", u["size"])
@@ -754,22 +911,27 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
754
911
  for r in plan["rows"]:
755
912
  if r["group"] == inventory.GROUP_ELSEWHERE:
756
913
  homes[r.get("home") or "?"] = homes.get(r.get("home") or "?", 0) + 1
757
- if elsewhere == "move":
758
- for hexd in sorted({r["sha256"] for r in plan["rows"]
759
- if r["group"] == inventory.GROUP_ELSEWHERE and r.get("sha256")}):
760
- row = next(r for r in plan["rows"] if r.get("sha256") == hexd)
761
- try:
762
- answer = nodeio.move_asset_home(node, room, hexd, row.get("home"), token)
763
- if answer.get("home") == room:
764
- moved.add(hexd)
765
- except RoomError as exc:
914
+ said = {str(x) for x in (move or ())}
915
+ to_move = sorted({r["sha256"] for r in plan["rows"]
916
+ if r["group"] == inventory.GROUP_ELSEWHERE and r.get("sha256")
917
+ and (elsewhere == "move" or r["id"] in said or r["sha256"] in said)})
918
+ for hexd in to_move:
919
+ row = next(r for r in plan["rows"] if r.get("sha256") == hexd)
920
+ try:
921
+ answer = nodeio.move_asset_home(node, room, hexd, row.get("home"), token)
922
+ if answer.get("home") == room:
923
+ moved.add(hexd)
924
+ else:
766
925
  uploads["failed"].append({"file": row["name"], "sha256": hexd,
767
- "why": f"not moved here: {exc}"})
926
+ "why": f"the node kept it in {answer.get('home')}"})
927
+ except RoomError as exc:
928
+ uploads["failed"].append({"file": row["name"], "sha256": hexd,
929
+ "why": f"not moved here: {exc}"})
768
930
  rewritten = _rewrite(container, plan, node=node, room=room, manifests=manifests,
769
931
  failed_hex=failed_hex, elsewhere=elsewhere, moved=moved)
770
932
  rewritten["homes_elsewhere"] = homes
771
933
  rewritten["moved_here"] = len(moved)
772
- for p in packs:
934
+ for p in run["packs"]:
773
935
  # the packed archive was born in a work folder: that path is not
774
936
  # an address of the study, the room's store is
775
937
  res = dict(members).get(_graph_of(plan, p.get("archive_id"))) if p.get("archive_id") else None
@@ -780,6 +942,11 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
780
942
  res.data.pop("addresses", None)
781
943
  else:
782
944
  res.data["addresses"] = kept
945
+ acquisitions = _bucket_lots(run, lots or ())
946
+ scene: Dict[str, Any] = {}
947
+ if before_seed is not None:
948
+ scene = dict(before_seed({"node": node, "room": room, "token": token,
949
+ "container": container, "plan": plan}) or {})
783
950
  seeded = {"applied": 0, "refused": 0, "not_news": 0, "sent": 0, "requests": 0,
784
951
  "graphs": []}
785
952
  if where["seedable"]:
@@ -796,15 +963,23 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
796
963
  finally:
797
964
  journal.flush(force=True)
798
965
 
966
+ filled = set(scene.get("filled") or ())
967
+ if filled:
968
+ report["missing"] = [m for m in report["missing"] if m["id"] not in filled]
969
+ report["plan"]["missing"] = len(report["missing"])
799
970
  report.update({
800
- "uploaded": {"files": uploads["files"], "bytes": uploads["bytes"]},
801
- "already": {"files": summary["already"]["files"] + uploads["already"],
971
+ "uploaded": {"files": uploads["files"] + int(scene.get("uploaded") or 0),
972
+ "bytes": uploads["bytes"] + int(scene.get("bytes") or 0)},
973
+ "already": {"files": summary["already"]["files"] + uploads["already"]
974
+ + int(scene.get("already") or 0),
802
975
  "bytes": summary["already"]["bytes"]},
803
976
  "referenced_by_node": uploads["referenced"],
804
977
  "references": summary["references"],
805
- "failed": [f"{f['file']}: {f['why']}" for f in uploads["failed"]],
978
+ "failed": [f"{f['file']}: {f['why']}" for f in uploads["failed"]]
979
+ + [str(x) for x in scene.get("failed") or ()],
806
980
  "trees": [{"id": k, **v} for k, v in manifests.items()],
807
- "rewritten": rewritten, "seeded": seeded,
981
+ "rewritten": rewritten, "seeded": seeded, "lots": acquisitions,
982
+ "scene": scene,
808
983
  "access": access or {"visibility": journal.here.get("visibility")},
809
984
  "link": targets.get("web") or targets.get("scheme") or "",
810
985
  "requests": nodeio.seen_requests(),
@@ -820,6 +995,51 @@ def room_import(em_json: str, *, node: str, room: str, title: Optional[str] = No
820
995
  return report
821
996
 
822
997
 
998
+ def room_import(em_json: Optional[str] = None, *, node: str, room: str,
999
+ container: Any = None, title: Optional[str] = None,
1000
+ base_dir: Optional[str] = None, base_dirs: Optional[Iterable[str]] = None,
1001
+ visibility: str = "restricted",
1002
+ token: Optional[str] = None, dry_run: bool = False,
1003
+ pack_tilesets: Optional[str] = None, journal_path: Optional[str] = None,
1004
+ work_dir: Optional[str] = None, report_dir: Optional[str] = None,
1005
+ by_reference: bool = False, workers: int = 4, reseed: bool = False,
1006
+ elsewhere: str = "host",
1007
+ per_group: Optional[Dict[str, str]] = None,
1008
+ per_batch: Optional[Dict[str, str]] = None,
1009
+ per_item: Optional[Dict[str, str]] = None,
1010
+ move: Optional[Iterable[str]] = None,
1011
+ lots: Optional[Iterable[Dict[str, Any]]] = None,
1012
+ before_seed: Optional[Callable[[Dict[str, Any]], Optional[Dict[str, Any]]]] = None,
1013
+ progress: Optional[Callable[[str, int, int], None]] = None,
1014
+ stop_after: Optional[int] = None,
1015
+ hold: Optional[Callable[[], Any]] = None,
1016
+ on_bytes: Optional[Callable[[int], None]] = None) -> Dict[str, Any]:
1017
+ """Bring the study of `em_json` (or the `container` a client holds) and
1018
+ every file of its folder into `room` on `node`: :func:`prepare`, the
1019
+ choices (:func:`apply_choices`), :func:`execute`. → the report (also
1020
+ written as json + md unless `dry_run`)."""
1021
+ if visibility not in VISIBILITIES:
1022
+ raise ValueError(f"visibility is restricted or public, not {visibility!r}")
1023
+ if elsewhere not in ELSEWHERE:
1024
+ raise ValueError(f"elsewhere is one of {ELSEWHERE}, not {elsewhere!r}")
1025
+ run = prepare(em_json, container=container, node=node, room=room, title=title,
1026
+ base_dir=base_dir, base_dirs=base_dirs, token=token, dry_run=dry_run,
1027
+ pack_tilesets=pack_tilesets, journal_path=journal_path,
1028
+ work_dir=work_dir, workers=workers)
1029
+ if per_group or per_batch or per_item:
1030
+ apply_choices(run, per_group=per_group, per_batch=per_batch, per_item=per_item)
1031
+ if dry_run:
1032
+ report = plan_report(run, elsewhere=elsewhere, visibility=visibility)
1033
+ report["requests"] = nodeio.seen_requests()
1034
+ report["seconds"] = round(time.monotonic() - run["t0"], 1)
1035
+ report["timings"] = run["timings"]
1036
+ return report
1037
+ return execute(run, visibility=visibility, elsewhere=elsewhere, move=move, lots=lots,
1038
+ before_seed=before_seed, progress=progress, report_dir=report_dir,
1039
+ by_reference=by_reference, reseed=reseed, stop_after=stop_after,
1040
+ hold=hold, on_bytes=on_bytes)
1041
+
1042
+
823
1043
  def sentence(report: Dict[str, Any]) -> str:
824
1044
  up = report.get("uploaded") or {}
825
1045
  return (f"uploaded {up.get('files', 0)} ({inventory.human_size(up.get('bytes', 0))}), "
@@ -275,7 +275,7 @@ def _offset_now(url: str, token, timeout) -> int:
275
275
 
276
276
 
277
277
  def _resumable(node, room, path, hexd, size, media_type, token, progress_cb,
278
- timeout, piece) -> Dict[str, Any]:
278
+ timeout, piece, hold=None) -> Dict[str, Any]:
279
279
  start = urllib.request.Request(
280
280
  _room_url(node, room, "uploads"), method="POST",
281
281
  data=json.dumps({"size": size, "sha256": hexd,
@@ -292,6 +292,10 @@ def _resumable(node, room, path, hexd, size, media_type, token, progress_cb,
292
292
  offset = int(session.get("offset") or 0)
293
293
  failures = 0
294
294
  while True:
295
+ if hold is not None and hold() and offset:
296
+ # a client's «Pause» waited here, BETWEEN two pieces: the node
297
+ # says where it is now, and the upload goes on from there
298
+ offset = _offset_now(url, token, timeout)
295
299
  length = min(piece, size - offset)
296
300
  read_so_far = [0]
297
301
 
@@ -343,14 +347,17 @@ def upload_asset(node: str, room: str, path: str, sha256: Optional[str],
343
347
  progress_cb: ProgressCb = None, *,
344
348
  timeout: float = 600.0,
345
349
  single_shot_max: int = SINGLE_SHOT_MAX,
346
- piece: int = PIECE) -> Dict[str, Any]:
350
+ piece: int = PIECE,
351
+ hold: Optional[Callable[[], None]] = None) -> Dict[str, Any]:
347
352
  """Put the file at `path` into `room`'s store on `node`.
348
353
 
349
354
  → `{ref, sha256, size, media_type, created, author, url, already}`.
350
355
  `already: True` means the HEAD said the room has it and nothing was sent.
351
356
  `sha256` may be None (it is computed here); when given it is checked by
352
357
  the node, so a file changed since the inventory read it is refused (422)
353
- rather than stored under the wrong name.
358
+ rather than stored under the wrong name. `hold()` is called before each
359
+ piece of a resumable upload and returns when the client wants it to go on
360
+ (its «Pause»), truthy if it waited.
354
361
  """
355
362
  if not os.path.isfile(path):
356
363
  raise RoomError(f"not a file: {path}")
@@ -379,7 +386,7 @@ def upload_asset(node: str, room: str, path: str, sha256: Optional[str],
379
386
  progress_cb, timeout)
380
387
  else:
381
388
  info = _resumable(node, room, path, hexd, size, media_type, token,
382
- progress_cb, timeout, piece)
389
+ progress_cb, timeout, piece, hold)
383
390
  got = _hex(info.get("ref") or info.get("sha256") or "")
384
391
  if got != hexd:
385
392
  raise RoomError(f"the room stored sha256:{got[:12]}…, not the "
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: s3dgraphy
3
- Version: 1.6.0.dev54
3
+ Version: 1.6.0.dev55
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>