s3dgraphy 1.6.0.dev15__tar.gz → 1.6.0.dev16__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.dev15/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev16}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/pyproject.toml +1 -1
- s3dgraphy-1.6.0.dev16/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +22 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_visual_rules.json +2 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/__init__.py +1 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/__init__.py +5 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/acquire.py +12 -2
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/descriptor.py +20 -2
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/mapping.py +72 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/api.py +203 -4
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/base_importer.py +32 -6
- s3dgraphy-1.6.0.dev16/src/s3dgraphy/importer/xml_importer.py +220 -0
- s3dgraphy-1.6.0.dev16/src/s3dgraphy/mappings/authoring.py +881 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/resource_node.py +39 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/shelf/__init__.py +9 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/shelf/core.py +230 -11
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/SOURCES.txt +5 -0
- s3dgraphy-1.6.0.dev16/tests/test_mapping_authoring.py +483 -0
- s3dgraphy-1.6.0.dev16/tests/test_shelf_role_uri_table.py +443 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/MANIFEST.in +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/README.md +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/setup.cfg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em.ttl +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/annotation/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/annotation/paradata.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/classification.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/container.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/connector.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/consumer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/core.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/reference.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/crdt.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/diagnostics.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dissemination.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/corpus.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/ingest.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/residency.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/connections_loader.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/edge.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/editorial.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/html_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/json_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/migrate.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/proxy.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/store_backed.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/graph.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/iiif.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/emjson_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/import_graphml.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/qualia_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/rdf_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/source_text.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/indices.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/registry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/merge/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/merge/graph_merger.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/multigraph/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/multigraph/multigraph.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/bake.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/generation.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/query.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/registry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/site_story.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/author_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/base_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/combiner_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/document_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/embargo_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/epoch_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/extractor_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/graph_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/group_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/hdt_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/license_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/paradata_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/project_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/property_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/representation_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/study_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/publication.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/rights.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/study.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_db_handle.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_workspace.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/edge_registry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graph_projector.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graphml_writer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/group_projector.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/group_store.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/ingest_result.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/paradata_store.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/rapporti.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/uuid7.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/vocab_types.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_classifier.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_detector.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/temporal/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/temporal/inference_engine.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/compact.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/__init__.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/utils.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/visual_layout.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/requires.txt +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/top_level.txt +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_acquisition.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_acquisition_fs.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_api_surface.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_asset_dtc_protocol.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_authority_projection.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_authority_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_canonical_document_rename.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_canvas_metadata_import.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_composite_node_name.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_connection_resolver.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_consumer_drift.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_container.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_contract.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_contract_consumer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_convert_command.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_crdt.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_datamodel_i18n.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_deterministic_ids.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dissemination_tombstones.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_corpus.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_ingest.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_projection.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_residency.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_editorial.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_emjson_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_emjson_schema_version.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_epoch_undated_import.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_explicit_node_type_marker.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_filtered_import.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_fs_backend.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_functional_units.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_georeference_scene.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_graph_scope_migration.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_hdto_projection.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_header_key_aliases.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_iiif.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_importer_edge_hygiene.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_ipynb_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_latex_exporter.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_lossless_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_material_color.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_merge_conflicts.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_migrate_legacy_proxy.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_minio_backend.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_authorship.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_bake_docx.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_figures.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_generation.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_node.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_query.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_scaffolder.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_node_datamodel_registry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_pg_importer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_promotion.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_pyarchinit_tier2.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_rdf_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_recompute_warnings.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_reproject.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_resource_layer.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf_facets.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf_hatting.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_source_list_mapping.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_source_text.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_store_backed_geometry.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_stratiminer_api.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_study_metadata.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_ttl_roundtrip.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_wheel_drift.py +0 -0
- {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_xlsx_importer_graph_init.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.dev16
|
|
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.dev16"
|
|
8
8
|
description = "3D Stratigraphic Graph Management Library for archaeological and heritage applications"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mapping_version": "0",
|
|
3
|
+
"source": "uri",
|
|
4
|
+
"tier": 0,
|
|
5
|
+
"_comment": "Per-source acquisition mapping for a BARE URI — the asset nobody downloads. Somebody pastes a link (a IIIF manifest, a Zenodo record, a Sketchfab model, a colleague's WebDAV folder) and what enters the shelf is the URI plus the protocol you reach it through: asset.access = {mode: subscribe|open, endpoint?}. NO BYTES ARE COPIED and no object store is touched — that is the whole point of this mapping, and the difference from fs.json, which acquires a local file. Build the raw record with s3dgraphy.acquisition.uri_record(uri, protocol=..., access=...), then apply_mapping('uri', record). The acquisition method is uri_reference: the URI is what was acquired, not the object, and calling it 'download' would record a retrieval that never happened.",
|
|
6
|
+
"descriptor_defaults": {
|
|
7
|
+
"schema_version": "0",
|
|
8
|
+
"source": {"repo_id": "uri", "capabilities": []},
|
|
9
|
+
"acquisition": {"agent": "emtools-shelf@0", "method": "uri_reference"},
|
|
10
|
+
"rights": {"license": "unknown"}
|
|
11
|
+
},
|
|
12
|
+
"field_map": {
|
|
13
|
+
"asset.ref": "uri",
|
|
14
|
+
"asset.name": "name",
|
|
15
|
+
"asset.media_type": "media_type",
|
|
16
|
+
"asset.access": "access",
|
|
17
|
+
"asset.protocol": "protocol",
|
|
18
|
+
"source.repo_id": "repo_id",
|
|
19
|
+
"source.record_id": "record_id",
|
|
20
|
+
"source.record_url": "record_url"
|
|
21
|
+
}
|
|
22
|
+
}
|
{s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_visual_rules.json
RENAMED
|
@@ -840,7 +840,8 @@
|
|
|
840
840
|
"acquisition": {
|
|
841
841
|
"download": { "label": "Download", "glyph": null, "description": "Retrieval of a digital object from a remote (opaque, Tier-0) repository." },
|
|
842
842
|
"ingest": { "label": "Ingest", "glyph": null, "description": "Generic ingestion of a digital object into the study." },
|
|
843
|
-
"local_import": { "label": "Local import", "glyph": null, "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition." }
|
|
843
|
+
"local_import": { "label": "Local import", "glyph": null, "description": "Acquisition from the local file system (project-folder search) — the local analog of remote acquisition." },
|
|
844
|
+
"uri_reference": { "label": "URI reference", "glyph": null, "description": "The URI was acquired, not the object: the resource stays where it is and is reached through its own access protocol (an open link, or one you subscribe to). No bytes were copied — calling this a download would record a retrieval that never happened." }
|
|
844
845
|
},
|
|
845
846
|
"output": {
|
|
846
847
|
"pointcloud": { "label": "Point cloud", "glyph": "02_pointcloud", "description": "Produced point cloud." },
|
|
@@ -16,7 +16,8 @@ from .descriptor import (
|
|
|
16
16
|
AcquisitionError,
|
|
17
17
|
schema,
|
|
18
18
|
)
|
|
19
|
-
from .mapping import apply_mapping, available_mappings,
|
|
19
|
+
from .mapping import (ACCESS_MODES, apply_mapping, available_mappings,
|
|
20
|
+
fs_record, load_mapping, uri_record)
|
|
20
21
|
from .acquire import acquire_from_descriptor
|
|
21
22
|
|
|
22
23
|
__all__ = [
|
|
@@ -28,5 +29,8 @@ __all__ = [
|
|
|
28
29
|
"apply_mapping",
|
|
29
30
|
"available_mappings",
|
|
30
31
|
"fs_record",
|
|
32
|
+
# the asset nobody downloads: a URI plus how you reach it
|
|
33
|
+
"uri_record",
|
|
34
|
+
"ACCESS_MODES",
|
|
31
35
|
"acquire_from_descriptor",
|
|
32
36
|
]
|
|
@@ -92,9 +92,19 @@ def acquire_from_descriptor(descriptor: Any, shelf: Any = None
|
|
|
92
92
|
name = desc.asset.get("name") or (ref.rstrip("/").rsplit("/", 1)[-1] if ref else rid[:8])
|
|
93
93
|
origin = desc.origin()
|
|
94
94
|
|
|
95
|
-
# 1) Resource on the shelf (reuse-not-duplicate; origin preserved)
|
|
95
|
+
# 1) Resource on the shelf (reuse-not-duplicate; origin preserved).
|
|
96
|
+
#
|
|
97
|
+
# `media_type` / `size` / `access` are written only when the descriptor
|
|
98
|
+
# carried them — the fs mapping knows a file's size, a bare URI does not, and
|
|
99
|
+
# a resource that never said its size must not start claiming zero. They are
|
|
100
|
+
# here because they are what the shelf TABLE shows: without them the column
|
|
101
|
+
# would be empty for every entry and a reader would think the shelf lost it.
|
|
96
102
|
entry = add_to_shelf(shelf, ref, resource_id=rid, name=name,
|
|
97
|
-
resource_type=_resource_type(desc), origin=origin
|
|
103
|
+
resource_type=_resource_type(desc), origin=origin,
|
|
104
|
+
media_type=desc.asset.get("media_type") or None,
|
|
105
|
+
size=desc.asset.get("size") or None,
|
|
106
|
+
access=origin.get("access"),
|
|
107
|
+
role=desc.asset.get("role") or None)
|
|
98
108
|
|
|
99
109
|
# 2) acquisition event — a distinct DTC event type (crmdig:D12), literals for
|
|
100
110
|
# the opaque upstream source (Tier 0: no genesis sub-graph)
|
|
@@ -97,9 +97,27 @@ class AcquisitionDescriptor:
|
|
|
97
97
|
|
|
98
98
|
def origin(self) -> Dict[str, Any]:
|
|
99
99
|
"""The capability/origin envelope carried onto the shelf entry (for
|
|
100
|
-
downstream tier badges): repo + capabilities + scope
|
|
101
|
-
|
|
100
|
+
downstream tier badges): repo + capabilities + scope, and — when the
|
|
101
|
+
asset says so — how it is REACHED.
|
|
102
|
+
|
|
103
|
+
``access`` rides in the origin rather than in a channel of its own
|
|
104
|
+
because that is exactly what it is: a fact about where this resource came
|
|
105
|
+
from and how to get back to it. A URI-only entry has no bytes here, so
|
|
106
|
+
its origin is the only place that can answer "and how do I open it?".
|
|
107
|
+
"""
|
|
108
|
+
out: Dict[str, Any] = {
|
|
102
109
|
"repo": self.source.get("repo_id"),
|
|
103
110
|
"capabilities": self.capabilities(),
|
|
104
111
|
"scope": (self.payload_graph or {}).get("scope"), # None in Tier 0
|
|
105
112
|
}
|
|
113
|
+
access = self.asset.get("access")
|
|
114
|
+
if access:
|
|
115
|
+
out["access"] = (dict(access) if isinstance(access, dict)
|
|
116
|
+
else {"mode": str(access)})
|
|
117
|
+
if self.asset.get("protocol"):
|
|
118
|
+
out["protocol"] = self.asset.get("protocol")
|
|
119
|
+
return out
|
|
120
|
+
|
|
121
|
+
def access(self) -> Optional[Dict[str, Any]]:
|
|
122
|
+
"""``{mode, endpoint?}`` when the asset declared how it is reached."""
|
|
123
|
+
return self.origin().get("access")
|
|
@@ -25,7 +25,7 @@ from __future__ import annotations
|
|
|
25
25
|
import copy
|
|
26
26
|
import json
|
|
27
27
|
from pathlib import Path
|
|
28
|
-
from typing import Any, Dict
|
|
28
|
+
from typing import Any, Dict, Optional
|
|
29
29
|
|
|
30
30
|
_MAPPINGS_DIR = (Path(__file__).resolve().parent.parent
|
|
31
31
|
/ "JSON_config" / "acquisition_mappings")
|
|
@@ -83,6 +83,77 @@ _FS_MEDIA_TYPES = {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
#: How you get to a resource you did not copy. TWO modes, because the practical
|
|
87
|
+
#: question a colleague asks is binary: can I click this, or do I have to ask
|
|
88
|
+
#: for access?
|
|
89
|
+
#:
|
|
90
|
+
#: * ``open`` — the link is freely reachable;
|
|
91
|
+
#: * ``subscribe`` — you subscribe/register/are granted access first (an
|
|
92
|
+
#: institutional repository, a shared drive, a IIIF endpoint behind a login).
|
|
93
|
+
#:
|
|
94
|
+
#: This is deliberately NOT a rights statement: `rights.license` says what you
|
|
95
|
+
#: may do with the object, `access.mode` says whether you can reach it at all.
|
|
96
|
+
#: A CC-BY image behind a login is both, and conflating them would make one of
|
|
97
|
+
#: the two unaskable.
|
|
98
|
+
ACCESS_MODES = ("open", "subscribe")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def uri_record(uri: str, *, protocol: Optional[str] = None,
|
|
102
|
+
access: Optional[Any] = None, name: Optional[str] = None,
|
|
103
|
+
media_type: Optional[str] = None,
|
|
104
|
+
repo_id: Optional[str] = None) -> Dict[str, Any]:
|
|
105
|
+
"""Build a raw record for the ``uri`` mapping from a bare **URI**.
|
|
106
|
+
|
|
107
|
+
The asset nobody downloads: somebody pastes a link and what enters the shelf
|
|
108
|
+
is the URI plus the protocol it is reached through. **No bytes are copied**
|
|
109
|
+
and no object store is touched — that is the point, and the difference from
|
|
110
|
+
:func:`fs_record`.
|
|
111
|
+
|
|
112
|
+
``access`` is ``{"mode": "open"|"subscribe", "endpoint": …}``, or just the
|
|
113
|
+
mode as a string (the common case). ``record_id`` is the URI itself, so
|
|
114
|
+
re-acquiring the same link lands on the same stable Resource id and the shelf
|
|
115
|
+
does not grow a second entry — the idempotence the fs record gets from the
|
|
116
|
+
absolute path.
|
|
117
|
+
|
|
118
|
+
Returns ``{uri, name, protocol, media_type, access, repo_id, record_id,
|
|
119
|
+
record_url}``.
|
|
120
|
+
"""
|
|
121
|
+
import mimetypes
|
|
122
|
+
from urllib.parse import urlsplit
|
|
123
|
+
|
|
124
|
+
text = (uri or "").strip()
|
|
125
|
+
if not text:
|
|
126
|
+
raise ValueError("a URI-only entry needs a URI")
|
|
127
|
+
parts = urlsplit(text)
|
|
128
|
+
scheme = (protocol or parts.scheme or "").lower() or "http"
|
|
129
|
+
if isinstance(access, str):
|
|
130
|
+
access = {"mode": access}
|
|
131
|
+
access = dict(access or {})
|
|
132
|
+
mode = str(access.get("mode") or "open").lower()
|
|
133
|
+
if mode not in ACCESS_MODES:
|
|
134
|
+
raise ValueError(f"access.mode must be one of {list(ACCESS_MODES)}, "
|
|
135
|
+
f"got {access.get('mode')!r}")
|
|
136
|
+
access["mode"] = mode
|
|
137
|
+
tail = parts.path.rstrip("/").rsplit("/", 1)[-1]
|
|
138
|
+
guessed = media_type or (_FS_MEDIA_TYPES.get(tail.rsplit(".", 1)[-1].lower())
|
|
139
|
+
if "." in tail else None) \
|
|
140
|
+
or (mimetypes.guess_type(tail)[0] if "." in tail else None) or ""
|
|
141
|
+
return {
|
|
142
|
+
"uri": text,
|
|
143
|
+
# The host is the honest name when the tail is not a filename: a record
|
|
144
|
+
# page ends in an id, and "12345" is not what anybody is looking for.
|
|
145
|
+
"name": name or (tail if "." in tail else (parts.netloc or text)),
|
|
146
|
+
"protocol": scheme,
|
|
147
|
+
"media_type": guessed,
|
|
148
|
+
"access": access,
|
|
149
|
+
# …and the repo is the HOST unless told otherwise, so two links from the
|
|
150
|
+
# same institution group together without anybody configuring a repo.
|
|
151
|
+
"repo_id": repo_id or (parts.netloc or "uri"),
|
|
152
|
+
"record_id": text,
|
|
153
|
+
"record_url": text,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
86
157
|
def fs_record(path: str) -> Dict[str, Any]:
|
|
87
158
|
"""Build a raw FILE-SYSTEM record for the ``fs`` mapping from a local ``path``:
|
|
88
159
|
``{filename, path, record_id, record_url, size, ext, media_type}``. The local
|
|
@@ -2060,13 +2060,80 @@ def add_to_shelf(shelf: Graph, locator: str, *, resource_id: Optional[str] = Non
|
|
|
2060
2060
|
name: Optional[str] = None, url_type: Optional[str] = None,
|
|
2061
2061
|
description: Optional[str] = None,
|
|
2062
2062
|
resource_type: Optional[str] = None,
|
|
2063
|
-
origin: Optional[Dict[str, Any]] = None
|
|
2064
|
-
|
|
2065
|
-
|
|
2063
|
+
origin: Optional[Dict[str, Any]] = None,
|
|
2064
|
+
checksum: Optional[str] = None,
|
|
2065
|
+
scope: Optional[str] = None,
|
|
2066
|
+
residency: Optional[str] = None,
|
|
2067
|
+
role: Optional[str] = None,
|
|
2068
|
+
media_type: Optional[str] = None,
|
|
2069
|
+
size: Optional[int] = None,
|
|
2070
|
+
access: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
2071
|
+
"""Add a resource to the shelf (reuse-not-duplicate by ``resource_id`` **or**
|
|
2072
|
+
by ``checksum`` — the same bytes are the same resource); ``origin`` = the
|
|
2073
|
+
capability/origin envelope, preserved. Returns the entry.
|
|
2074
|
+
|
|
2075
|
+
The shelf's own axes are optional and written ONLY when given, because absent
|
|
2076
|
+
means unstated:
|
|
2077
|
+
|
|
2078
|
+
* ``scope`` — the three fences (``own-study`` / ``own-HDT`` / ``other-HDT``);
|
|
2079
|
+
* ``residency`` — ``reference`` (it stays at home) / ``resident`` (I copied it);
|
|
2080
|
+
* ``role`` — what it is FOR: ``comparandum`` / ``internal_source``.
|
|
2081
|
+
**Orthogonal to the other two**: an own-study asset can be a comparandum
|
|
2082
|
+
and an external URI can be a source inside this study's argument, so this
|
|
2083
|
+
is stated and never derived from the fence.
|
|
2084
|
+
|
|
2085
|
+
(These four were already the core's; the api simply did not pass them on, so
|
|
2086
|
+
a caller on this surface could not state a fence at all.)"""
|
|
2066
2087
|
from .shelf import add_to_shelf as _a
|
|
2067
2088
|
return _a(shelf, locator, resource_id=resource_id, name=name,
|
|
2068
2089
|
url_type=url_type, description=description,
|
|
2069
|
-
resource_type=resource_type, origin=origin
|
|
2090
|
+
resource_type=resource_type, origin=origin, checksum=checksum,
|
|
2091
|
+
scope=scope, residency=residency, role=role,
|
|
2092
|
+
media_type=media_type, size=size, access=access)
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
def resource_roles() -> Tuple[str, ...]:
|
|
2096
|
+
"""The two roles a shelf entry may declare, from the class that validates
|
|
2097
|
+
them — so a UI enumerates instead of hardcoding: ``("comparandum",
|
|
2098
|
+
"internal_source")``. Deliberately two; a third case gets declared."""
|
|
2099
|
+
from .nodes.resource_node import ResourceNode
|
|
2100
|
+
return tuple(ResourceNode.ROLES)
|
|
2101
|
+
|
|
2102
|
+
|
|
2103
|
+
def shelf_entry_status(subject: Any, resource_id: str) -> Dict[str, Any]:
|
|
2104
|
+
"""``{resource_id, in_use, role, mode, used_by}`` for one shelf entry.
|
|
2105
|
+
|
|
2106
|
+
``subject`` is a Container (the honest unit — a resource is hatted into a
|
|
2107
|
+
STUDY graph while it sits on the SHELF), a Graph, or a list of them.
|
|
2108
|
+
|
|
2109
|
+
DERIVED, not stored: ``in_use`` is the hatting reference-check (the same one
|
|
2110
|
+
the remove-cleanup trusts), and ``mode`` is that fact spelled for a badge
|
|
2111
|
+
(``used_in_graph`` / ``only_shelf``). A stored flag would be wrong the first
|
|
2112
|
+
time somebody deleted the RM that used a photograph."""
|
|
2113
|
+
from .shelf import shelf_entry_status as _s
|
|
2114
|
+
return _s(subject, resource_id)
|
|
2115
|
+
|
|
2116
|
+
|
|
2117
|
+
def shelf_table(subject: Any, shelf: Optional[Graph] = None
|
|
2118
|
+
) -> List[Dict[str, Any]]:
|
|
2119
|
+
"""The shelf as **EM Data rows** — one dict per entry, keyed by
|
|
2120
|
+
:func:`shelf_table_columns`.
|
|
2121
|
+
|
|
2122
|
+
A read-model in the em_data formalism (typed columns, like the Units/Epochs/
|
|
2123
|
+
Documents sheets), derived from the ShelfGraph on every call: change the
|
|
2124
|
+
shelf and the table changes. It is NOT a sheet of ``em_data.xlsx`` — that
|
|
2125
|
+
importer fails fast on a missing sheet, so adding one would invalidate every
|
|
2126
|
+
workbook that exists; the shelf's round-trip is the em.json, which already
|
|
2127
|
+
carries it."""
|
|
2128
|
+
from .shelf import shelf_table as _t
|
|
2129
|
+
return _t(subject, shelf)
|
|
2130
|
+
|
|
2131
|
+
|
|
2132
|
+
def shelf_table_columns() -> Tuple[str, ...]:
|
|
2133
|
+
"""The Shelf sheet's columns, in reading order (what it is → what it is for →
|
|
2134
|
+
where it lives). Same role as :func:`em_data_columns` for the other sheets."""
|
|
2135
|
+
from .shelf import SHELF_COLUMNS
|
|
2136
|
+
return tuple(SHELF_COLUMNS)
|
|
2070
2137
|
|
|
2071
2138
|
|
|
2072
2139
|
def list_shelf(shelf: Graph) -> List[Dict[str, Any]]:
|
|
@@ -2240,12 +2307,144 @@ def fs_acquisition_record(path: str) -> Dict[str, Any]:
|
|
|
2240
2307
|
return fs_record(path)
|
|
2241
2308
|
|
|
2242
2309
|
|
|
2310
|
+
def uri_acquisition_record(uri: str, *, protocol: Optional[str] = None,
|
|
2311
|
+
access: Any = None, name: Optional[str] = None,
|
|
2312
|
+
media_type: Optional[str] = None,
|
|
2313
|
+
repo_id: Optional[str] = None) -> Dict[str, Any]:
|
|
2314
|
+
"""Build a raw record for the ``uri`` mapping from a **bare URI** — the asset
|
|
2315
|
+
nobody downloads.
|
|
2316
|
+
|
|
2317
|
+
Somebody pastes a link and what enters the shelf is the URI plus the protocol
|
|
2318
|
+
it is reached through: ``access = {"mode": "open"|"subscribe", "endpoint"?}``
|
|
2319
|
+
(or just the mode as a string). **No bytes are copied and no object store is
|
|
2320
|
+
touched** — that is the point, and the difference from
|
|
2321
|
+
:func:`fs_acquisition_record`.
|
|
2322
|
+
|
|
2323
|
+
Feed it to :func:`apply_acquisition_mapping` with ``"uri"`` and then to
|
|
2324
|
+
:func:`acquire_from_descriptor`: the resource id is derived from the URI, so
|
|
2325
|
+
pasting the same link twice does not grow a second entry."""
|
|
2326
|
+
from .acquisition import uri_record
|
|
2327
|
+
return uri_record(uri, protocol=protocol, access=access, name=name,
|
|
2328
|
+
media_type=media_type, repo_id=repo_id)
|
|
2329
|
+
|
|
2330
|
+
|
|
2331
|
+
def access_modes() -> Tuple[str, ...]:
|
|
2332
|
+
"""How a URI-only resource is reached: ``("open", "subscribe")``. Not a
|
|
2333
|
+
rights statement — ``rights.license`` says what you may DO with the object,
|
|
2334
|
+
this says whether you can reach it at all."""
|
|
2335
|
+
from .acquisition import ACCESS_MODES
|
|
2336
|
+
return tuple(ACCESS_MODES)
|
|
2337
|
+
|
|
2338
|
+
|
|
2243
2339
|
def acquisition_schema() -> Dict[str, Any]:
|
|
2244
2340
|
"""The canonical AcquisitionDescriptor JSON Schema (versioned)."""
|
|
2245
2341
|
from .acquisition import schema
|
|
2246
2342
|
return schema()
|
|
2247
2343
|
|
|
2248
2344
|
|
|
2345
|
+
# ── MAPPING AUTHORING: the surface a mapping EDITOR is built on ──────────────
|
|
2346
|
+
#
|
|
2347
|
+
# The RICH mapping layer, not the acquisition one (`apply_acquisition_mapping`
|
|
2348
|
+
# above is the other thing, and the two must not be confused — see
|
|
2349
|
+
# `mappings/authoring.py`'s docstring). These five functions are what EMStudio's
|
|
2350
|
+
# mapping editor calls over the bridge, and what a chatbot or a script calls
|
|
2351
|
+
# directly: one surface, three consumers, no second implementation of "what may
|
|
2352
|
+
# this field become".
|
|
2353
|
+
|
|
2354
|
+
def mapping_source_fields(path: str, *, format_type: Optional[str] = None,
|
|
2355
|
+
table: Optional[str] = None,
|
|
2356
|
+
record_path: Optional[str] = None,
|
|
2357
|
+
samples: int = 3) -> Dict[str, Any]:
|
|
2358
|
+
"""What is in a source, with EXAMPLE VALUES — the list an editor draws.
|
|
2359
|
+
|
|
2360
|
+
A table gives columns; an XML gives paths (`@id`, `rapporti/copre`) plus the
|
|
2361
|
+
repeated elements that are candidates for one RECORD. Samples are the point:
|
|
2362
|
+
half the columns in an archaeological table are called `d_interpretativa`,
|
|
2363
|
+
and the only way to know what one holds is to look at three of its values."""
|
|
2364
|
+
from .mappings.authoring import source_fields
|
|
2365
|
+
return source_fields(path, format_type=format_type, table=table,
|
|
2366
|
+
record_path=record_path, samples=samples)
|
|
2367
|
+
|
|
2368
|
+
|
|
2369
|
+
def mapping_target_catalog(*, include_direct: bool = True) -> List[Dict[str, Any]]:
|
|
2370
|
+
"""The CIDOC classes a field may be mapped to, each already resolved to the
|
|
2371
|
+
EM node type that implements it — or marked `cidoc_direct` when none does.
|
|
2372
|
+
|
|
2373
|
+
CIDOC-first with the retro-map (E.D. 2026-08-24): the bridge between the two
|
|
2374
|
+
vocabularies is not a new table, it is the `mapping.cidoc` field the
|
|
2375
|
+
datamodels already declare for every type, read backwards."""
|
|
2376
|
+
from .mappings.authoring import target_catalog
|
|
2377
|
+
return target_catalog(include_direct=include_direct)
|
|
2378
|
+
|
|
2379
|
+
|
|
2380
|
+
def mapping_cidoc_index() -> Dict[str, Any]:
|
|
2381
|
+
"""The raw inverse index: `{cidoc_class → [candidates]}` and
|
|
2382
|
+
`{cidoc_property → [edges]}`, plus the edges mapped only through an
|
|
2383
|
+
extension property. Many-to-one on purpose — one CIDOC class can be the
|
|
2384
|
+
reading of several EM types."""
|
|
2385
|
+
from .mappings.authoring import cidoc_index
|
|
2386
|
+
return cidoc_index()
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
def mapping_allowed_edges(source_type: Optional[str] = None,
|
|
2390
|
+
target_type: Optional[str] = None
|
|
2391
|
+
) -> List[Dict[str, Any]]:
|
|
2392
|
+
"""The edges the datamodel allows between two node types, with their CIDOC
|
|
2393
|
+
property. THE SAME `allowed_connections` the canvas's edge picker reads, so a
|
|
2394
|
+
relation authored in a mapping cannot be one the graph would refuse."""
|
|
2395
|
+
from .mappings.authoring import allowed_edges
|
|
2396
|
+
return allowed_edges(source_type, target_type)
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
def mapping_validate(mapping: Dict[str, Any]) -> Dict[str, Any]:
|
|
2400
|
+
"""`{ok, errors, warnings}` for a mapping — structural AND datamodel-checked:
|
|
2401
|
+
a relation whose edge is not allowed between the two resolved types is an
|
|
2402
|
+
ERROR here rather than a failure at import time, long after the person who
|
|
2403
|
+
authored it left the screen."""
|
|
2404
|
+
from .mappings.authoring import validate_mapping
|
|
2405
|
+
return validate_mapping(mapping)
|
|
2406
|
+
|
|
2407
|
+
|
|
2408
|
+
def mapping_normalize(mapping: Dict[str, Any]) -> Dict[str, Any]:
|
|
2409
|
+
"""A copy of the mapping with its CIDOC choices resolved to EM node types
|
|
2410
|
+
(and the ones nothing implements marked `cidoc_direct`)."""
|
|
2411
|
+
from .mappings.authoring import normalize_mapping
|
|
2412
|
+
return normalize_mapping(mapping)
|
|
2413
|
+
|
|
2414
|
+
|
|
2415
|
+
def mapping_apply(mapping: Dict[str, Any], source: str, *, graph: Any = None,
|
|
2416
|
+
mode: str = "volatile", mapping_name: Optional[str] = None
|
|
2417
|
+
) -> Dict[str, Any]:
|
|
2418
|
+
"""Run a mapping over a source: `mode="volatile"` (an auxiliary in the graph,
|
|
2419
|
+
out of the saved document until a bake) or `mode="bake"` (written in).
|
|
2420
|
+
|
|
2421
|
+
Named `mapping_apply` and not `apply_mapping` on purpose: this surface
|
|
2422
|
+
already has `apply_acquisition_mapping`, and two different acts sharing one
|
|
2423
|
+
verb is how somebody ends up calling the wrong one. The module-level function
|
|
2424
|
+
IS `apply_mapping` (`mappings.authoring`), where there is no ambiguity."""
|
|
2425
|
+
from .mappings.authoring import apply_mapping
|
|
2426
|
+
return apply_mapping(mapping, source, graph=graph, mode=mode,
|
|
2427
|
+
mapping_name=mapping_name)
|
|
2428
|
+
|
|
2429
|
+
|
|
2430
|
+
def mapping_property_node_type() -> str:
|
|
2431
|
+
"""The node type a PROPERTY column produces, read from the datamodel — so an
|
|
2432
|
+
editor says "this field is a property" without typing a class name."""
|
|
2433
|
+
from .mappings.authoring import property_node_type
|
|
2434
|
+
return property_node_type()
|
|
2435
|
+
|
|
2436
|
+
|
|
2437
|
+
def mapping_schema_version() -> str:
|
|
2438
|
+
from .mappings.authoring import SCHEMA_VERSION
|
|
2439
|
+
return SCHEMA_VERSION
|
|
2440
|
+
|
|
2441
|
+
|
|
2442
|
+
def mapping_formats() -> Tuple[str, ...]:
|
|
2443
|
+
"""The source formats a mapping can describe."""
|
|
2444
|
+
from .mappings.authoring import FORMATS
|
|
2445
|
+
return tuple(FORMATS)
|
|
2446
|
+
|
|
2447
|
+
|
|
2249
2448
|
# ── connection resolution: REPORT-ONLY (S1) ───────────────────────────────────
|
|
2250
2449
|
# `Graph.validate_connection` is permissive by construction (it resolves the
|
|
2251
2450
|
# datamodel's CLASS names through the node_type-keyed map). These two ops measure
|
|
@@ -15,6 +15,36 @@ from typing import Dict, Any, Optional
|
|
|
15
15
|
# Configurazione logging opzionale per debug
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
18
|
+
def _isna(value) -> bool:
|
|
19
|
+
"""Is this a missing value? — WITHOUT requiring pandas.
|
|
20
|
+
|
|
21
|
+
The two row-cleaning helpers below used `pd.isna`, and that made the whole
|
|
22
|
+
mapping layer depend on pandas even for sources that have nothing to do with
|
|
23
|
+
a dataframe. Measured: applying an **XML** mapping through the em-bridge
|
|
24
|
+
failed with `No module named 'pandas'` on every record — and the bridge
|
|
25
|
+
sidecar excludes pandas ON PURPOSE (it is a 12 MB dependency for the xlsx
|
|
26
|
+
path alone, see EMStudio's `build-bridge.sh`). So an XML import was
|
|
27
|
+
impossible in exactly the build meant to run it.
|
|
28
|
+
|
|
29
|
+
pandas is still used when it is THERE, because it knows about `NaT`, masked
|
|
30
|
+
values and numpy scalars, and a hand-rolled check would quietly disagree with
|
|
31
|
+
it on a dataframe. Absent, the float-NaN identity (`x != x`) is the whole of
|
|
32
|
+
what a non-dataframe source can produce.
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
import pandas as pd # noqa: PLC0415 — optional
|
|
36
|
+
except ImportError:
|
|
37
|
+
return value != value if isinstance(value, float) else False
|
|
38
|
+
try:
|
|
39
|
+
result = pd.isna(value)
|
|
40
|
+
except (TypeError, ValueError):
|
|
41
|
+
return False
|
|
42
|
+
# pd.isna on a list/array answers elementwise; a row value that is a
|
|
43
|
+
# sequence is not "missing", and `bool(array)` would raise
|
|
44
|
+
return bool(result) if isinstance(result, bool) or getattr(
|
|
45
|
+
result, "ndim", 0) == 0 else False
|
|
46
|
+
|
|
47
|
+
|
|
18
48
|
class BaseImporter(ABC):
|
|
19
49
|
"""
|
|
20
50
|
Abstract base class for all importers.
|
|
@@ -250,11 +280,9 @@ class BaseImporter(ABC):
|
|
|
250
280
|
|
|
251
281
|
def _is_invalid_id(self, value) -> bool:
|
|
252
282
|
"""Check if a value is invalid (NaN, None, empty string)."""
|
|
253
|
-
import pandas as pd
|
|
254
|
-
|
|
255
283
|
if value is None:
|
|
256
284
|
return True
|
|
257
|
-
if
|
|
285
|
+
if _isna(value):
|
|
258
286
|
return True
|
|
259
287
|
if str(value).strip() == '':
|
|
260
288
|
return True
|
|
@@ -265,9 +293,7 @@ class BaseImporter(ABC):
|
|
|
265
293
|
|
|
266
294
|
def _clean_value_for_ui(self, value):
|
|
267
295
|
"""Clean any value to be safe for Blender UI (always returns string)."""
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if value is None or pd.isna(value):
|
|
296
|
+
if value is None or _isna(value):
|
|
271
297
|
return ""
|
|
272
298
|
|
|
273
299
|
# Convert to string and clean
|