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.
Files changed (363) hide show
  1. {s3dgraphy-1.6.0.dev15/src/s3dgraphy.egg-info → s3dgraphy-1.6.0.dev16}/PKG-INFO +1 -1
  2. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/pyproject.toml +1 -1
  3. s3dgraphy-1.6.0.dev16/src/s3dgraphy/JSON_config/acquisition_mappings/uri.json +22 -0
  4. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_visual_rules.json +2 -1
  5. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/__init__.py +1 -1
  6. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/__init__.py +5 -1
  7. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/acquire.py +12 -2
  8. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/descriptor.py +20 -2
  9. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/acquisition/mapping.py +72 -1
  10. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/api.py +203 -4
  11. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/base_importer.py +32 -6
  12. s3dgraphy-1.6.0.dev16/src/s3dgraphy/importer/xml_importer.py +220 -0
  13. s3dgraphy-1.6.0.dev16/src/s3dgraphy/mappings/authoring.py +881 -0
  14. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/resource_node.py +39 -1
  15. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/shelf/__init__.py +9 -0
  16. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/shelf/core.py +230 -11
  17. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16/src/s3dgraphy.egg-info}/PKG-INFO +1 -1
  18. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/SOURCES.txt +5 -0
  19. s3dgraphy-1.6.0.dev16/tests/test_mapping_authoring.py +483 -0
  20. s3dgraphy-1.6.0.dev16/tests/test_shelf_role_uri_table.py +443 -0
  21. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/LICENSE +0 -0
  22. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/MANIFEST.in +0 -0
  23. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/README.md +0 -0
  24. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/setup.cfg +0 -0
  25. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_descriptor.schema.json +0 -0
  26. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_mappings/ercolano.json +0 -0
  27. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/acquisition_mappings/fs.json +0 -0
  28. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/datamodel_translations.json +0 -0
  29. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em.ttl +0 -0
  30. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_document_types.json +0 -0
  31. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_extractor_types.json +0 -0
  32. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_palette_icons.json +0 -0
  33. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_qualia_types.json +0 -0
  34. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/em_qualia_types_additions.json +0 -0
  35. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/hdto_extension.ttl +0 -0
  36. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/new_qualia_template.json +0 -0
  37. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/node_registry.generated.json +0 -0
  38. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/outdated_s3dgraphy.ttl +0 -0
  39. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/outdated_s3dgraphy_nomapping.ttl +0 -0
  40. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json +0 -0
  41. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_connections_datamodel.json.v155.bak +0 -0
  42. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/s3Dgraphy_node_datamodel.json +0 -0
  43. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/ActivityNodeGroup.svg +0 -0
  44. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.png +0 -0
  45. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EMNarrative.svg +0 -0
  46. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/EpochNode.svg +0 -0
  47. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/ParadataNodeGroup.svg +0 -0
  48. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/RSF.png +0 -0
  49. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/RSF.svg +0 -0
  50. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE.svg +0 -0
  51. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE_old.png +0 -0
  52. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SE_old.svg +0 -0
  53. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SF.png +0 -0
  54. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/SF.svg +0 -0
  55. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/TSU.png +0 -0
  56. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/US.png +0 -0
  57. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/US.svg +0 -0
  58. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USD.png +0 -0
  59. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USD.svg +0 -0
  60. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVn.png +0 -0
  61. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVn.svg +0 -0
  62. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVs.png +0 -0
  63. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/USVs.svg +0 -0
  64. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/UTR.svg +0 -0
  65. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/VSF.png +0 -0
  66. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/VSF.svg +0 -0
  67. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author.png +0 -0
  68. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author.svg +0 -0
  69. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/author_ai.png +0 -0
  70. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/combiner.png +0 -0
  71. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/combiner.svg +0 -0
  72. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/continuity.png +0 -0
  73. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/continuity.svg +0 -0
  74. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/document.png +0 -0
  75. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/document.svg +0 -0
  76. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/00_transformation.svg +0 -0
  77. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/01_topographicnetwork.svg +0 -0
  78. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/02_pointcloud.svg +0 -0
  79. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/03_mesh.svg +0 -0
  80. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/04_points.svg +0 -0
  81. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/05_lines.svg +0 -0
  82. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/06_polygons.svg +0 -0
  83. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/07_DEM.svg +0 -0
  84. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/08_ortophoto.svg +0 -0
  85. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/09_photos.svg +0 -0
  86. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/dtc/10_laserscanner.svg +0 -0
  87. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/embargo.png +0 -0
  88. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/extractor.png +0 -0
  89. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/extractor.svg +0 -0
  90. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/generic_node.svg +0 -0
  91. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/geo_position.svg +0 -0
  92. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/license.png +0 -0
  93. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/link.svg +0 -0
  94. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/narrative.png +0 -0
  95. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/play.svg +0 -0
  96. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/property.png +0 -0
  97. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/property.svg +0 -0
  98. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model.svg +0 -0
  99. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model_doc.svg +0 -0
  100. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/representation_model_sf.svg +0 -0
  101. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/semantic_shape.svg +0 -0
  102. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serSU.png +0 -0
  103. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serSU.svg +0 -0
  104. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSD.png +0 -0
  105. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSV.png +0 -0
  106. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSVn.svg +0 -0
  107. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/2D/serUSVs.svg +0 -0
  108. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/RSF.glb +0 -0
  109. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/SF.glb +0 -0
  110. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/TSU.glb +0 -0
  111. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/US.glb +0 -0
  112. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USD.glb +0 -0
  113. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USVn.glb +0 -0
  114. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/USVs.glb +0 -0
  115. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/VSF.glb +0 -0
  116. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/combiner.glb +0 -0
  117. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/continuity.glb +0 -0
  118. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/document.glb +0 -0
  119. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/extractor.glb +0 -0
  120. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/property.glb +0 -0
  121. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serSU.glb +0 -0
  122. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serUSD.glb +0 -0
  123. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/JSON_config/src/3D/serUSV.glb +0 -0
  124. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/annotation/__init__.py +0 -0
  125. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/annotation/paradata.py +0 -0
  126. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/__init__.py +0 -0
  127. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/resolver.py +0 -0
  128. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/LICENSE +0 -0
  129. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/chronontology.jsonld +0 -0
  130. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/getty_aat.jsonld +0 -0
  131. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/getty_tgn.jsonld +0 -0
  132. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/periodo.jsonld +0 -0
  133. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/authorities/snapshots/provenance.json +0 -0
  134. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/classification.py +0 -0
  135. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/container.py +0 -0
  136. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/__init__.py +0 -0
  137. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/connector.py +0 -0
  138. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/consumer.py +0 -0
  139. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/core.py +0 -0
  140. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/contract/reference.py +0 -0
  141. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/crdt.py +0 -0
  142. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/data/StratiMiner_Extraction_Prompt.md +0 -0
  143. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/diagnostics.py +0 -0
  144. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dissemination.py +0 -0
  145. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/__init__.py +0 -0
  146. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/corpus.py +0 -0
  147. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/ingest.py +0 -0
  148. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/dtc/residency.py +0 -0
  149. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/__init__.py +0 -0
  150. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/connection_resolver.py +0 -0
  151. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/connections_loader.py +0 -0
  152. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/edges/edge.py +0 -0
  153. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/editorial.py +0 -0
  154. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/__init__.py +0 -0
  155. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/docx_exporter.py +0 -0
  156. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/emjson_exporter.py +0 -0
  157. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/__init__.py +0 -0
  158. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/canvas_generator.py +0 -0
  159. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/edge_generator.py +0 -0
  160. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/epoch_generator.py +0 -0
  161. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/graphml_exporter.py +0 -0
  162. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/graphml_patcher.py +0 -0
  163. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/group_node_generator.py +0 -0
  164. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/node_generator.py +0 -0
  165. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/node_registry.py +0 -0
  166. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/palette_resources.py +0 -0
  167. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_generator.py +0 -0
  168. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_image_generator.py +0 -0
  169. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/paradata_node_generators.py +0 -0
  170. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/table_node_generator.py +0 -0
  171. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/graphml/utils.py +0 -0
  172. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/html_exporter.py +0 -0
  173. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/ipynb_exporter.py +0 -0
  174. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/json_exporter.py +0 -0
  175. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/latex_exporter.py +0 -0
  176. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/rdf_exporter.py +0 -0
  177. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/exporter/unified_xlsx_exporter.py +0 -0
  178. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/__init__.py +0 -0
  179. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/migrate.py +0 -0
  180. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/proxy.py +0 -0
  181. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/geometry/store_backed.py +0 -0
  182. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/graph.py +0 -0
  183. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/iiif.py +0 -0
  184. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/__init__.py +0 -0
  185. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/emjson_importer.py +0 -0
  186. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/import_graphml.py +0 -0
  187. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/mapped_xlsx_importer.py +0 -0
  188. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/pyarchinit_importer.py +0 -0
  189. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/qualia_importer.py +0 -0
  190. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/rdf_importer.py +0 -0
  191. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/source_text.py +0 -0
  192. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/unified_xlsx_importer.py +0 -0
  193. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/importer/xlsx_importer.py +0 -0
  194. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/indices.py +0 -0
  195. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/__init__.py +0 -0
  196. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/generic_specialfind_mapping.json +0 -0
  197. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/site_properties_mapping.json +0 -0
  198. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/emdb/usm_mapping.json +0 -0
  199. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/generic/excel_to_graphml_mapping.json +0 -0
  200. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/pyarchinit/pyarchinit_us_mapping.json +0 -0
  201. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/registry.py +0 -0
  202. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/source_list/source_list_mapping.json +0 -0
  203. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/template_emdb_mapping.json +0 -0
  204. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/mappings/template_pyarchinit_mapping.json +0 -0
  205. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/merge/__init__.py +0 -0
  206. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/merge/graph_merger.py +0 -0
  207. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/multigraph/__init__.py +0 -0
  208. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/multigraph/multigraph.py +0 -0
  209. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/__init__.py +0 -0
  210. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/bake.py +0 -0
  211. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/generation.py +0 -0
  212. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/query.py +0 -0
  213. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/registry.py +0 -0
  214. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/narrative/site_story.py +0 -0
  215. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/__init__.py +0 -0
  216. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/annotation_region_node.py +0 -0
  217. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/author_node.py +0 -0
  218. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/base_node.py +0 -0
  219. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/combiner_node.py +0 -0
  220. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/document_node.py +0 -0
  221. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_acquisition_node.py +0 -0
  222. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_node.py +0 -0
  223. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/dtc_process_node.py +0 -0
  224. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/embargo_node.py +0 -0
  225. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/epoch_node.py +0 -0
  226. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/extractor_node.py +0 -0
  227. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/geo_position_node.py +0 -0
  228. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/graph_node.py +0 -0
  229. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/group_node.py +0 -0
  230. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/hdt_node.py +0 -0
  231. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/heritage_entity_node.py +0 -0
  232. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/license_node.py +0 -0
  233. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/narrative_node.py +0 -0
  234. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/paradata_node.py +0 -0
  235. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/project_node.py +0 -0
  236. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/property_node.py +0 -0
  237. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/representation_node.py +0 -0
  238. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/semantic_shape_node.py +0 -0
  239. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/stratigraphic_node.py +0 -0
  240. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/nodes/study_node.py +0 -0
  241. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/publication.py +0 -0
  242. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/__init__.py +0 -0
  243. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/builtin_rules.py +0 -0
  244. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resolvers/property_resolver.py +0 -0
  245. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/__init__.py +0 -0
  246. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/fs_backend.py +0 -0
  247. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/minio_backend.py +0 -0
  248. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/resources/resolver.py +0 -0
  249. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/rights.py +0 -0
  250. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/study.py +0 -0
  251. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/__init__.py +0 -0
  252. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_db_handle.py +0 -0
  253. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_legacy_paradata_svgs.py +0 -0
  254. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/_workspace.py +0 -0
  255. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/conflict_resolver.py +0 -0
  256. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/edge_registry.py +0 -0
  257. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graph_ingestor.py +0 -0
  258. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graph_projector.py +0 -0
  259. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/graphml_writer.py +0 -0
  260. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/group_projector.py +0 -0
  261. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/group_store.py +0 -0
  262. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/ingest_result.py +0 -0
  263. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/paradata_store.py +0 -0
  264. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/pyarchinit_pg_importer.py +0 -0
  265. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/rapporti.py +0 -0
  266. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/uuid7.py +0 -0
  267. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/vocab_provider_core.py +0 -0
  268. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/vocab_types.py +0 -0
  269. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_classifier.py +0 -0
  270. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_detector.py +0 -0
  271. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_group_walker.py +0 -0
  272. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_import_pipeline.py +0 -0
  273. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_rapporti_policy.py +0 -0
  274. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/sync/yed_table_parser.py +0 -0
  275. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/templates/em_data_template.xlsx +0 -0
  276. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/templates/em_palette_template.graphml +0 -0
  277. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/temporal/__init__.py +0 -0
  278. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/temporal/inference_engine.py +0 -0
  279. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/__init__.py +0 -0
  280. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/consumer_drift.py +0 -0
  281. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/datamodel_i18n.py +0 -0
  282. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/sync_node_datamodel.py +0 -0
  283. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/tools/wheel_drift.py +0 -0
  284. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/__init__.py +0 -0
  285. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/aux_tracking.py +0 -0
  286. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/compact.py +0 -0
  287. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/transforms/materialize_continuity.py +0 -0
  288. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/__init__.py +0 -0
  289. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/utils.py +0 -0
  290. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy/utils/visual_layout.py +0 -0
  291. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/dependency_links.txt +0 -0
  292. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/requires.txt +0 -0
  293. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/src/s3dgraphy.egg-info/top_level.txt +0 -0
  294. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_acquisition.py +0 -0
  295. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_acquisition_fs.py +0 -0
  296. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_api_surface.py +0 -0
  297. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_asset_dtc_protocol.py +0 -0
  298. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_authority_projection.py +0 -0
  299. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_authority_resolver.py +0 -0
  300. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_canonical_document_rename.py +0 -0
  301. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_canvas_metadata_import.py +0 -0
  302. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_composite_node_name.py +0 -0
  303. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_connection_resolver.py +0 -0
  304. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_consumer_drift.py +0 -0
  305. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_container.py +0 -0
  306. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_contract.py +0 -0
  307. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_contract_consumer.py +0 -0
  308. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_convert_command.py +0 -0
  309. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_crdt.py +0 -0
  310. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_datamodel_i18n.py +0 -0
  311. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_deterministic_ids.py +0 -0
  312. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dissemination_tombstones.py +0 -0
  313. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_corpus.py +0 -0
  314. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_ingest.py +0 -0
  315. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_projection.py +0 -0
  316. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_dtc_residency.py +0 -0
  317. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_editorial.py +0 -0
  318. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_emjson_roundtrip.py +0 -0
  319. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_emjson_schema_version.py +0 -0
  320. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_epoch_undated_import.py +0 -0
  321. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_explicit_node_type_marker.py +0 -0
  322. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_filtered_import.py +0 -0
  323. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_fs_backend.py +0 -0
  324. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_functional_units.py +0 -0
  325. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_georeference_scene.py +0 -0
  326. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_graph_scope_migration.py +0 -0
  327. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_hdto_projection.py +0 -0
  328. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_header_key_aliases.py +0 -0
  329. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_iiif.py +0 -0
  330. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_importer_edge_hygiene.py +0 -0
  331. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_ipynb_exporter.py +0 -0
  332. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_latex_exporter.py +0 -0
  333. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_lossless_roundtrip.py +0 -0
  334. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_material_color.py +0 -0
  335. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_merge_conflicts.py +0 -0
  336. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_migrate_legacy_proxy.py +0 -0
  337. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_minio_backend.py +0 -0
  338. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_authorship.py +0 -0
  339. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_bake_docx.py +0 -0
  340. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_figures.py +0 -0
  341. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_generation.py +0 -0
  342. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_node.py +0 -0
  343. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_query.py +0 -0
  344. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_narrative_scaffolder.py +0 -0
  345. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_node_datamodel_registry.py +0 -0
  346. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_pg_importer.py +0 -0
  347. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_promotion.py +0 -0
  348. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_pyarchinit_tier2.py +0 -0
  349. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_rdf_roundtrip.py +0 -0
  350. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_recompute_warnings.py +0 -0
  351. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_reproject.py +0 -0
  352. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_resource_layer.py +0 -0
  353. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf.py +0 -0
  354. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf_facets.py +0 -0
  355. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_shelf_hatting.py +0 -0
  356. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_source_list_mapping.py +0 -0
  357. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_source_text.py +0 -0
  358. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_store_backed_geometry.py +0 -0
  359. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_stratiminer_api.py +0 -0
  360. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_study_metadata.py +0 -0
  361. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_ttl_roundtrip.py +0 -0
  362. {s3dgraphy-1.6.0.dev15 → s3dgraphy-1.6.0.dev16}/tests/test_wheel_drift.py +0 -0
  363. {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.dev15
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.dev15"
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
+ }
@@ -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." },
@@ -1,4 +1,4 @@
1
- __version__ = "1.6.0.dev15"
1
+ __version__ = "1.6.0.dev16"
2
2
  __datamodel_version__ = "1.5.5" # s3Dgraphy connections datamodel version
3
3
 
4
4
  # s3Dgraphy/__init__.py
@@ -16,7 +16,8 @@ from .descriptor import (
16
16
  AcquisitionError,
17
17
  schema,
18
18
  )
19
- from .mapping import apply_mapping, available_mappings, fs_record, load_mapping
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
- return {
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) -> Dict[str, Any]:
2064
- """Add a resource to the shelf (reuse-not-duplicate by ``resource_id``);
2065
- ``origin`` = the capability/origin envelope, preserved. Returns the entry."""
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 pd.isna(value):
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
- import pandas as pd
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