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.
- {s3dgraphy-1.6.0.dev46/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev47}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/pyproject.toml +1 -1
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/__init__.py +1 -1
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/api.py +62 -0
- s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/alignment.py +273 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/locate.py +14 -3
- s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/moved.py +149 -0
- s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/object_store.py +174 -0
- s3dgraphy-1.6.0.dev47/src/s3dgraphy/resources/storage_rows.py +163 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/SOURCES.txt +6 -0
- s3dgraphy-1.6.0.dev47/tests/test_bucket_alignment.py +108 -0
- s3dgraphy-1.6.0.dev47/tests/test_storage_rows.py +77 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/MANIFEST.in +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/README.md +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/setup.cfg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em.ttl +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_state_symbols.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/em_visual_rules.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/author_ai.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/container.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_computer.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_drone.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_gnss.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_optical.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_scanner.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_sensor.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/11_device_station.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/12_gnss_survey.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/13_field_drawing.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/14_recording_sheet.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/15_decimation.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/16_georeferencing.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/17_format_conversion.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/18_classification.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/dtc/19_vectorization.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/embargo.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/gcp_set.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/graph.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/license.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/narrative.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/proxy.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/registration_transform.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/resource_file.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/tileset.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_gltf.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_scene.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/2D/version_tiles.svg +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/JSON_config/version_for_cases.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/acquire.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/descriptor.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/acquisition/mapping.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/ai_validation.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/migrate_reading.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/paradata.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/annotation/reading.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/classification.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/container.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/connector.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/consumer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/core.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/contract/reference.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/crdt.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/diagnostics.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dissemination.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/capture.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/corpus.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/devices.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/ingest.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/dtc/residency.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/connections_loader.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/edges/edge.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/editorial.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/html_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/json_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/aton.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/gltf.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/migrate.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/proxy.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/store_backed.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/geometry/wkt.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/graph.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/hdto.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/iiif.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/base_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/csv_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/emjson_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/import_graphml.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/metashape_project.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/qualia_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/rdf_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/sheet_header.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/source_text.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/importer/xml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/indices.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/labels.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/language.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/links.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/authoring.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/registry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/source_list/em_sourcelist_it.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/merge/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/merge/graph_merger.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/multigraph/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/multigraph/multigraph.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/bake.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/generation.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/query.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/registry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/narrative/site_story.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/author_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/base_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/combiner_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/document_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_device_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/embargo_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/epoch_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/extractor_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/georeferencing_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/graph_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/group_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/hdt_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/license_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/paradata_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/project_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/property_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/representation_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/resource_file_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/resource_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/study_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/nodes/translation_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/ownership.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/paradata_view.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/photogrammetry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/photogrammetry/delta.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/project_tree.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/property_source.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/publication.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/addresses.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/files.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/tiles3tz.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/resources/versions.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/rights.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/shelf/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/shelf/core.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/spatiotemporal.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/absorb.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/emit.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/hints.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/stamp/identity.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/study.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_db_handle.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/_workspace.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/edge_registry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graph_projector.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/graphml_writer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/group_projector.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/group_store.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/ingest_result.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/paradata_store.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/uuid7.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/vocab_types.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_classifier.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_detector.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/temporal/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/temporal/inference_engine.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/deliverable_report.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/glyph_sheet.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/glyphs_from_svg.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/node_finder.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/tools/wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/compact.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/translation.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/utils.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/utils/visual_layout.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy/zero_hour.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/requires.txt +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/src/s3dgraphy.egg-info/top_level.txt +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_acquisition_fs.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_add_resource.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ai_validation_nodes.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_alternative_labels.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_api_surface.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_asset_dtc_protocol.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_asset_versions.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_aton_shapes.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_attach_only.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_authority_projection.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_authority_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_blend_locator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_canonical_document_rename.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_canvas_metadata_import.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_capture_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_capture_rdf_class.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_chronology_on_request.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_coating_unit.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_composite_node_name.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_container.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_container_layouts.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_containment_tpq.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_contract.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_contract_consumer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_convert_command.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_crdt.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_cycle_message_is_cheap.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_datamodel_fingerprint.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_deterministic_ids.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_em_sourcelist.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_file_set_stamp.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_graphml_without_a_database.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_image_set_texturing.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_not_georeferenced.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_one_act_n_outputs.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev29_ttl_round_trip.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dev30_decisions.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_devices.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dissemination_tombstones.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dove_sta_il_testo.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_corpus.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_ingest.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_neighbourhood.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_projection.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_dtc_residency.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_edge_outside_graph.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_edge_ui_phrases.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_editorial.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_em_ttl_matches_the_datamodels.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_no_drawing_keys.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_emjson_schema_version.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_epoch_properties_and_sub_epochs.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_epoch_undated_import.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_explicit_node_type_marker.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_extracted_from_unit.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_filtered_import.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_fmpxml_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_functional_units.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_georeference_scene.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_gltf_stitch.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_glyph_paths.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_header_code.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_helpers_indexed.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_indices_alive.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_indices_edges.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_graph_scope_migration.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_hdto_projection.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_hdto_study.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_header_key_aliases.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_i_generi_dei_passi.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_iiif.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_modo_d_accesso.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_modo_dal_relay.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_proprietario_si_legge.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_il_riallineamento.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_importer_edge_hygiene.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_issue27_small_points.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_alla_nascita.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_dei_dati.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_lingua_nell_op.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_la_riga_d_intestazione.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_le_traduzioni.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_lod_levels.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_lossless_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_mapping_authoring.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_mapping_csv_and_relations.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_masonry_unit.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_material_color.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_merge_conflicts.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_metashape_project.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_migrate_legacy_proxy.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_authorship.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_bake_docx.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_figures.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_generation.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_mentions.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_query.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_scaffolder.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_site_place.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_narrative_unvalidated_export.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_datamodel_registry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_finder.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_node_type_map_integrity.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_one_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_one_spelling_writers.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_op_vocabulary.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_photogrammetry_delta.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_physical_relation_spellings.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_piu_indirizzi.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_promotion.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_property_as_source.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_property_owners.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_proxy_resource.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_proxy_retype.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_psx_locator.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_pyarchinit_tier2.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_qualia_dai_d7_d8.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_embedding.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rdf_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_coords.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_glb.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_migration.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_place.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reading_rdf.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_recompute_warnings.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_release.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reproject.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_file_node.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_files_implicit.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_layer.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_representations.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_revision.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_resource_tier.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_reverse_edges.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_rm_container_node_group.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_semantic_purity.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_facets.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_hatting.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shelf_role_uri_table.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_shipped_mappings.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_source_list_mapping.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_source_text.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_spatiotemporal_entities.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stable_study_code.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp_hints.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stamp_title_description.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_store_backed_geometry.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_stratiminer_api.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_study_metadata.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_tileset_resource.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_ttl_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_unit_definition.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_verifica_provenance.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_version_for.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_visual_assets.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_containment_and_unknown_bounds.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_importer_graph_init.py +0 -0
- {s3dgraphy-1.6.0.dev46 → s3dgraphy-1.6.0.dev47}/tests/test_xlsx_source_column.py +0 -0
- {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.
|
|
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.
|
|
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"
|
|
@@ -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
|
-
|
|
175
|
-
|
|
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
|
|
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
|