cognite-neat 0.98.0__tar.gz → 0.99.1__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.

Potentially problematic release.


This version of cognite-neat might be problematic. Click here for more details.

Files changed (304) hide show
  1. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/PKG-INFO +3 -3
  2. cognite_neat-0.99.1/cognite/neat/_client/__init__.py +4 -0
  3. cognite_neat-0.99.1/cognite/neat/_client/_api/data_modeling_loaders.py +585 -0
  4. cognite_neat-0.99.1/cognite/neat/_client/_api/schema.py +111 -0
  5. cognite_neat-0.99.1/cognite/neat/_client/_api_client.py +17 -0
  6. cognite_neat-0.98.0/cognite/neat/_utils/cdf/data_classes.py → cognite_neat-0.99.1/cognite/neat/_client/data_classes/data_modeling.py +8 -135
  7. cognite_neat-0.99.1/cognite/neat/_client/data_classes/schema.py +495 -0
  8. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_constants.py +27 -4
  9. cognite_neat-0.99.1/cognite/neat/_graph/_shared.py +33 -0
  10. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_assets.py +37 -0
  11. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_base.py +274 -0
  12. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_classic_cdf/_classic.py +25 -14
  13. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_data_sets.py +35 -0
  14. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_events.py +33 -0
  15. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_files.py +38 -0
  16. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_labels.py +54 -0
  17. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_relationships.py +76 -0
  18. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_sequences.py +37 -0
  19. cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf/_timeseries.py +41 -0
  20. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_rdf_file.py +6 -7
  21. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/loaders/_rdf2dms.py +2 -2
  22. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/queries/_base.py +17 -1
  23. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_classic_cdf.py +74 -147
  24. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_prune_graph.py +1 -1
  25. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_rdfpath.py +1 -1
  26. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/_base.py +26 -17
  27. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/__init__.py +4 -2
  28. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/_external.py +7 -0
  29. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/_properties.py +2 -7
  30. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/_resources.py +1 -1
  31. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/__init__.py +8 -0
  32. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/_external.py +16 -0
  33. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/_properties.py +16 -0
  34. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/_resources.py +26 -2
  35. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/user_modeling.py +4 -4
  36. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/_constants.py +8 -11
  37. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/analysis/_base.py +8 -4
  38. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_base.py +3 -4
  39. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_rules2dms.py +33 -46
  40. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/__init__.py +1 -3
  41. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_base.py +1 -1
  42. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dms2rules.py +6 -29
  43. cognite_neat-0.99.1/cognite/neat/_rules/importers/_rdf/__init__.py +5 -0
  44. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_rdf/_base.py +34 -11
  45. cognite_neat-0.99.1/cognite/neat/_rules/importers/_rdf/_imf2rules.py +91 -0
  46. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_rdf/_inference2rules.py +43 -35
  47. cognite_neat-0.99.1/cognite/neat/_rules/importers/_rdf/_owl2rules.py +80 -0
  48. cognite_neat-0.99.1/cognite/neat/_rules/importers/_rdf/_shared.py +168 -0
  49. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/__init__.py +1 -1
  50. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/_base_rules.py +22 -12
  51. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/dms/__init__.py +4 -2
  52. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/dms/_exporter.py +45 -48
  53. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/dms/_rules.py +20 -17
  54. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/dms/_rules_input.py +52 -8
  55. cognite_neat-0.99.1/cognite/neat/_rules/models/dms/_validation.py +553 -0
  56. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_single_value.py +32 -4
  57. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/information/__init__.py +2 -0
  58. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/information/_rules.py +0 -67
  59. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/information/_validation.py +9 -9
  60. cognite_neat-0.99.1/cognite/neat/_rules/models/mapping/__init__.py +3 -0
  61. cognite_neat-0.99.1/cognite/neat/_rules/models/mapping/_classic2core.py +40 -0
  62. cognite_neat-0.99.1/cognite/neat/_rules/models/mapping/_classic2core.yaml +343 -0
  63. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/transformers/__init__.py +2 -2
  64. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/transformers/_converters.py +110 -11
  65. cognite_neat-0.99.1/cognite/neat/_rules/transformers/_mapping.py +210 -0
  66. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/transformers/_pipelines.py +1 -1
  67. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/transformers/_verification.py +31 -3
  68. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_base.py +24 -8
  69. cognite_neat-0.99.1/cognite/neat/_session/_drop.py +35 -0
  70. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_inspect.py +17 -5
  71. cognite_neat-0.99.1/cognite/neat/_session/_mapping.py +39 -0
  72. cognite_neat-0.99.1/cognite/neat/_session/_prepare.py +465 -0
  73. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_read.py +49 -12
  74. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_to.py +8 -5
  75. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/exceptions.py +4 -0
  76. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_store/_base.py +27 -24
  77. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/rdf_.py +34 -5
  78. cognite_neat-0.99.1/cognite/neat/_version.py +2 -0
  79. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/rules_exporter.py +5 -88
  80. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/rules_importer.py +3 -14
  81. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/rules_validator.py +6 -7
  82. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/pyproject.toml +3 -3
  83. cognite_neat-0.98.0/cognite/neat/_graph/_shared.py +0 -34
  84. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_assets.py +0 -177
  85. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_base.py +0 -127
  86. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_data_sets.py +0 -110
  87. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_events.py +0 -182
  88. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_files.py +0 -202
  89. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_labels.py +0 -122
  90. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_relationships.py +0 -227
  91. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_sequences.py +0 -162
  92. cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf/_timeseries.py +0 -199
  93. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_imf2rules/__init__.py +0 -3
  94. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_imf2rules/_imf2classes.py +0 -86
  95. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_imf2rules/_imf2metadata.py +0 -29
  96. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_imf2rules/_imf2properties.py +0 -130
  97. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_imf2rules/_imf2rules.py +0 -154
  98. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_owl2rules/__init__.py +0 -3
  99. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_owl2rules/_owl2classes.py +0 -58
  100. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_owl2rules/_owl2metadata.py +0 -65
  101. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_owl2rules/_owl2properties.py +0 -59
  102. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_owl2rules/_owl2rules.py +0 -39
  103. cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf/_shared.py +0 -471
  104. cognite_neat-0.98.0/cognite/neat/_rules/models/dms/_schema.py +0 -1101
  105. cognite_neat-0.98.0/cognite/neat/_rules/models/dms/_validation.py +0 -281
  106. cognite_neat-0.98.0/cognite/neat/_rules/models/mapping/__init__.py +0 -4
  107. cognite_neat-0.98.0/cognite/neat/_rules/models/mapping/_base.py +0 -131
  108. cognite_neat-0.98.0/cognite/neat/_rules/models/mapping/_classic2core.py +0 -150
  109. cognite_neat-0.98.0/cognite/neat/_rules/transformers/_mapping.py +0 -135
  110. cognite_neat-0.98.0/cognite/neat/_session/_prepare.py +0 -269
  111. cognite_neat-0.98.0/cognite/neat/_utils/cdf/loaders/__init__.py +0 -25
  112. cognite_neat-0.98.0/cognite/neat/_utils/cdf/loaders/_base.py +0 -54
  113. cognite_neat-0.98.0/cognite/neat/_utils/cdf/loaders/_data_modeling.py +0 -339
  114. cognite_neat-0.98.0/cognite/neat/_utils/cdf/loaders/_ingestion.py +0 -167
  115. cognite_neat-0.98.0/cognite/neat/_version.py +0 -2
  116. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/LICENSE +0 -0
  117. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/README.md +0 -0
  118. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/__init__.py +0 -0
  119. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/__init__.py +0 -0
  120. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/asgi/metrics.py +0 -0
  121. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/configuration.py +0 -0
  122. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/context_manager/__init__.py +0 -0
  123. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/context_manager/manager.py +0 -0
  124. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/data_classes/__init__.py +0 -0
  125. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/data_classes/rest.py +0 -0
  126. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/explorer.py +0 -0
  127. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/routers/configuration.py +0 -0
  128. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/routers/crud.py +0 -0
  129. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/routers/metrics.py +0 -0
  130. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/routers/workflows.py +0 -0
  131. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/utils/__init__.py +0 -0
  132. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/utils/data_mapping.py +0 -0
  133. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/utils/logging.py +0 -0
  134. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/api/utils/query_templates.py +0 -0
  135. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/main.py +0 -0
  136. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/monitoring/__init__.py +0 -0
  137. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/monitoring/metrics.py +0 -0
  138. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/index.html +0 -0
  139. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/.gitignore +0 -0
  140. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/README.md +0 -0
  141. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/asset-manifest.json +0 -0
  142. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/favicon.ico +0 -0
  143. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/img/architect-icon.svg +0 -0
  144. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/img/developer-icon.svg +0 -0
  145. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/img/sme-icon.svg +0 -0
  146. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/index.html +0 -0
  147. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/logo192.png +0 -0
  148. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/manifest.json +0 -0
  149. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/robots.txt +0 -0
  150. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/css/main.72e3d92e.css +0 -0
  151. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/css/main.72e3d92e.css.map +0 -0
  152. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/js/main.5a52cf09.js +0 -0
  153. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/js/main.5a52cf09.js.LICENSE.txt +0 -0
  154. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/js/main.5a52cf09.js.map +0 -0
  155. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/build/static/media/logo.8093b84df9ed36a174c629d6fe0b730d.svg +0 -0
  156. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/package-lock.json +0 -0
  157. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/package.json +0 -0
  158. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/favicon.ico +0 -0
  159. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/img/architect-icon.svg +0 -0
  160. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/img/developer-icon.svg +0 -0
  161. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/img/sme-icon.svg +0 -0
  162. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/index.html +0 -0
  163. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/logo192.png +0 -0
  164. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/manifest.json +0 -0
  165. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/public/robots.txt +0 -0
  166. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/App.css +0 -0
  167. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/App.js +0 -0
  168. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/App.test.js +0 -0
  169. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/MainContainer.tsx +0 -0
  170. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/JsonViewer.tsx +0 -0
  171. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/LocalUploader.tsx +0 -0
  172. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/OverviewComponentEditorDialog.tsx +0 -0
  173. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/StepEditorDialog.tsx +0 -0
  174. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/TabPanel.tsx +0 -0
  175. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/Utils.tsx +0 -0
  176. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/WorkflowDeleteDialog.tsx +0 -0
  177. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/WorkflowExecutionReport.tsx +0 -0
  178. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/WorkflowImportExportDialog.tsx +0 -0
  179. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/components/WorkflowMetadataDialog.tsx +0 -0
  180. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/index.css +0 -0
  181. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/index.js +0 -0
  182. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/logo.svg +0 -0
  183. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/reportWebVitals.js +0 -0
  184. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/setupTests.js +0 -0
  185. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/types/WorkflowTypes.ts +0 -0
  186. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/views/AboutView.tsx +0 -0
  187. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/views/ConfigView.tsx +0 -0
  188. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/views/GlobalConfigView.tsx +0 -0
  189. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/src/views/WorkflowView.tsx +0 -0
  190. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_app/ui/neat-app/tsconfig.json +0 -0
  191. {cognite_neat-0.98.0/cognite/neat/_graph → cognite_neat-0.99.1/cognite/neat/_client/_api}/__init__.py +0 -0
  192. {cognite_neat-0.98.0/cognite/neat/_graph/extractors/_classic_cdf → cognite_neat-0.99.1/cognite/neat/_client/data_classes}/__init__.py +0 -0
  193. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_config.py +0 -0
  194. {cognite_neat-0.98.0/cognite/neat/_rules → cognite_neat-0.99.1/cognite/neat/_graph}/__init__.py +0 -0
  195. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/_tracking/__init__.py +0 -0
  196. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/_tracking/base.py +0 -0
  197. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/_tracking/log.py +0 -0
  198. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  199. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/examples/Knowledge-Graph-Nordic44.xml +0 -0
  200. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/examples/__init__.py +0 -0
  201. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  202. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/__init__.py +0 -0
  203. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_base.py +0 -0
  204. {cognite_neat-0.98.0/cognite/neat/_rules/importers/_rdf → cognite_neat-0.99.1/cognite/neat/_graph/extractors/_classic_cdf}/__init__.py +0 -0
  205. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_dexpi.py +0 -0
  206. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_dms.py +0 -0
  207. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_iodd.py +0 -0
  208. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/extractors/_mock_graph_generator.py +0 -0
  209. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/loaders/__init__.py +0 -0
  210. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/loaders/_base.py +0 -0
  211. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/queries/__init__.py +0 -0
  212. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/queries/_construct.py +0 -0
  213. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/queries/_shared.py +0 -0
  214. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/__init__.py +0 -0
  215. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_base.py +0 -0
  216. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_iodd.py +0 -0
  217. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_graph/transformers/_value_type.py +0 -0
  218. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/__init__.py +0 -0
  219. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/_general.py +0 -0
  220. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/errors/_workflow.py +0 -0
  221. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/formatters.py +0 -0
  222. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/_general.py +0 -0
  223. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_issues/warnings/_models.py +0 -0
  224. {cognite_neat-0.98.0/cognite/neat/_utils → cognite_neat-0.99.1/cognite/neat/_rules}/__init__.py +0 -0
  225. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/_shared.py +0 -0
  226. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/analysis/__init__.py +0 -0
  227. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/analysis/_dms.py +0 -0
  228. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/analysis/_information.py +0 -0
  229. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/catalog/__init__.py +0 -0
  230. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/catalog/info-rules-imf.xlsx +0 -0
  231. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/__init__.py +0 -0
  232. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_rules2excel.py +0 -0
  233. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_rules2instance_template.py +0 -0
  234. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_rules2ontology.py +0 -0
  235. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_rules2yaml.py +0 -0
  236. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/exporters/_validation.py +0 -0
  237. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dtdl2rules/__init__.py +0 -0
  238. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dtdl2rules/_unit_lookup.py +0 -0
  239. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dtdl2rules/dtdl_converter.py +0 -0
  240. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dtdl2rules/dtdl_importer.py +0 -0
  241. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_dtdl2rules/spec.py +0 -0
  242. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_spreadsheet2rules.py +0 -0
  243. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/importers/_yaml2rules.py +0 -0
  244. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/_base_input.py +0 -0
  245. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/_rdfpath.py +0 -0
  246. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/_types.py +0 -0
  247. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/data_types.py +0 -0
  248. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/__init__.py +0 -0
  249. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_constants.py +0 -0
  250. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_loaders.py +0 -0
  251. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_multi_value.py +0 -0
  252. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_types.py +0 -0
  253. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/entities/_wrapped.py +0 -0
  254. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/models/information/_rules_input.py +0 -0
  255. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_rules/transformers/_base.py +0 -0
  256. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/__init__.py +0 -0
  257. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_collector.py +0 -0
  258. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_set.py +0 -0
  259. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_show.py +0 -0
  260. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_state.py +0 -0
  261. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/_wizard.py +0 -0
  262. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/engine/__init__.py +0 -0
  263. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/engine/_import.py +0 -0
  264. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/engine/_interface.py +0 -0
  265. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_session/engine/_load.py +0 -0
  266. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_shared.py +0 -0
  267. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_store/__init__.py +0 -0
  268. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_store/_provenance.py +0 -0
  269. {cognite_neat-0.98.0/cognite/neat/_utils/cdf → cognite_neat-0.99.1/cognite/neat/_utils}/__init__.py +0 -0
  270. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/auth.py +0 -0
  271. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/auxiliary.py +0 -0
  272. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/collection_.py +0 -0
  273. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/reader/__init__.py +0 -0
  274. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/reader/_base.py +0 -0
  275. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/spreadsheet.py +0 -0
  276. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/text.py +0 -0
  277. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/time_.py +0 -0
  278. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/upload.py +0 -0
  279. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_utils/xml_.py +0 -0
  280. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/__init__.py +0 -0
  281. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/base.py +0 -0
  282. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/cdf_store.py +0 -0
  283. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/examples/Export_DMS/workflow.yaml +0 -0
  284. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/examples/Export_Semantic_Data_Model/workflow.yaml +0 -0
  285. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/examples/Import_DMS/workflow.yaml +0 -0
  286. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/examples/Validate_Rules/workflow.yaml +0 -0
  287. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/examples/Validate_Solution_Model/workflow.yaml +0 -0
  288. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/manager.py +0 -0
  289. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/model.py +0 -0
  290. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/__init__.py +0 -0
  291. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/data_contracts.py +0 -0
  292. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/__init__.py +0 -0
  293. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/__init__.py +0 -0
  294. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/graph_extractor.py +0 -0
  295. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/graph_loader.py +0 -0
  296. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/current/graph_store.py +0 -0
  297. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/io/__init__.py +0 -0
  298. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/lib/io/io_steps.py +0 -0
  299. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps/step_model.py +0 -0
  300. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/steps_registry.py +0 -0
  301. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/tasks.py +0 -0
  302. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/triggers.py +0 -0
  303. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/_workflows/utils.py +0 -0
  304. {cognite_neat-0.98.0 → cognite_neat-0.99.1}/cognite/neat/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.98.0
3
+ Version: 0.99.1
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -41,13 +41,13 @@ Requires-Dist: mkdocs-material-extensions ; extra == "docs"
41
41
  Requires-Dist: mkdocstrings[python] ; extra == "docs"
42
42
  Requires-Dist: networkx (>=3.4.2,<4.0.0)
43
43
  Requires-Dist: openpyxl
44
- Requires-Dist: oxrdflib[oxigraph] (>=0.3.3,<0.4.0) ; extra == "oxi" or extra == "all"
44
+ Requires-Dist: oxrdflib[oxigraph] (>=0.4.0,<0.5.0) ; extra == "oxi" or extra == "all"
45
45
  Requires-Dist: packaging (>=22.0,<25.0)
46
46
  Requires-Dist: pandas
47
47
  Requires-Dist: prometheus-client (>=0,<1) ; extra == "service" or extra == "all"
48
48
  Requires-Dist: pydantic (>=2,<3)
49
49
  Requires-Dist: pymdown-extensions ; extra == "docs"
50
- Requires-Dist: pyoxigraph (==0.3.19) ; extra == "oxi" or extra == "all"
50
+ Requires-Dist: pyoxigraph (==0.4.3) ; extra == "oxi" or extra == "all"
51
51
  Requires-Dist: python-multipart (==0.0.9) ; extra == "service" or extra == "all"
52
52
  Requires-Dist: pyvis (>=0.3.2,<0.4.0)
53
53
  Requires-Dist: rdflib
@@ -0,0 +1,4 @@
1
+ from ._api.data_modeling_loaders import DataModelingLoader, ResourceLoader
2
+ from ._api_client import NeatClient
3
+
4
+ __all__ = ["NeatClient", "ResourceLoader", "DataModelingLoader"]
@@ -0,0 +1,585 @@
1
+ import warnings
2
+ from abc import ABC, abstractmethod
3
+ from collections.abc import Sequence
4
+ from graphlib import TopologicalSorter
5
+ from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar, cast
6
+
7
+ from cognite.client.data_classes import filters
8
+ from cognite.client.data_classes._base import (
9
+ CogniteResourceList,
10
+ T_CogniteResourceList,
11
+ T_WritableCogniteResource,
12
+ T_WriteClass,
13
+ WriteableCogniteResourceList,
14
+ )
15
+ from cognite.client.data_classes.data_modeling import (
16
+ Container,
17
+ ContainerApply,
18
+ ContainerApplyList,
19
+ ContainerList,
20
+ DataModel,
21
+ DataModelApply,
22
+ DataModelApplyList,
23
+ DataModelList,
24
+ EdgeConnection,
25
+ MappedProperty,
26
+ RequiresConstraint,
27
+ Space,
28
+ SpaceApply,
29
+ SpaceApplyList,
30
+ SpaceList,
31
+ View,
32
+ ViewApply,
33
+ ViewApplyList,
34
+ ViewList,
35
+ )
36
+ from cognite.client.data_classes.data_modeling.ids import (
37
+ ContainerId,
38
+ DataModelId,
39
+ NodeId,
40
+ ViewId,
41
+ )
42
+ from cognite.client.data_classes.data_modeling.views import (
43
+ EdgeConnectionApply,
44
+ MappedPropertyApply,
45
+ ReverseDirectRelation,
46
+ ReverseDirectRelationApply,
47
+ )
48
+ from cognite.client.exceptions import CogniteAPIError
49
+ from cognite.client.utils.useful_types import SequenceNotStr
50
+
51
+ from cognite.neat._issues.warnings import CDFMaxIterationsWarning
52
+ from cognite.neat._shared import T_ID
53
+
54
+ if TYPE_CHECKING:
55
+ from cognite.neat._client._api_client import NeatClient
56
+
57
+ T_WritableCogniteResourceList = TypeVar("T_WritableCogniteResourceList", bound=WriteableCogniteResourceList)
58
+
59
+
60
+ class ResourceLoader(
61
+ ABC,
62
+ Generic[T_ID, T_WriteClass, T_WritableCogniteResource, T_CogniteResourceList, T_WritableCogniteResourceList],
63
+ ):
64
+ """A resource loaders is a wrapper around the Cognite SDK that does a few things:
65
+
66
+ * Standardizes the CRUD operations for a given resource.
67
+ * Caches the items that have been retrieved from the CDF.
68
+ """
69
+
70
+ resource_name: str
71
+
72
+ def __init__(self, client: "NeatClient") -> None:
73
+ # This is exposed to allow for disabling the cache.
74
+ self.cache = True
75
+ self._client = client
76
+ # This cache is used to store the items that have been retrieved from the CDF.
77
+ self._items_by_id: dict[T_ID, T_WritableCogniteResource] = {}
78
+
79
+ def bust_cache(self) -> None:
80
+ self._items_by_id = {}
81
+
82
+ @classmethod
83
+ @abstractmethod
84
+ def get_id(cls, item: T_WriteClass | T_WritableCogniteResource | dict | T_ID) -> T_ID:
85
+ raise NotImplementedError
86
+
87
+ @classmethod
88
+ def get_ids(cls, items: Sequence[T_WriteClass | T_WritableCogniteResource]) -> list[T_ID]:
89
+ return [cls.get_id(item) for item in items]
90
+
91
+ def create(self, items: Sequence[T_WriteClass]) -> T_WritableCogniteResourceList:
92
+ created = self._create(items)
93
+ if self.cache:
94
+ self._items_by_id.update({self.get_id(item): item for item in created})
95
+ return created
96
+
97
+ def retrieve(self, ids: SequenceNotStr[T_ID]) -> T_WritableCogniteResourceList:
98
+ if not self.cache:
99
+ return self._retrieve(ids)
100
+ missing_ids = [id for id in ids if id not in self._items_by_id.keys()]
101
+ if missing_ids:
102
+ retrieved = self._retrieve(missing_ids)
103
+ self._items_by_id.update({self.get_id(item): item for item in retrieved})
104
+ # We need to check the cache again, in case we didn't retrieve all the items.
105
+ return self._create_list([self._items_by_id[id] for id in ids if id in self._items_by_id])
106
+
107
+ def update(self, items: Sequence[T_WriteClass]) -> T_WritableCogniteResourceList:
108
+ if not self.cache:
109
+ return self._update(items)
110
+ updated = self._update(items)
111
+ self._items_by_id.update({self.get_id(item): item for item in updated})
112
+ return updated
113
+
114
+ def delete(self, ids: SequenceNotStr[T_ID] | Sequence[T_WriteClass]) -> list[T_ID]:
115
+ id_list = [self.get_id(item) for item in ids]
116
+ if not self.cache:
117
+ return self._delete(id_list)
118
+ ids = [self.get_id(item) for item in ids]
119
+ deleted = self._delete(id_list)
120
+ for id in deleted:
121
+ self._items_by_id.pop(id, None)
122
+ return deleted
123
+
124
+ @abstractmethod
125
+ def _create(self, items: Sequence[T_WriteClass]) -> T_WritableCogniteResourceList:
126
+ raise NotImplementedError
127
+
128
+ @abstractmethod
129
+ def _retrieve(self, ids: SequenceNotStr[T_ID]) -> T_WritableCogniteResourceList:
130
+ raise NotImplementedError
131
+
132
+ @abstractmethod
133
+ def _update(self, items: Sequence[T_WriteClass]) -> T_WritableCogniteResourceList:
134
+ raise NotImplementedError
135
+
136
+ @abstractmethod
137
+ def _delete(self, ids: SequenceNotStr[T_ID]) -> list[T_ID]:
138
+ raise NotImplementedError
139
+
140
+ @abstractmethod
141
+ def _create_list(self, items: Sequence[T_WritableCogniteResource]) -> T_WritableCogniteResourceList:
142
+ raise NotImplementedError
143
+
144
+ def are_equal(self, local: T_WriteClass, remote: T_WritableCogniteResource) -> bool:
145
+ return local == remote.as_write()
146
+
147
+
148
+ class DataModelingLoader(
149
+ ResourceLoader[T_ID, T_WriteClass, T_WritableCogniteResource, T_CogniteResourceList, T_WritableCogniteResourceList],
150
+ ABC,
151
+ ):
152
+ @classmethod
153
+ def in_space(cls, item: T_WriteClass | T_WritableCogniteResource | T_ID, space: set[str]) -> bool:
154
+ if hasattr(item, "space"):
155
+ return item.space in space
156
+ raise ValueError(f"Item {item} does not have a space attribute")
157
+
158
+ def sort_by_dependencies(self, items: list[T_WriteClass]) -> list[T_WriteClass]:
159
+ return items
160
+
161
+ def create(
162
+ self, items: Sequence[T_WriteClass], existing_handling: Literal["fail", "skip", "update", "force"] = "fail"
163
+ ) -> T_WritableCogniteResourceList:
164
+ if existing_handling != "force":
165
+ return super().create(items)
166
+
167
+ created = self._create_force(items, set())
168
+ if self.cache:
169
+ self._items_by_id.update({self.get_id(item): item for item in created})
170
+ return created
171
+
172
+ def _create_force(
173
+ self,
174
+ items: Sequence[T_WriteClass],
175
+ tried_force_deploy: set[T_ID],
176
+ ) -> T_WritableCogniteResourceList:
177
+ try:
178
+ return self._create(items)
179
+ except CogniteAPIError as e:
180
+ failed_ids = {self.get_id(failed) for failed in e.failed}
181
+ to_redeploy = [
182
+ item
183
+ for item in items
184
+ if self.get_id(item) in failed_ids and self.get_id(item) not in tried_force_deploy
185
+ ]
186
+ if not to_redeploy:
187
+ # Avoid infinite loop
188
+ raise e
189
+ tried_force_deploy.update([self.get_id(item) for item in to_redeploy])
190
+ self.delete(to_redeploy)
191
+ return self._create_force(to_redeploy, tried_force_deploy)
192
+
193
+
194
+ class SpaceLoader(DataModelingLoader[str, SpaceApply, Space, SpaceApplyList, SpaceList]):
195
+ resource_name = "spaces"
196
+
197
+ @classmethod
198
+ def get_id(cls, item: Space | SpaceApply | str | dict) -> str:
199
+ if isinstance(item, Space | SpaceApply):
200
+ return item.space
201
+ if isinstance(item, dict):
202
+ return item["space"]
203
+ return item
204
+
205
+ def _create(self, items: Sequence[SpaceApply]) -> SpaceList:
206
+ return self._client.data_modeling.spaces.apply(items)
207
+
208
+ def _retrieve(self, ids: SequenceNotStr[str]) -> SpaceList:
209
+ return self._client.data_modeling.spaces.retrieve(ids)
210
+
211
+ def _update(self, items: Sequence[SpaceApply]) -> SpaceList:
212
+ return self._create(items)
213
+
214
+ def _delete(self, ids: SequenceNotStr[str] | Sequence[Space | SpaceApply]) -> list[str]:
215
+ if all(isinstance(item, Space) for item in ids) or all(isinstance(item, SpaceApply) for item in ids):
216
+ ids = [cast(Space | SpaceApply, item).space for item in ids]
217
+ return self._client.data_modeling.spaces.delete(cast(SequenceNotStr[str], ids))
218
+
219
+ def _create_list(self, items: Sequence[Space]) -> SpaceList:
220
+ return SpaceList(items)
221
+
222
+ def clean(self, space: str) -> None:
223
+ """Deletes all data in a space.
224
+
225
+ This means all nodes, edges, views, containers, and data models located in the given space.
226
+
227
+ Args:
228
+ client: Connected CogniteClient
229
+ space: The space to delete.
230
+
231
+ """
232
+ edges = self._client.data_modeling.instances.list(
233
+ "edge", limit=-1, filter=filters.Equals(["edge", "space"], space)
234
+ )
235
+ if edges:
236
+ instances = self._client.data_modeling.instances.delete(edges=edges.as_ids())
237
+ print(f"Deleted {len(instances.edges)} edges")
238
+ nodes = self._client.data_modeling.instances.list(
239
+ "node", limit=-1, filter=filters.Equals(["node", "space"], space)
240
+ )
241
+ node_types = {NodeId(node.type.space, node.type.external_id) for node in nodes if node.type}
242
+ node_data = set(nodes.as_ids()) - node_types
243
+ if node_data:
244
+ instances = self._client.data_modeling.instances.delete(nodes=list(node_data))
245
+ print(f"Deleted {len(instances.nodes)} nodes")
246
+ if node_types:
247
+ instances = self._client.data_modeling.instances.delete(nodes=list(node_types))
248
+ print(f"Deleted {len(instances.nodes)} node types")
249
+ views = self._client.data_modeling.views.list(limit=-1, space=space)
250
+ if views:
251
+ deleted_views = self._client.data_modeling.views.delete(views.as_ids())
252
+ print(f"Deleted {len(deleted_views)} views")
253
+ containers = self._client.data_modeling.containers.list(limit=-1, space=space)
254
+ if containers:
255
+ deleted_containers = self._client.data_modeling.containers.delete(containers.as_ids())
256
+ print(f"Deleted {len(deleted_containers)} containers")
257
+ if data_models := self._client.data_modeling.data_models.list(limit=-1, space=space):
258
+ deleted_data_models = self._client.data_modeling.data_models.delete(data_models.as_ids())
259
+ print(f"Deleted {len(deleted_data_models)} data models")
260
+ deleted_space = self._client.data_modeling.spaces.delete(space)
261
+ print(f"Deleted space {deleted_space}")
262
+
263
+
264
+ class ViewLoader(DataModelingLoader[ViewId, ViewApply, View, ViewApplyList, ViewList]):
265
+ resource_name = "views"
266
+
267
+ @classmethod
268
+ def get_id(cls, item: View | ViewApply | ViewId | dict) -> ViewId:
269
+ if isinstance(item, View | ViewApply):
270
+ return item.as_id()
271
+ if isinstance(item, dict):
272
+ return ViewId.load(item)
273
+ return item
274
+
275
+ def _create(self, items: Sequence[ViewApply]) -> ViewList:
276
+ return self._client.data_modeling.views.apply(items)
277
+
278
+ def retrieve(
279
+ self, ids: SequenceNotStr[ViewId], include_connected: bool = False, include_ancestor: bool = False
280
+ ) -> ViewList:
281
+ if not include_connected and not include_ancestor:
282
+ return super().retrieve(ids)
283
+ # Retrieve recursively updates the cache.
284
+ return self._retrieve_recursive(ids, include_connected, include_ancestor)
285
+
286
+ def _retrieve(self, ids: SequenceNotStr[ViewId]) -> ViewList:
287
+ return self._client.data_modeling.views.retrieve(cast(Sequence, ids))
288
+
289
+ def _update(self, items: Sequence[ViewApply]) -> ViewList:
290
+ return self._create(items)
291
+
292
+ def _delete(self, ids: SequenceNotStr[ViewId]) -> list[ViewId]:
293
+ return self._client.data_modeling.views.delete(cast(Sequence, ids))
294
+
295
+ def _as_write_raw(self, view: View) -> dict[str, Any]:
296
+ dumped = view.as_write().dump()
297
+ if view.properties:
298
+ # All read version of views have all the properties of their parent views.
299
+ # We need to remove these properties to compare with the local view.
300
+ parents = self._retrieve_recursive(view.implements or [], include_connections=False, include_ancestors=True)
301
+ for parent in parents:
302
+ for prop_name, prop in (parent.as_write().properties or {}).items():
303
+ existing = dumped["properties"].get(prop_name)
304
+ if existing is None:
305
+ continue
306
+ if existing == prop.dump():
307
+ dumped["properties"].pop(prop_name, None)
308
+ # If the child overrides the parent, we keep the child's property.
309
+
310
+ if "properties" in dumped and not dumped["properties"]:
311
+ # All properties were removed, so we remove the properties key.
312
+ dumped.pop("properties", None)
313
+ return dumped
314
+
315
+ def are_equal(self, local: ViewApply, remote: View) -> bool:
316
+ local_dumped = local.dump()
317
+ if not remote.implements:
318
+ return local_dumped == remote.as_write().dump()
319
+
320
+ cdf_resource_dumped = self._as_write_raw(remote)
321
+
322
+ if "properties" in local_dumped and not local_dumped["properties"]:
323
+ # In case the local properties are set to an empty dict.
324
+ local_dumped.pop("properties", None)
325
+
326
+ return local_dumped == cdf_resource_dumped
327
+
328
+ def as_write(self, view: View) -> ViewApply:
329
+ return ViewApply.load(self._as_write_raw(view))
330
+
331
+ def _retrieve_recursive(
332
+ self, view_ids: SequenceNotStr[ViewId], include_connections: bool, include_ancestors: bool
333
+ ) -> ViewList:
334
+ """Retrieves all views with the
335
+
336
+ This will mutate the cache passed in, and return a list of views that are the ancestors
337
+ of the views in the parents list.
338
+
339
+ Args:
340
+ view_ids: The views to retrieve.
341
+ include_connections: Whether to include all connected views.
342
+ include_ancestors: Whether to include all ancestors.
343
+ """
344
+ last_batch = list(view_ids)
345
+ found = ViewList([])
346
+ found_ids: set[ViewId] = set()
347
+ while last_batch:
348
+ to_retrieve_from_cdf: set[ViewId] = set()
349
+ batch_ids: list[ViewId] = []
350
+ for view_id in last_batch:
351
+ if view_id in found_ids:
352
+ continue
353
+ elif view_id in self._items_by_id:
354
+ view = self._items_by_id[view_id]
355
+ found.append(view)
356
+ batch_ids.extend(self.get_connected_views(view, include_ancestors, include_connections, found_ids))
357
+ else:
358
+ to_retrieve_from_cdf.add(view_id)
359
+
360
+ if to_retrieve_from_cdf:
361
+ retrieved_batch = self._client.data_modeling.views.retrieve(list(to_retrieve_from_cdf))
362
+ self._items_by_id.update({view.as_id(): view for view in retrieved_batch})
363
+ found.extend(retrieved_batch)
364
+ found_ids.update({view.as_id() for view in retrieved_batch})
365
+ for view in retrieved_batch:
366
+ batch_ids.extend(self.get_connected_views(view, include_ancestors, include_connections, found_ids))
367
+
368
+ last_batch = batch_ids
369
+
370
+ if self.cache is False:
371
+ # We must update the cache to retrieve recursively.
372
+ # If the cache is disabled, bust the cache to avoid storing the retrieved views.
373
+ self.bust_cache()
374
+ return found
375
+
376
+ @staticmethod
377
+ def get_connected_views(
378
+ view: View | ViewApply,
379
+ include_parents: bool = True,
380
+ include_connections: bool = True,
381
+ skip_ids: set[ViewId] | None = None,
382
+ ) -> list[ViewId]:
383
+ connected_ids: set[ViewId] = set(view.implements or []) if include_parents else set()
384
+ if include_connections:
385
+ for prop in (view.properties or {}).values():
386
+ if isinstance(prop, MappedProperty | MappedPropertyApply) and prop.source:
387
+ connected_ids.add(prop.source)
388
+ elif isinstance(
389
+ prop, EdgeConnection | EdgeConnectionApply | ReverseDirectRelation | ReverseDirectRelationApply
390
+ ):
391
+ connected_ids.add(prop.source)
392
+
393
+ if isinstance(prop, EdgeConnection | EdgeConnectionApply) and prop.edge_source:
394
+ connected_ids.add(prop.edge_source)
395
+ elif isinstance(prop, ReverseDirectRelation | ReverseDirectRelationApply) and isinstance(
396
+ prop.through.source, ViewId
397
+ ):
398
+ connected_ids.add(prop.through.source)
399
+ if skip_ids:
400
+ return [view_id for view_id in connected_ids if view_id not in skip_ids]
401
+ return list(connected_ids)
402
+
403
+ def _create_list(self, items: Sequence[View]) -> ViewList:
404
+ return ViewList(items)
405
+
406
+
407
+ class ContainerLoader(DataModelingLoader[ContainerId, ContainerApply, Container, ContainerApplyList, ContainerList]):
408
+ resource_name = "containers"
409
+
410
+ @classmethod
411
+ def get_id(cls, item: Container | ContainerApply | ContainerId | dict) -> ContainerId:
412
+ if isinstance(item, Container | ContainerApply):
413
+ return item.as_id()
414
+ if isinstance(item, dict):
415
+ return ContainerId.load(item)
416
+ return item
417
+
418
+ def sort_by_dependencies(self, items: Sequence[ContainerApply]) -> list[ContainerApply]:
419
+ container_by_id = {container.as_id(): container for container in items}
420
+ container_dependencies = {
421
+ container.as_id(): {
422
+ const.require
423
+ for const in container.constraints.values()
424
+ if isinstance(const, RequiresConstraint) and const.require in container_by_id
425
+ }
426
+ for container in items
427
+ }
428
+ return [
429
+ container_by_id[container_id] for container_id in TopologicalSorter(container_dependencies).static_order()
430
+ ]
431
+
432
+ def _create(self, items: Sequence[ContainerApply]) -> ContainerList:
433
+ return self._client.data_modeling.containers.apply(items)
434
+
435
+ def retrieve(self, ids: SequenceNotStr[ContainerId], include_connected: bool = False) -> ContainerList:
436
+ if not include_connected:
437
+ return super().retrieve(ids)
438
+ # Retrieve recursively updates the cache.
439
+ return self._retrieve_recursive(ids)
440
+
441
+ def _retrieve(self, ids: SequenceNotStr[ContainerId]) -> ContainerList:
442
+ return self._client.data_modeling.containers.retrieve(cast(Sequence, ids))
443
+
444
+ def _update(self, items: Sequence[ContainerApply]) -> ContainerList:
445
+ return self._create(items)
446
+
447
+ def _delete(self, ids: SequenceNotStr[ContainerId]) -> list[ContainerId]:
448
+ return self._client.data_modeling.containers.delete(cast(Sequence, ids))
449
+
450
+ def _create_list(self, items: Sequence[Container]) -> ContainerList:
451
+ return ContainerList(items)
452
+
453
+ def _retrieve_recursive(self, container_ids: SequenceNotStr[ContainerId]) -> ContainerList:
454
+ """Containers can reference each other through the 'requires' constraint.
455
+
456
+ This method retrieves all containers that are referenced by other containers through the 'requires' constraint,
457
+ including their parents.
458
+ """
459
+ max_iterations = 10 # Limiting the number of iterations to avoid infinite loops
460
+ found = ContainerList([])
461
+ found_ids: set[ContainerId] = set()
462
+ last_batch = list(container_ids)
463
+ for _ in range(max_iterations):
464
+ if not last_batch:
465
+ break
466
+ to_retrieve_from_cdf: set[ContainerId] = set()
467
+ batch_ids: list[ContainerId] = []
468
+ for container_id in last_batch:
469
+ if container_id in found_ids:
470
+ continue
471
+ elif container_id in self._items_by_id:
472
+ container = self._items_by_id[container_id]
473
+ found.append(container)
474
+ batch_ids.extend(self.get_connected_containers(container, found_ids))
475
+ else:
476
+ to_retrieve_from_cdf.add(container_id)
477
+
478
+ if to_retrieve_from_cdf:
479
+ retrieved_batch = self._client.data_modeling.containers.retrieve(list(to_retrieve_from_cdf))
480
+ self._items_by_id.update({view.as_id(): view for view in retrieved_batch})
481
+ found.extend(retrieved_batch)
482
+ found_ids.update({view.as_id() for view in retrieved_batch})
483
+ for container in retrieved_batch:
484
+ batch_ids.extend(self.get_connected_containers(container, found_ids))
485
+
486
+ last_batch = batch_ids
487
+ else:
488
+ warnings.warn(
489
+ CDFMaxIterationsWarning(
490
+ "The maximum number of iterations was reached while resolving referenced containers."
491
+ "There might be referenced containers that are not included in the list of containers.",
492
+ max_iterations=max_iterations,
493
+ ),
494
+ stacklevel=2,
495
+ )
496
+
497
+ if self.cache is False:
498
+ # We must update the cache to retrieve recursively.
499
+ # If the cache is disabled, bust the cache to avoid storing the retrieved views.
500
+ self.bust_cache()
501
+ return found
502
+
503
+ @staticmethod
504
+ def get_connected_containers(
505
+ container: Container | ContainerApply, skip: set[ContainerId] | None = None
506
+ ) -> set[ContainerId]:
507
+ connected_containers = set()
508
+ for constraint in container.constraints.values():
509
+ if isinstance(constraint, RequiresConstraint):
510
+ connected_containers.add(constraint.require)
511
+ if skip:
512
+ return {container_id for container_id in connected_containers if container_id not in skip}
513
+ return connected_containers
514
+
515
+ def are_equal(self, local: ContainerApply, remote: Container) -> bool:
516
+ local_dumped = local.dump(camel_case=True)
517
+ if "usedFor" not in local_dumped:
518
+ # Setting used_for to "node" as it is the default value in the CDF.
519
+ local_dumped["usedFor"] = "node"
520
+
521
+ return local_dumped == remote.as_write().dump(camel_case=True)
522
+
523
+
524
+ class DataModelLoader(DataModelingLoader[DataModelId, DataModelApply, DataModel, DataModelApplyList, DataModelList]):
525
+ resource_name = "data_models"
526
+
527
+ @classmethod
528
+ def get_id(cls, item: DataModel | DataModelApply | DataModelId | dict) -> DataModelId:
529
+ if isinstance(item, DataModel | DataModelApply):
530
+ return item.as_id()
531
+ if isinstance(item, dict):
532
+ return DataModelId.load(item)
533
+ return item
534
+
535
+ def _create(self, items: Sequence[DataModelApply]) -> DataModelList:
536
+ return self._client.data_modeling.data_models.apply(items)
537
+
538
+ def _retrieve(self, ids: SequenceNotStr[DataModelId]) -> DataModelList:
539
+ return self._client.data_modeling.data_models.retrieve(cast(Sequence, ids))
540
+
541
+ def _update(self, items: Sequence[DataModelApply]) -> DataModelList:
542
+ return self._create(items)
543
+
544
+ def _delete(self, ids: SequenceNotStr[DataModelId]) -> list[DataModelId]:
545
+ return self._client.data_modeling.data_models.delete(cast(Sequence, ids))
546
+
547
+ def _create_list(self, items: Sequence[DataModel]) -> DataModelList:
548
+ return DataModelList(items)
549
+
550
+ def are_equal(self, local: DataModelApply, remote: DataModel) -> bool:
551
+ local_dumped = local.dump()
552
+ cdf_resource_dumped = remote.as_write().dump()
553
+
554
+ # Data models that have the same views, but in different order, are considered equal.
555
+ # We also account for whether views are given as IDs or View objects.
556
+ local_dumped["views"] = sorted(
557
+ (v if isinstance(v, ViewId) else v.as_id()).as_tuple() for v in local.views or []
558
+ )
559
+ cdf_resource_dumped["views"] = sorted(
560
+ (v if isinstance(v, ViewId) else v.as_id()).as_tuple() for v in remote.views or []
561
+ )
562
+
563
+ return local_dumped == cdf_resource_dumped
564
+
565
+
566
+ class DataModelLoaderAPI:
567
+ def __init__(self, client: "NeatClient") -> None:
568
+ self._client = client
569
+ self.spaces = SpaceLoader(client)
570
+ self.views = ViewLoader(client)
571
+ self.containers = ContainerLoader(client)
572
+ self.data_models = DataModelLoader(client)
573
+
574
+ def get_loader(self, items: Any) -> DataModelingLoader:
575
+ if isinstance(items, CogniteResourceList):
576
+ resource_name = type(items).__name__.casefold().removesuffix("list").removesuffix("apply")
577
+ elif isinstance(items, str):
578
+ resource_name = items
579
+ else:
580
+ raise ValueError(f"Cannot determine resource name from {items}")
581
+ if resource_name[-1] != "s":
582
+ resource_name += "s"
583
+ if resource_name == "datamodels":
584
+ resource_name = "data_models"
585
+ return getattr(self, resource_name)