cognite-neat 0.70.1__py3-none-any.whl → 0.127.19__py3-none-any.whl

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 (530) hide show
  1. cognite/neat/__init__.py +4 -1
  2. cognite/neat/_client/__init__.py +4 -0
  3. cognite/neat/_client/api.py +8 -0
  4. cognite/neat/_client/client.py +21 -0
  5. cognite/neat/_client/config.py +40 -0
  6. cognite/neat/_client/containers_api.py +125 -0
  7. cognite/neat/_client/data_classes.py +44 -0
  8. cognite/neat/_client/data_model_api.py +115 -0
  9. cognite/neat/_client/spaces_api.py +115 -0
  10. cognite/neat/_client/statistics_api.py +24 -0
  11. cognite/neat/_client/views_api.py +129 -0
  12. cognite/neat/_data_model/_analysis.py +186 -0
  13. cognite/neat/_data_model/_constants.py +67 -0
  14. cognite/neat/_data_model/_identifiers.py +61 -0
  15. cognite/neat/_data_model/_shared.py +41 -0
  16. cognite/neat/_data_model/deployer/_differ.py +140 -0
  17. cognite/neat/_data_model/deployer/_differ_container.py +360 -0
  18. cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
  19. cognite/neat/_data_model/deployer/_differ_space.py +9 -0
  20. cognite/neat/_data_model/deployer/_differ_view.py +299 -0
  21. cognite/neat/_data_model/deployer/data_classes.py +529 -0
  22. cognite/neat/_data_model/deployer/deployer.py +401 -0
  23. cognite/neat/_data_model/exporters/__init__.py +15 -0
  24. cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
  25. cognite/neat/_data_model/exporters/_base.py +24 -0
  26. cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
  27. cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
  28. cognite/neat/_data_model/exporters/_table_exporter/writer.py +399 -0
  29. cognite/neat/_data_model/importers/__init__.py +5 -0
  30. cognite/neat/_data_model/importers/_api_importer.py +166 -0
  31. cognite/neat/_data_model/importers/_base.py +16 -0
  32. cognite/neat/_data_model/importers/_table_importer/data_classes.py +291 -0
  33. cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
  34. cognite/neat/_data_model/importers/_table_importer/reader.py +875 -0
  35. cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
  36. cognite/neat/_data_model/models/conceptual/_base.py +18 -0
  37. cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
  38. cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
  39. cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
  40. cognite/neat/_data_model/models/conceptual/_property.py +105 -0
  41. cognite/neat/_data_model/models/dms/__init__.py +206 -0
  42. cognite/neat/_data_model/models/dms/_base.py +31 -0
  43. cognite/neat/_data_model/models/dms/_constants.py +47 -0
  44. cognite/neat/_data_model/models/dms/_constraints.py +42 -0
  45. cognite/neat/_data_model/models/dms/_container.py +159 -0
  46. cognite/neat/_data_model/models/dms/_data_model.py +94 -0
  47. cognite/neat/_data_model/models/dms/_data_types.py +195 -0
  48. cognite/neat/_data_model/models/dms/_http.py +28 -0
  49. cognite/neat/_data_model/models/dms/_indexes.py +30 -0
  50. cognite/neat/_data_model/models/dms/_limits.py +96 -0
  51. cognite/neat/_data_model/models/dms/_references.py +135 -0
  52. cognite/neat/_data_model/models/dms/_schema.py +18 -0
  53. cognite/neat/_data_model/models/dms/_space.py +48 -0
  54. cognite/neat/_data_model/models/dms/_types.py +17 -0
  55. cognite/neat/_data_model/models/dms/_view_filter.py +282 -0
  56. cognite/neat/_data_model/models/dms/_view_property.py +235 -0
  57. cognite/neat/_data_model/models/dms/_views.py +210 -0
  58. cognite/neat/_data_model/models/entities/__init__.py +50 -0
  59. cognite/neat/_data_model/models/entities/_base.py +101 -0
  60. cognite/neat/_data_model/models/entities/_constants.py +22 -0
  61. cognite/neat/_data_model/models/entities/_data_types.py +144 -0
  62. cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
  63. cognite/neat/_data_model/models/entities/_parser.py +226 -0
  64. cognite/neat/_data_model/validation/dms/__init__.py +57 -0
  65. cognite/neat/_data_model/validation/dms/_ai_readiness.py +167 -0
  66. cognite/neat/_data_model/validation/dms/_base.py +304 -0
  67. cognite/neat/_data_model/validation/dms/_connections.py +627 -0
  68. cognite/neat/_data_model/validation/dms/_consistency.py +56 -0
  69. cognite/neat/_data_model/validation/dms/_containers.py +135 -0
  70. cognite/neat/_data_model/validation/dms/_limits.py +414 -0
  71. cognite/neat/_data_model/validation/dms/_orchestrator.py +202 -0
  72. cognite/neat/_data_model/validation/dms/_views.py +101 -0
  73. cognite/neat/_exceptions.py +56 -0
  74. cognite/neat/_issues.py +68 -0
  75. cognite/neat/_session/__init__.py +3 -0
  76. cognite/neat/_session/_html/_render.py +30 -0
  77. cognite/neat/_session/_html/static/__init__.py +8 -0
  78. cognite/neat/_session/_html/static/deployment.css +303 -0
  79. cognite/neat/_session/_html/static/deployment.js +149 -0
  80. cognite/neat/_session/_html/static/issues.css +211 -0
  81. cognite/neat/_session/_html/static/issues.js +167 -0
  82. cognite/neat/_session/_html/static/shared.css +186 -0
  83. cognite/neat/_session/_html/templates/__init__.py +4 -0
  84. cognite/neat/_session/_html/templates/deployment.html +74 -0
  85. cognite/neat/_session/_html/templates/issues.html +44 -0
  86. cognite/neat/_session/_issues.py +76 -0
  87. cognite/neat/_session/_opt.py +35 -0
  88. cognite/neat/_session/_physical.py +240 -0
  89. cognite/neat/_session/_result.py +231 -0
  90. cognite/neat/_session/_session.py +69 -0
  91. cognite/neat/_session/_usage_analytics/_collector.py +131 -0
  92. cognite/neat/_session/_usage_analytics/_constants.py +23 -0
  93. cognite/neat/_session/_usage_analytics/_storage.py +240 -0
  94. cognite/neat/_session/_wrappers.py +82 -0
  95. cognite/neat/_state_machine/__init__.py +10 -0
  96. cognite/neat/_state_machine/_base.py +37 -0
  97. cognite/neat/_state_machine/_states.py +52 -0
  98. cognite/neat/_store/__init__.py +3 -0
  99. cognite/neat/_store/_provenance.py +71 -0
  100. cognite/neat/_store/_store.py +144 -0
  101. cognite/neat/_utils/_reader.py +194 -0
  102. cognite/neat/_utils/auxiliary.py +39 -0
  103. cognite/neat/_utils/collection.py +11 -0
  104. cognite/neat/_utils/http_client/__init__.py +39 -0
  105. cognite/neat/_utils/http_client/_client.py +245 -0
  106. cognite/neat/_utils/http_client/_config.py +19 -0
  107. cognite/neat/_utils/http_client/_data_classes.py +294 -0
  108. cognite/neat/_utils/http_client/_tracker.py +31 -0
  109. cognite/neat/_utils/text.py +71 -0
  110. cognite/neat/_utils/useful_types.py +37 -0
  111. cognite/neat/_utils/validation.py +149 -0
  112. cognite/neat/_version.py +2 -1
  113. cognite/neat/v0/core/__init__.py +0 -0
  114. cognite/neat/v0/core/_client/__init__.py +4 -0
  115. cognite/neat/v0/core/_client/_api/__init__.py +0 -0
  116. cognite/neat/v0/core/_client/_api/data_modeling_loaders.py +1032 -0
  117. cognite/neat/v0/core/_client/_api/neat_instances.py +101 -0
  118. cognite/neat/v0/core/_client/_api/schema.py +158 -0
  119. cognite/neat/v0/core/_client/_api/statistics.py +91 -0
  120. cognite/neat/v0/core/_client/_api_client.py +21 -0
  121. cognite/neat/v0/core/_client/data_classes/__init__.py +0 -0
  122. cognite/neat/v0/core/_client/data_classes/data_modeling.py +198 -0
  123. cognite/neat/v0/core/_client/data_classes/neat_sequence.py +261 -0
  124. cognite/neat/v0/core/_client/data_classes/schema.py +540 -0
  125. cognite/neat/v0/core/_client/data_classes/statistics.py +125 -0
  126. cognite/neat/v0/core/_client/testing.py +39 -0
  127. cognite/neat/v0/core/_config.py +11 -0
  128. cognite/neat/v0/core/_constants.py +278 -0
  129. cognite/neat/v0/core/_data_model/__init__.py +0 -0
  130. cognite/neat/v0/core/_data_model/_constants.py +210 -0
  131. cognite/neat/v0/core/_data_model/_shared.py +59 -0
  132. cognite/neat/v0/core/_data_model/analysis/__init__.py +3 -0
  133. cognite/neat/v0/core/_data_model/analysis/_base.py +578 -0
  134. cognite/neat/v0/core/_data_model/catalog/__init__.py +8 -0
  135. cognite/neat/v0/core/_data_model/catalog/classic_model.xlsx +0 -0
  136. cognite/neat/v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  137. cognite/neat/v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
  138. cognite/neat/v0/core/_data_model/exporters/__init__.py +38 -0
  139. cognite/neat/v0/core/_data_model/exporters/_base.py +67 -0
  140. cognite/neat/v0/core/_data_model/exporters/_data_model2dms.py +428 -0
  141. cognite/neat/v0/core/_data_model/exporters/_data_model2excel.py +612 -0
  142. cognite/neat/v0/core/_data_model/exporters/_data_model2instance_template.py +158 -0
  143. cognite/neat/v0/core/_data_model/exporters/_data_model2semantic_model.py +646 -0
  144. cognite/neat/v0/core/_data_model/exporters/_data_model2yaml.py +84 -0
  145. cognite/neat/v0/core/_data_model/importers/__init__.py +49 -0
  146. cognite/neat/v0/core/_data_model/importers/_base.py +64 -0
  147. cognite/neat/v0/core/_data_model/importers/_base_file_reader.py +56 -0
  148. cognite/neat/v0/core/_data_model/importers/_dict2data_model.py +131 -0
  149. cognite/neat/v0/core/_data_model/importers/_dms2data_model.py +705 -0
  150. cognite/neat/v0/core/_data_model/importers/_graph2data_model.py +299 -0
  151. cognite/neat/v0/core/_data_model/importers/_rdf/__init__.py +4 -0
  152. cognite/neat/v0/core/_data_model/importers/_rdf/_base.py +161 -0
  153. cognite/neat/v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +618 -0
  154. cognite/neat/v0/core/_data_model/importers/_rdf/_owl2data_model.py +124 -0
  155. cognite/neat/v0/core/_data_model/importers/_rdf/_shared.py +255 -0
  156. cognite/neat/v0/core/_data_model/importers/_spreadsheet2data_model.py +424 -0
  157. cognite/neat/v0/core/_data_model/models/__init__.py +38 -0
  158. cognite/neat/v0/core/_data_model/models/_base_unverified.py +181 -0
  159. cognite/neat/v0/core/_data_model/models/_base_verified.py +449 -0
  160. cognite/neat/v0/core/_data_model/models/_import_contexts.py +82 -0
  161. cognite/neat/v0/core/_data_model/models/_types.py +171 -0
  162. cognite/neat/v0/core/_data_model/models/conceptual/__init__.py +25 -0
  163. cognite/neat/v0/core/_data_model/models/conceptual/_unverified.py +193 -0
  164. cognite/neat/v0/core/_data_model/models/conceptual/_validation.py +308 -0
  165. cognite/neat/v0/core/_data_model/models/conceptual/_verified.py +327 -0
  166. cognite/neat/v0/core/_data_model/models/data_types.py +422 -0
  167. cognite/neat/v0/core/_data_model/models/entities/__init__.py +70 -0
  168. cognite/neat/v0/core/_data_model/models/entities/_constants.py +18 -0
  169. cognite/neat/v0/core/_data_model/models/entities/_loaders.py +155 -0
  170. cognite/neat/v0/core/_data_model/models/entities/_multi_value.py +83 -0
  171. cognite/neat/v0/core/_data_model/models/entities/_restrictions.py +230 -0
  172. cognite/neat/v0/core/_data_model/models/entities/_single_value.py +676 -0
  173. cognite/neat/v0/core/_data_model/models/entities/_types.py +103 -0
  174. cognite/neat/v0/core/_data_model/models/entities/_wrapped.py +217 -0
  175. cognite/neat/v0/core/_data_model/models/mapping/__init__.py +3 -0
  176. cognite/neat/v0/core/_data_model/models/mapping/_classic2core.py +39 -0
  177. cognite/neat/v0/core/_data_model/models/mapping/_classic2core.yaml +608 -0
  178. cognite/neat/v0/core/_data_model/models/physical/__init__.py +40 -0
  179. cognite/neat/v0/core/_data_model/models/physical/_exporter.py +658 -0
  180. cognite/neat/v0/core/_data_model/models/physical/_unverified.py +557 -0
  181. cognite/neat/v0/core/_data_model/models/physical/_validation.py +887 -0
  182. cognite/neat/v0/core/_data_model/models/physical/_verified.py +667 -0
  183. cognite/neat/v0/core/_data_model/transformers/__init__.py +70 -0
  184. cognite/neat/v0/core/_data_model/transformers/_base.py +79 -0
  185. cognite/neat/v0/core/_data_model/transformers/_converters.py +2485 -0
  186. cognite/neat/v0/core/_data_model/transformers/_mapping.py +390 -0
  187. cognite/neat/v0/core/_data_model/transformers/_union_conceptual.py +208 -0
  188. cognite/neat/v0/core/_data_model/transformers/_verification.py +120 -0
  189. cognite/neat/v0/core/_instances/__init__.py +0 -0
  190. cognite/neat/v0/core/_instances/_shared.py +37 -0
  191. cognite/neat/v0/core/_instances/_tracking/__init__.py +4 -0
  192. cognite/neat/v0/core/_instances/_tracking/base.py +30 -0
  193. cognite/neat/v0/core/_instances/_tracking/log.py +27 -0
  194. cognite/neat/v0/core/_instances/extractors/__init__.py +76 -0
  195. cognite/neat/v0/core/_instances/extractors/_base.py +58 -0
  196. cognite/neat/v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
  197. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_assets.py +37 -0
  198. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_base.py +443 -0
  199. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_classic.py +479 -0
  200. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_data_sets.py +35 -0
  201. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_events.py +33 -0
  202. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_files.py +45 -0
  203. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_labels.py +54 -0
  204. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_relationships.py +122 -0
  205. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_sequences.py +280 -0
  206. cognite/neat/v0/core/_instances/extractors/_classic_cdf/_timeseries.py +48 -0
  207. cognite/neat/v0/core/_instances/extractors/_dict.py +105 -0
  208. cognite/neat/v0/core/_instances/extractors/_dms.py +315 -0
  209. cognite/neat/v0/core/_instances/extractors/_dms_graph.py +238 -0
  210. cognite/neat/v0/core/_instances/extractors/_mock_graph_generator.py +404 -0
  211. cognite/neat/v0/core/_instances/extractors/_raw.py +67 -0
  212. cognite/neat/v0/core/_instances/extractors/_rdf_file.py +80 -0
  213. cognite/neat/v0/core/_instances/loaders/__init__.py +24 -0
  214. cognite/neat/v0/core/_instances/loaders/_base.py +116 -0
  215. cognite/neat/v0/core/_instances/loaders/_rdf2dms.py +649 -0
  216. cognite/neat/v0/core/_instances/loaders/_rdf_to_instance_space.py +249 -0
  217. cognite/neat/v0/core/_instances/queries/__init__.py +3 -0
  218. cognite/neat/v0/core/_instances/queries/_base.py +16 -0
  219. cognite/neat/v0/core/_instances/queries/_queries.py +16 -0
  220. cognite/neat/v0/core/_instances/queries/_select.py +478 -0
  221. cognite/neat/v0/core/_instances/queries/_update.py +37 -0
  222. cognite/neat/v0/core/_instances/transformers/__init__.py +65 -0
  223. cognite/neat/v0/core/_instances/transformers/_base.py +133 -0
  224. cognite/neat/v0/core/_instances/transformers/_classic_cdf.py +589 -0
  225. cognite/neat/v0/core/_instances/transformers/_prune_graph.py +315 -0
  226. cognite/neat/v0/core/_instances/transformers/_rdfpath.py +84 -0
  227. cognite/neat/v0/core/_instances/transformers/_value_type.py +366 -0
  228. cognite/neat/v0/core/_issues/__init__.py +21 -0
  229. cognite/neat/v0/core/_issues/_base.py +348 -0
  230. cognite/neat/v0/core/_issues/_contextmanagers.py +50 -0
  231. cognite/neat/v0/core/_issues/_factory.py +69 -0
  232. cognite/neat/v0/core/_issues/errors/__init__.py +90 -0
  233. cognite/neat/v0/core/_issues/errors/_external.py +91 -0
  234. cognite/neat/v0/core/_issues/errors/_general.py +51 -0
  235. cognite/neat/v0/core/_issues/errors/_properties.py +80 -0
  236. cognite/neat/v0/core/_issues/errors/_resources.py +116 -0
  237. cognite/neat/v0/core/_issues/errors/_wrapper.py +93 -0
  238. cognite/neat/{rules/issues → v0/core/_issues}/formatters.py +12 -10
  239. cognite/neat/v0/core/_issues/warnings/__init__.py +99 -0
  240. cognite/neat/v0/core/_issues/warnings/_external.py +56 -0
  241. cognite/neat/v0/core/_issues/warnings/_general.py +46 -0
  242. cognite/neat/v0/core/_issues/warnings/_models.py +165 -0
  243. cognite/neat/v0/core/_issues/warnings/_properties.py +108 -0
  244. cognite/neat/v0/core/_issues/warnings/_resources.py +110 -0
  245. cognite/neat/v0/core/_issues/warnings/user_modeling.py +125 -0
  246. cognite/neat/v0/core/_shared.py +77 -0
  247. cognite/neat/v0/core/_store/__init__.py +4 -0
  248. cognite/neat/v0/core/_store/_data_model.py +487 -0
  249. cognite/neat/v0/core/_store/_instance.py +485 -0
  250. cognite/neat/v0/core/_store/_provenance.py +217 -0
  251. cognite/neat/v0/core/_store/exceptions.py +59 -0
  252. cognite/neat/v0/core/_utils/__init__.py +0 -0
  253. cognite/neat/v0/core/_utils/auth.py +364 -0
  254. cognite/neat/v0/core/_utils/auxiliary.py +169 -0
  255. cognite/neat/v0/core/_utils/collection_.py +66 -0
  256. cognite/neat/v0/core/_utils/graph_transformations_report.py +36 -0
  257. cognite/neat/v0/core/_utils/io_.py +11 -0
  258. cognite/neat/v0/core/_utils/rdf_.py +336 -0
  259. cognite/neat/v0/core/_utils/reader/__init__.py +3 -0
  260. cognite/neat/v0/core/_utils/reader/_base.py +194 -0
  261. cognite/neat/v0/core/_utils/spreadsheet.py +182 -0
  262. cognite/neat/v0/core/_utils/tarjan.py +44 -0
  263. cognite/neat/v0/core/_utils/text.py +277 -0
  264. cognite/neat/v0/core/_utils/time_.py +17 -0
  265. cognite/neat/v0/core/_utils/upload.py +134 -0
  266. cognite/neat/v0/core/_utils/xml_.py +52 -0
  267. cognite/neat/v0/plugins/__init__.py +4 -0
  268. cognite/neat/v0/plugins/_base.py +9 -0
  269. cognite/neat/v0/plugins/_data_model.py +48 -0
  270. cognite/neat/v0/plugins/_issues.py +35 -0
  271. cognite/neat/v0/plugins/_manager.py +94 -0
  272. cognite/neat/v0/session/__init__.py +3 -0
  273. cognite/neat/v0/session/_base.py +332 -0
  274. cognite/neat/v0/session/_collector.py +131 -0
  275. cognite/neat/v0/session/_diff.py +51 -0
  276. cognite/neat/v0/session/_drop.py +103 -0
  277. cognite/neat/v0/session/_experimental.py +26 -0
  278. cognite/neat/v0/session/_explore.py +39 -0
  279. cognite/neat/v0/session/_fix.py +28 -0
  280. cognite/neat/v0/session/_inspect.py +285 -0
  281. cognite/neat/v0/session/_mapping.py +71 -0
  282. cognite/neat/v0/session/_plugin.py +66 -0
  283. cognite/neat/v0/session/_prepare.py +286 -0
  284. cognite/neat/v0/session/_read.py +923 -0
  285. cognite/neat/v0/session/_set.py +101 -0
  286. cognite/neat/v0/session/_show.py +298 -0
  287. cognite/neat/v0/session/_state/README.md +23 -0
  288. cognite/neat/v0/session/_state.py +161 -0
  289. cognite/neat/v0/session/_subset.py +88 -0
  290. cognite/neat/v0/session/_template.py +208 -0
  291. cognite/neat/v0/session/_to.py +454 -0
  292. cognite/neat/v0/session/_wizard.py +44 -0
  293. cognite/neat/v0/session/engine/__init__.py +4 -0
  294. cognite/neat/v0/session/engine/_import.py +7 -0
  295. cognite/neat/v0/session/engine/_interface.py +25 -0
  296. cognite/neat/v0/session/engine/_load.py +131 -0
  297. cognite/neat/v0/session/exceptions.py +103 -0
  298. cognite/neat/v1.py +3 -0
  299. cognite_neat-0.127.19.dist-info/METADATA +145 -0
  300. cognite_neat-0.127.19.dist-info/RECORD +318 -0
  301. {cognite_neat-0.70.1.dist-info → cognite_neat-0.127.19.dist-info}/WHEEL +1 -1
  302. cognite/neat/app/api/asgi/metrics.py +0 -4
  303. cognite/neat/app/api/configuration.py +0 -110
  304. cognite/neat/app/api/context_manager/__init__.py +0 -3
  305. cognite/neat/app/api/context_manager/manager.py +0 -16
  306. cognite/neat/app/api/data_classes/configuration.py +0 -121
  307. cognite/neat/app/api/data_classes/rest.py +0 -78
  308. cognite/neat/app/api/explorer.py +0 -64
  309. cognite/neat/app/api/routers/configuration.py +0 -24
  310. cognite/neat/app/api/routers/core.py +0 -51
  311. cognite/neat/app/api/routers/crud.py +0 -112
  312. cognite/neat/app/api/routers/data_exploration.py +0 -334
  313. cognite/neat/app/api/routers/metrics.py +0 -10
  314. cognite/neat/app/api/routers/rules.py +0 -169
  315. cognite/neat/app/api/routers/workflows.py +0 -274
  316. cognite/neat/app/api/utils/data_mapping.py +0 -17
  317. cognite/neat/app/api/utils/logging.py +0 -26
  318. cognite/neat/app/api/utils/query_templates.py +0 -92
  319. cognite/neat/app/main.py +0 -17
  320. cognite/neat/app/monitoring/metrics.py +0 -69
  321. cognite/neat/app/ui/index.html +0 -1
  322. cognite/neat/app/ui/neat-app/.gitignore +0 -23
  323. cognite/neat/app/ui/neat-app/README.md +0 -70
  324. cognite/neat/app/ui/neat-app/build/asset-manifest.json +0 -14
  325. cognite/neat/app/ui/neat-app/build/favicon.ico +0 -0
  326. cognite/neat/app/ui/neat-app/build/index.html +0 -1
  327. cognite/neat/app/ui/neat-app/build/logo192.png +0 -0
  328. cognite/neat/app/ui/neat-app/build/manifest.json +0 -25
  329. cognite/neat/app/ui/neat-app/build/robots.txt +0 -3
  330. cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css +0 -2
  331. cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css.map +0 -1
  332. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js +0 -3
  333. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.LICENSE.txt +0 -97
  334. cognite/neat/app/ui/neat-app/build/static/js/main.ed960141.js.map +0 -1
  335. cognite/neat/app/ui/neat-app/build/static/media/logo.8093b84df9ed36a174c629d6fe0b730d.svg +0 -1
  336. cognite/neat/config.py +0 -46
  337. cognite/neat/constants.py +0 -36
  338. cognite/neat/exceptions.py +0 -139
  339. cognite/neat/graph/__init__.py +0 -3
  340. cognite/neat/graph/exceptions.py +0 -91
  341. cognite/neat/graph/extractor/__init__.py +0 -6
  342. cognite/neat/graph/extractor/_base.py +0 -14
  343. cognite/neat/graph/extractor/_dexpi.py +0 -306
  344. cognite/neat/graph/extractor/_graph_capturing_sheet.py +0 -401
  345. cognite/neat/graph/extractor/_mock_graph_generator.py +0 -359
  346. cognite/neat/graph/extractors/_base.py +0 -14
  347. cognite/neat/graph/extractors/_mock_graph_generator.py +0 -359
  348. cognite/neat/graph/loader/__init__.py +0 -23
  349. cognite/neat/graph/loader/_asset_loader.py +0 -516
  350. cognite/neat/graph/loader/_base.py +0 -69
  351. cognite/neat/graph/loader/_exceptions.py +0 -87
  352. cognite/neat/graph/loader/core/labels.py +0 -58
  353. cognite/neat/graph/loader/core/models.py +0 -136
  354. cognite/neat/graph/loader/core/rdf_to_assets.py +0 -1047
  355. cognite/neat/graph/loader/core/rdf_to_relationships.py +0 -558
  356. cognite/neat/graph/loader/rdf_to_dms.py +0 -309
  357. cognite/neat/graph/loader/validator.py +0 -87
  358. cognite/neat/graph/models.py +0 -6
  359. cognite/neat/graph/stores/__init__.py +0 -13
  360. cognite/neat/graph/stores/_base.py +0 -384
  361. cognite/neat/graph/stores/_graphdb_store.py +0 -51
  362. cognite/neat/graph/stores/_memory_store.py +0 -43
  363. cognite/neat/graph/stores/_oxigraph_store.py +0 -145
  364. cognite/neat/graph/stores/_oxrdflib.py +0 -247
  365. cognite/neat/graph/stores/_rdf_to_graph.py +0 -40
  366. cognite/neat/graph/transformation/entity_matcher.py +0 -101
  367. cognite/neat/graph/transformation/query_generator/__init__.py +0 -3
  368. cognite/neat/graph/transformation/query_generator/sparql.py +0 -540
  369. cognite/neat/graph/transformation/transformer.py +0 -316
  370. cognite/neat/rules/_analysis/_base.py +0 -25
  371. cognite/neat/rules/_analysis/_information_rules.py +0 -414
  372. cognite/neat/rules/_shared.py +0 -5
  373. cognite/neat/rules/analysis.py +0 -231
  374. cognite/neat/rules/examples/Rules-Nordic44-to-TNT.xlsx +0 -0
  375. cognite/neat/rules/examples/Rules-Nordic44-to-graphql.xlsx +0 -0
  376. cognite/neat/rules/examples/__init__.py +0 -18
  377. cognite/neat/rules/examples/power-grid-containers.yaml +0 -113
  378. cognite/neat/rules/examples/power-grid-example.xlsx +0 -0
  379. cognite/neat/rules/examples/power-grid-model.yaml +0 -213
  380. cognite/neat/rules/examples/rules-template.xlsx +0 -0
  381. cognite/neat/rules/examples/sheet2cdf-transformation-rules.xlsx +0 -0
  382. cognite/neat/rules/examples/skos-rules.xlsx +0 -0
  383. cognite/neat/rules/examples/source-to-solution-mapping-rules.xlsx +0 -0
  384. cognite/neat/rules/examples/wind-energy.owl +0 -1511
  385. cognite/neat/rules/exceptions.py +0 -2972
  386. cognite/neat/rules/exporter/__init__.py +0 -20
  387. cognite/neat/rules/exporter/_base.py +0 -45
  388. cognite/neat/rules/exporter/_core/__init__.py +0 -5
  389. cognite/neat/rules/exporter/_core/rules2labels.py +0 -24
  390. cognite/neat/rules/exporter/_rules2dms.py +0 -888
  391. cognite/neat/rules/exporter/_rules2excel.py +0 -212
  392. cognite/neat/rules/exporter/_rules2graphql.py +0 -183
  393. cognite/neat/rules/exporter/_rules2ontology.py +0 -523
  394. cognite/neat/rules/exporter/_rules2pydantic_models.py +0 -748
  395. cognite/neat/rules/exporter/_rules2rules.py +0 -104
  396. cognite/neat/rules/exporter/_rules2triples.py +0 -37
  397. cognite/neat/rules/exporter/_validation.py +0 -150
  398. cognite/neat/rules/exporters/__init__.py +0 -15
  399. cognite/neat/rules/exporters/_base.py +0 -42
  400. cognite/neat/rules/exporters/_models.py +0 -58
  401. cognite/neat/rules/exporters/_rules2dms.py +0 -259
  402. cognite/neat/rules/exporters/_rules2excel.py +0 -196
  403. cognite/neat/rules/exporters/_rules2ontology.py +0 -561
  404. cognite/neat/rules/exporters/_rules2yaml.py +0 -78
  405. cognite/neat/rules/exporters/_validation.py +0 -107
  406. cognite/neat/rules/importer/__init__.py +0 -22
  407. cognite/neat/rules/importer/_base.py +0 -70
  408. cognite/neat/rules/importer/_dict2rules.py +0 -158
  409. cognite/neat/rules/importer/_dms2rules.py +0 -196
  410. cognite/neat/rules/importer/_graph2rules.py +0 -304
  411. cognite/neat/rules/importer/_json2rules.py +0 -39
  412. cognite/neat/rules/importer/_owl2rules/__init__.py +0 -3
  413. cognite/neat/rules/importer/_owl2rules/_owl2classes.py +0 -239
  414. cognite/neat/rules/importer/_owl2rules/_owl2metadata.py +0 -255
  415. cognite/neat/rules/importer/_owl2rules/_owl2properties.py +0 -217
  416. cognite/neat/rules/importer/_owl2rules/_owl2rules.py +0 -290
  417. cognite/neat/rules/importer/_spreadsheet2rules.py +0 -45
  418. cognite/neat/rules/importer/_xsd2rules.py +0 -20
  419. cognite/neat/rules/importer/_yaml2rules.py +0 -39
  420. cognite/neat/rules/importers/__init__.py +0 -16
  421. cognite/neat/rules/importers/_base.py +0 -124
  422. cognite/neat/rules/importers/_dms2rules.py +0 -191
  423. cognite/neat/rules/importers/_dtdl2rules/__init__.py +0 -3
  424. cognite/neat/rules/importers/_dtdl2rules/_unit_lookup.py +0 -224
  425. cognite/neat/rules/importers/_dtdl2rules/dtdl_converter.py +0 -318
  426. cognite/neat/rules/importers/_dtdl2rules/dtdl_importer.py +0 -164
  427. cognite/neat/rules/importers/_dtdl2rules/spec.py +0 -359
  428. cognite/neat/rules/importers/_owl2rules/__init__.py +0 -3
  429. cognite/neat/rules/importers/_owl2rules/_owl2classes.py +0 -219
  430. cognite/neat/rules/importers/_owl2rules/_owl2metadata.py +0 -217
  431. cognite/neat/rules/importers/_owl2rules/_owl2properties.py +0 -203
  432. cognite/neat/rules/importers/_owl2rules/_owl2rules.py +0 -148
  433. cognite/neat/rules/importers/_spreadsheet2rules.py +0 -266
  434. cognite/neat/rules/importers/_yaml2rules.py +0 -110
  435. cognite/neat/rules/issues/__init__.py +0 -27
  436. cognite/neat/rules/issues/base.py +0 -190
  437. cognite/neat/rules/issues/dms.py +0 -331
  438. cognite/neat/rules/issues/fileread.py +0 -156
  439. cognite/neat/rules/issues/importing.py +0 -220
  440. cognite/neat/rules/issues/spreadsheet.py +0 -381
  441. cognite/neat/rules/issues/spreadsheet_file.py +0 -151
  442. cognite/neat/rules/models/__init__.py +0 -5
  443. cognite/neat/rules/models/_base.py +0 -151
  444. cognite/neat/rules/models/_rules/__init__.py +0 -14
  445. cognite/neat/rules/models/_rules/_types/__init__.py +0 -66
  446. cognite/neat/rules/models/_rules/_types/_base.py +0 -450
  447. cognite/neat/rules/models/_rules/_types/_field.py +0 -339
  448. cognite/neat/rules/models/_rules/_types/_value.py +0 -156
  449. cognite/neat/rules/models/_rules/base.py +0 -320
  450. cognite/neat/rules/models/_rules/dms_architect_rules.py +0 -1034
  451. cognite/neat/rules/models/_rules/dms_schema.py +0 -641
  452. cognite/neat/rules/models/_rules/domain_rules.py +0 -55
  453. cognite/neat/rules/models/_rules/information_rules.py +0 -525
  454. cognite/neat/rules/models/raw_rules.py +0 -304
  455. cognite/neat/rules/models/rdfpath.py +0 -238
  456. cognite/neat/rules/models/rules.py +0 -1269
  457. cognite/neat/rules/models/tables.py +0 -9
  458. cognite/neat/rules/models/value_types.py +0 -117
  459. cognite/neat/utils/__init__.py +0 -3
  460. cognite/neat/utils/auxiliary.py +0 -11
  461. cognite/neat/utils/cdf.py +0 -24
  462. cognite/neat/utils/cdf_loaders/__init__.py +0 -25
  463. cognite/neat/utils/cdf_loaders/_base.py +0 -62
  464. cognite/neat/utils/cdf_loaders/_data_modeling.py +0 -275
  465. cognite/neat/utils/cdf_loaders/_ingestion.py +0 -152
  466. cognite/neat/utils/cdf_loaders/data_classes.py +0 -121
  467. cognite/neat/utils/exceptions.py +0 -41
  468. cognite/neat/utils/spreadsheet.py +0 -84
  469. cognite/neat/utils/text.py +0 -104
  470. cognite/neat/utils/utils.py +0 -354
  471. cognite/neat/utils/xml.py +0 -37
  472. cognite/neat/workflows/__init__.py +0 -12
  473. cognite/neat/workflows/_exceptions.py +0 -41
  474. cognite/neat/workflows/base.py +0 -574
  475. cognite/neat/workflows/cdf_store.py +0 -393
  476. cognite/neat/workflows/examples/Export DMS/workflow.yaml +0 -89
  477. cognite/neat/workflows/examples/Export Rules to Ontology/workflow.yaml +0 -152
  478. cognite/neat/workflows/examples/Extract DEXPI Graph and Export Rules/workflow.yaml +0 -139
  479. cognite/neat/workflows/examples/Extract RDF Graph and Generate Assets/workflow.yaml +0 -270
  480. cognite/neat/workflows/examples/Import DMS/workflow.yaml +0 -65
  481. cognite/neat/workflows/examples/Ontology to Data Model/workflow.yaml +0 -116
  482. cognite/neat/workflows/examples/Validate Rules/workflow.yaml +0 -67
  483. cognite/neat/workflows/examples/Validate Solution Model/workflow.yaml +0 -64
  484. cognite/neat/workflows/examples/Visualize Data Model Using Mock Graph/workflow.yaml +0 -95
  485. cognite/neat/workflows/examples/Visualize Semantic Data Model/workflow.yaml +0 -111
  486. cognite/neat/workflows/manager.py +0 -309
  487. cognite/neat/workflows/migration/steps.py +0 -93
  488. cognite/neat/workflows/migration/wf_manifests.py +0 -33
  489. cognite/neat/workflows/model.py +0 -202
  490. cognite/neat/workflows/steps/data_contracts.py +0 -140
  491. cognite/neat/workflows/steps/lib/__init__.py +0 -7
  492. cognite/neat/workflows/steps/lib/graph_extractor.py +0 -123
  493. cognite/neat/workflows/steps/lib/graph_loader.py +0 -68
  494. cognite/neat/workflows/steps/lib/graph_store.py +0 -139
  495. cognite/neat/workflows/steps/lib/io_steps.py +0 -393
  496. cognite/neat/workflows/steps/lib/rules_exporter.py +0 -453
  497. cognite/neat/workflows/steps/lib/rules_importer.py +0 -171
  498. cognite/neat/workflows/steps/lib/rules_validator.py +0 -102
  499. cognite/neat/workflows/steps/lib/v1/__init__.py +0 -7
  500. cognite/neat/workflows/steps/lib/v1/graph_contextualization.py +0 -82
  501. cognite/neat/workflows/steps/lib/v1/graph_extractor.py +0 -644
  502. cognite/neat/workflows/steps/lib/v1/graph_loader.py +0 -606
  503. cognite/neat/workflows/steps/lib/v1/graph_store.py +0 -278
  504. cognite/neat/workflows/steps/lib/v1/graph_transformer.py +0 -58
  505. cognite/neat/workflows/steps/lib/v1/rules_exporter.py +0 -513
  506. cognite/neat/workflows/steps/lib/v1/rules_importer.py +0 -612
  507. cognite/neat/workflows/steps/step_model.py +0 -83
  508. cognite/neat/workflows/steps_registry.py +0 -212
  509. cognite/neat/workflows/tasks.py +0 -18
  510. cognite/neat/workflows/triggers.py +0 -169
  511. cognite/neat/workflows/utils.py +0 -19
  512. cognite_neat-0.70.1.dist-info/METADATA +0 -212
  513. cognite_neat-0.70.1.dist-info/RECORD +0 -234
  514. cognite_neat-0.70.1.dist-info/entry_points.txt +0 -3
  515. /cognite/neat/{app/api → _data_model}/__init__.py +0 -0
  516. /cognite/neat/{app/api/data_classes → _data_model/deployer}/__init__.py +0 -0
  517. /cognite/neat/{app/api/utils → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  518. /cognite/neat/{app/monitoring → _data_model/importers/_table_importer}/__init__.py +0 -0
  519. /cognite/neat/{graph/extractors → _data_model/models}/__init__.py +0 -0
  520. /cognite/neat/{graph/loader/core → _data_model/models/conceptual}/__init__.py +0 -0
  521. /cognite/neat/{graph/transformation → _data_model/validation}/__init__.py +0 -0
  522. /cognite/neat/{rules → _session/_html}/__init__.py +0 -0
  523. /cognite/neat/{rules/_analysis → _session/_usage_analytics}/__init__.py +0 -0
  524. /cognite/neat/{workflows/migration → _utils}/__init__.py +0 -0
  525. /cognite/neat/{workflows/steps → v0}/__init__.py +0 -0
  526. /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  527. /cognite/neat/{graph → v0/core/_instances}/examples/Knowledge-Graph-Nordic44.xml +0 -0
  528. /cognite/neat/{graph → v0/core/_instances}/examples/__init__.py +0 -0
  529. /cognite/neat/{graph → v0/core/_instances}/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  530. {cognite_neat-0.70.1.dist-info → cognite_neat-0.127.19.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,399 @@
1
+ import json
2
+ from collections import defaultdict
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Literal
5
+
6
+ from cognite.neat._data_model._constants import DEFAULT_MAX_LIST_SIZE, DEFAULT_MAX_LIST_SIZE_DIRECT_RELATIONS
7
+ from cognite.neat._data_model.importers._table_importer.data_classes import (
8
+ DMSContainer,
9
+ DMSEnum,
10
+ DMSNode,
11
+ DMSProperty,
12
+ DMSView,
13
+ MetadataValue,
14
+ TableDMS,
15
+ )
16
+ from cognite.neat._data_model.models.dms import (
17
+ ContainerPropertyDefinition,
18
+ ContainerReference,
19
+ ContainerRequest,
20
+ DataModelRequest,
21
+ DataType,
22
+ DirectNodeRelation,
23
+ EnumProperty,
24
+ ListablePropertyTypeDefinition,
25
+ NodeReference,
26
+ RequestSchema,
27
+ RequiresConstraintDefinition,
28
+ UniquenessConstraintDefinition,
29
+ ViewCorePropertyRequest,
30
+ ViewReference,
31
+ ViewRequest,
32
+ ViewRequestProperty,
33
+ )
34
+ from cognite.neat._data_model.models.dms._view_property import (
35
+ EdgeProperty,
36
+ MultiEdgeProperty,
37
+ MultiReverseDirectRelationPropertyRequest,
38
+ ReverseDirectRelationProperty,
39
+ SingleEdgeProperty,
40
+ SingleReverseDirectRelationPropertyRequest,
41
+ )
42
+ from cognite.neat._data_model.models.entities import ParsedEntity
43
+
44
+
45
+ @dataclass
46
+ class ViewProperties:
47
+ properties: list[DMSProperty] = field(default_factory=list)
48
+ nodes: list[DMSNode] = field(default_factory=list)
49
+
50
+
51
+ @dataclass
52
+ class ContainerProperties:
53
+ properties_by_id: dict[tuple[ContainerReference, str], dict] = field(default_factory=dict)
54
+ enum_collections: list[DMSEnum] = field(default_factory=list)
55
+
56
+
57
+ class DMSTableWriter:
58
+ def __init__(self, default_space: str, default_version: str, skip_properties_in_other_spaces: bool) -> None:
59
+ self.default_space = default_space
60
+ self.default_version = default_version
61
+ self.skip_properties_in_other_spaces = skip_properties_in_other_spaces
62
+
63
+ ## Main Entry Point ###
64
+ def write_tables(self, schema: RequestSchema) -> TableDMS:
65
+ metadata = self.write_metadata(schema.data_model)
66
+ container_properties = self.write_container_properties(schema.containers)
67
+ view_properties = self.write_view_properties(schema.views, container_properties)
68
+ views = self.write_views(schema.views)
69
+ containers = self.write_containers(schema.containers)
70
+
71
+ return TableDMS(
72
+ metadata=metadata,
73
+ properties=view_properties.properties,
74
+ views=views,
75
+ containers=containers,
76
+ enum=container_properties.enum_collections,
77
+ nodes=view_properties.nodes,
78
+ )
79
+
80
+ ### Metadata Sheet ###
81
+ @staticmethod
82
+ def write_metadata(data_model: DataModelRequest) -> list[MetadataValue]:
83
+ return [
84
+ MetadataValue(key=key, value=value)
85
+ for key, value in data_model.model_dump(
86
+ mode="json", by_alias=True, exclude_none=True, exclude={"views"}
87
+ ).items()
88
+ ]
89
+
90
+ ### Container Properties Sheet ###
91
+
92
+ def write_containers(self, containers: list[ContainerRequest]) -> list[DMSContainer]:
93
+ return [
94
+ DMSContainer(
95
+ container=self._create_container_entity(container),
96
+ name=container.name,
97
+ description=container.description,
98
+ constraint=self._create_container_constraints(container),
99
+ used_for=container.used_for,
100
+ )
101
+ for container in containers
102
+ ]
103
+
104
+ def write_container_properties(self, containers: list[ContainerRequest]) -> ContainerProperties:
105
+ indices_by_container_property = self._write_container_indices(containers)
106
+ constraints_by_container_property = self._write_container_property_constraints(containers)
107
+
108
+ output = ContainerProperties()
109
+ for container in containers:
110
+ for prop_id, prop in container.properties.items():
111
+ container_property = self._write_container_property(
112
+ container.as_reference(),
113
+ prop_id,
114
+ prop,
115
+ indices_by_container_property,
116
+ constraints_by_container_property,
117
+ )
118
+ output.properties_by_id[(container.as_reference(), prop_id)] = container_property
119
+ if isinstance(prop.type, EnumProperty):
120
+ output.enum_collections.extend(
121
+ self._write_enum_collection(container.as_reference(), prop_id, prop.type)
122
+ )
123
+ return output
124
+
125
+ def _write_container_property(
126
+ self,
127
+ container_ref: ContainerReference,
128
+ prop_id: str,
129
+ prop: ContainerPropertyDefinition,
130
+ indices_by_container_property: dict[tuple[ContainerReference, str], list[ParsedEntity]],
131
+ constraints_by_container_property: dict[tuple[ContainerReference, str], list[ParsedEntity]],
132
+ ) -> dict[str, Any]:
133
+ return dict(
134
+ connection=self._write_container_property_connection(prop.type),
135
+ value_type=self._write_container_property_value_type(prop, prop_id, container_ref),
136
+ min_count=0 if prop.nullable else 1,
137
+ max_count=self._write_container_property_max_count(prop.type),
138
+ immutable=prop.immutable,
139
+ default=json.dumps(prop.default_value) if isinstance(prop.default_value, dict) else prop.default_value,
140
+ auto_increment=prop.auto_increment,
141
+ container=self._create_container_entity(container_ref),
142
+ container_property=prop_id,
143
+ container_property_name=prop.name,
144
+ container_property_description=prop.description,
145
+ index=indices_by_container_property.get((container_ref, prop_id)),
146
+ constraint=constraints_by_container_property.get((container_ref, prop_id)),
147
+ )
148
+
149
+ def _write_container_property_connection(self, dtype: DataType) -> ParsedEntity | None:
150
+ if not isinstance(dtype, DirectNodeRelation):
151
+ return None
152
+ properties: dict[str, str] = {}
153
+ if dtype.container is not None:
154
+ properties["container"] = str(self._create_container_entity(dtype.container))
155
+ return ParsedEntity("", "direct", properties=properties)
156
+
157
+ def _write_container_property_value_type(
158
+ self, prop: ContainerPropertyDefinition, prop_id: str, container_ref: ContainerReference
159
+ ) -> ParsedEntity:
160
+ if isinstance(prop.type, DirectNodeRelation):
161
+ # Will be overwritten if the view property has source set.
162
+ return ParsedEntity("", "#N/A", properties={})
163
+ elif isinstance(prop.type, EnumProperty):
164
+ enum_properties = {"collection": self._enum_collection_name(container_ref, prop_id)}
165
+ if prop.type.unknown_value is not None:
166
+ enum_properties["unknownValue"] = prop.type.unknown_value
167
+ return ParsedEntity("", "enum", properties=enum_properties)
168
+ elif isinstance(prop.type, ListablePropertyTypeDefinition):
169
+ # List and maxListSize are included in the maxCount of the property, so we exclude them here.
170
+ entity_properties = prop.type.model_dump(
171
+ mode="json", by_alias=True, exclude={"list", "maxListSize", "type"}, exclude_none=True
172
+ )
173
+ return ParsedEntity("", prop.type.type, properties=entity_properties)
174
+ else:
175
+ # Should not happen as all types are either ListablePropertyTypeDefinition or EnumProperty.
176
+ return ParsedEntity("", prop.type.type, properties={})
177
+
178
+ @staticmethod
179
+ def _write_container_property_max_count(dtype: DataType) -> int | None:
180
+ if isinstance(dtype, ListablePropertyTypeDefinition) and dtype.list:
181
+ if dtype.max_list_size is not None:
182
+ return dtype.max_list_size
183
+ elif isinstance(dtype, DirectNodeRelation):
184
+ return DEFAULT_MAX_LIST_SIZE_DIRECT_RELATIONS
185
+ else:
186
+ return DEFAULT_MAX_LIST_SIZE
187
+ return 1
188
+
189
+ @staticmethod
190
+ def _write_container_indices(
191
+ containers: list[ContainerRequest],
192
+ ) -> dict[tuple[ContainerReference, str], list[ParsedEntity]]:
193
+ """Writes container indices and groups them by (container_reference, property_id)."""
194
+ indices_by_id: dict[tuple[ContainerReference, str], list[ParsedEntity]] = defaultdict(list)
195
+ for container in containers:
196
+ if not container.indexes:
197
+ continue
198
+ for index_id, index in container.indexes.items():
199
+ for order, prop_id in enumerate(index.properties, 1):
200
+ entity_properties = index.model_dump(
201
+ mode="json", by_alias=True, exclude={"index_type", "properties"}, exclude_none=True
202
+ )
203
+ if len(index.properties) > 1:
204
+ entity_properties["order"] = str(order)
205
+ entity = ParsedEntity(index.index_type, index_id, properties=entity_properties)
206
+ indices_by_id[(container.as_reference(), prop_id)].append(entity)
207
+ return indices_by_id
208
+
209
+ @staticmethod
210
+ def _write_container_property_constraints(
211
+ containers: list[ContainerRequest],
212
+ ) -> dict[tuple[ContainerReference, str], list[ParsedEntity]]:
213
+ """Writes container constraints and groups them by (container_reference, property_id).
214
+
215
+ Note this only includes uniqueness constraints, the require constraints is handled
216
+ in the writing of the container itself.
217
+ """
218
+ constraints_by_id: dict[tuple[ContainerReference, str], list[ParsedEntity]] = defaultdict(list)
219
+ for container in containers:
220
+ if not container.constraints:
221
+ continue
222
+ for constraint_id, constraint in container.constraints.items():
223
+ if not isinstance(constraint, UniquenessConstraintDefinition):
224
+ continue
225
+ for order, prop_id in enumerate(constraint.properties, 1):
226
+ entity_properties = constraint.model_dump(
227
+ mode="json", by_alias=True, exclude={"constraint_type", "properties"}, exclude_none=True
228
+ )
229
+ if len(constraint.properties) > 1:
230
+ entity_properties["order"] = str(order)
231
+ entity = ParsedEntity(constraint.constraint_type, constraint_id, properties=entity_properties)
232
+ constraints_by_id[(container.as_reference(), prop_id)].append(entity)
233
+ return constraints_by_id
234
+
235
+ def _create_container_constraints(self, container: ContainerRequest) -> list[ParsedEntity] | None:
236
+ if not container.constraints:
237
+ return None
238
+ output: list[ParsedEntity] = []
239
+ for constraint_id, constraint in container.constraints.items():
240
+ if not isinstance(constraint, RequiresConstraintDefinition):
241
+ continue
242
+ entity_properties = {"require": str(self._create_container_entity(constraint.require))}
243
+ output.append(
244
+ ParsedEntity(prefix=constraint.constraint_type, suffix=constraint_id, properties=entity_properties)
245
+ )
246
+ return output or None
247
+
248
+ ### Enum Sheet ###
249
+ @staticmethod
250
+ def _enum_collection_name(container_ref: ContainerReference, prop_id: str) -> str:
251
+ return f"{container_ref.external_id}.{prop_id}"
252
+
253
+ def _write_enum_collection(
254
+ self, container_ref: ContainerReference, prop_id: str, enum: EnumProperty
255
+ ) -> list[DMSEnum]:
256
+ output: list[DMSEnum] = []
257
+ name = self._enum_collection_name(container_ref, prop_id)
258
+ for value_id, value in enum.values.items():
259
+ output.append(
260
+ DMSEnum(
261
+ collection=name,
262
+ value=value_id,
263
+ name=value.name,
264
+ description=value.description,
265
+ )
266
+ )
267
+ return output
268
+
269
+ ### View Sheet ###
270
+ def write_views(self, views: list[ViewRequest]) -> list[DMSView]:
271
+ return [
272
+ DMSView(
273
+ view=self._create_view_entity(view),
274
+ name=view.name,
275
+ description=view.description,
276
+ implements=[self._create_view_entity(parent) for parent in view.implements]
277
+ if view.implements
278
+ else None,
279
+ filter=json.dumps(view.filter) if view.filter else None,
280
+ )
281
+ for view in views
282
+ ]
283
+
284
+ def write_view_properties(self, views: list[ViewRequest], container: ContainerProperties) -> ViewProperties:
285
+ output = ViewProperties()
286
+ for view in views:
287
+ if not view.properties:
288
+ continue
289
+ if self.skip_properties_in_other_spaces and view.space != self.default_space:
290
+ continue
291
+ for prop_id, prop in view.properties.items():
292
+ output.properties.append(self._write_view_property(view, prop_id, prop, container))
293
+ if isinstance(prop, EdgeProperty):
294
+ output.nodes.append(self._write_node(prop))
295
+ return output
296
+
297
+ def _write_view_property(
298
+ self, view: ViewRequest, prop_id: str, prop: ViewRequestProperty, container: ContainerProperties
299
+ ) -> DMSProperty:
300
+ container_properties: dict[str, Any] = {}
301
+ if isinstance(prop, ViewCorePropertyRequest):
302
+ identifier = (prop.container, prop.container_property_identifier)
303
+ if identifier in container.properties_by_id:
304
+ container_properties = container.properties_by_id[identifier]
305
+ view_properties: dict[str, Any] = dict(
306
+ view=self._create_view_entity(view), view_property=prop_id, name=prop.name, description=prop.description
307
+ )
308
+ if connection := self._write_view_property_connection(prop):
309
+ view_properties["connection"] = connection
310
+ if view_value_type := self._write_view_property_value_type(prop):
311
+ view_properties["value_type"] = view_value_type
312
+ view_min_count = self._write_view_property_min_count(prop)
313
+ if view_min_count is not None:
314
+ view_properties["min_count"] = view_min_count
315
+ view_max_count = self._write_view_property_max_count(prop)
316
+ if view_max_count != "container":
317
+ view_properties["max_count"] = view_max_count
318
+
319
+ # Overwrite container properties with view properties where relevant.
320
+ args = container_properties | view_properties
321
+ return DMSProperty(**args)
322
+
323
+ def _write_view_property_connection(self, prop: ViewRequestProperty) -> ParsedEntity | None:
324
+ if isinstance(prop, ViewCorePropertyRequest):
325
+ # Use the container definition for connection
326
+ return None
327
+ elif isinstance(prop, EdgeProperty):
328
+ edge_properties: dict[str, str] = {}
329
+ if prop.direction != "outwards":
330
+ edge_properties["direction"] = prop.direction
331
+ if prop.edge_source is not None:
332
+ edge_properties["edgeSource"] = str(self._create_view_entity(prop.edge_source))
333
+ edge_properties["type"] = str(self._create_node_entity(prop.type))
334
+ return ParsedEntity("", "edge", properties=edge_properties)
335
+ elif isinstance(prop, ReverseDirectRelationProperty):
336
+ return ParsedEntity("", "reverse", properties={"property": prop.through.identifier})
337
+ else:
338
+ raise ValueError(f"Unknown view property type: {type(prop)}")
339
+
340
+ def _write_view_property_value_type(self, prop: ViewRequestProperty) -> ParsedEntity | None:
341
+ if isinstance(prop, ViewCorePropertyRequest):
342
+ if prop.source:
343
+ return self._create_view_entity(prop.source)
344
+ else:
345
+ # Use the container definition for value type
346
+ return None
347
+ elif isinstance(prop, ReverseDirectRelationProperty | EdgeProperty):
348
+ return self._create_view_entity(prop.source)
349
+ else:
350
+ raise ValueError(f"Unknown view property type: {type(prop)}")
351
+
352
+ @staticmethod
353
+ def _write_view_property_min_count(prop: ViewRequestProperty) -> int | None:
354
+ if isinstance(prop, ViewCorePropertyRequest):
355
+ # Use the container definition for min count
356
+ return None
357
+ # Edges and reverse relations cannot be required.
358
+ return 0
359
+
360
+ @staticmethod
361
+ def _write_view_property_max_count(prop: ViewRequestProperty) -> int | None | Literal["container"]:
362
+ if isinstance(prop, ViewCorePropertyRequest):
363
+ # Use the container definition for max count
364
+ return "container"
365
+ elif isinstance(prop, SingleEdgeProperty | SingleReverseDirectRelationPropertyRequest):
366
+ return 1
367
+ elif isinstance(prop, MultiEdgeProperty | MultiReverseDirectRelationPropertyRequest):
368
+ return None
369
+ else:
370
+ raise ValueError(f"Unknown view property type: {type(prop)}")
371
+
372
+ ### Node Sheet ###
373
+
374
+ def _write_node(self, prop: EdgeProperty) -> DMSNode:
375
+ return DMSNode(node=self._create_node_entity(prop.type))
376
+
377
+ ## Entity Helpers ###
378
+
379
+ def _create_view_entity(self, view: ViewRequest | ViewReference) -> ParsedEntity:
380
+ prefix = view.space
381
+ properties = {"version": view.version}
382
+ if view.space == self.default_space:
383
+ prefix = ""
384
+ if view.version == self.default_version:
385
+ # Only use default version if space is also default.
386
+ properties = {}
387
+ return ParsedEntity(prefix=prefix, suffix=view.external_id, properties=properties)
388
+
389
+ def _create_container_entity(self, container: ContainerRequest | ContainerReference) -> ParsedEntity:
390
+ prefix = container.space
391
+ if container.space == self.default_space:
392
+ prefix = ""
393
+ return ParsedEntity(prefix=prefix, suffix=container.external_id, properties={})
394
+
395
+ def _create_node_entity(self, node: NodeReference) -> ParsedEntity:
396
+ prefix = node.space
397
+ if node.space == self.default_space:
398
+ prefix = ""
399
+ return ParsedEntity(prefix=prefix, suffix=node.external_id, properties={})
@@ -0,0 +1,5 @@
1
+ from ._api_importer import DMSAPIImporter
2
+ from ._base import DMSImporter
3
+ from ._table_importer.importer import DMSTableImporter
4
+
5
+ __all__ = ["DMSAPIImporter", "DMSImporter", "DMSTableImporter"]
@@ -0,0 +1,166 @@
1
+ import difflib
2
+ from pathlib import Path
3
+ from typing import Any
4
+
5
+ import yaml
6
+ from pydantic import ValidationError
7
+
8
+ from cognite.neat._client import NeatClient
9
+ from cognite.neat._data_model.importers._base import DMSImporter
10
+ from cognite.neat._data_model.models.dms import (
11
+ DataModelReference,
12
+ RequestSchema,
13
+ SpaceReference,
14
+ )
15
+ from cognite.neat._exceptions import CDFAPIException, DataModelImportException, FileReadException
16
+ from cognite.neat._issues import ModelSyntaxError
17
+ from cognite.neat._utils.http_client import FailedRequestMessage
18
+ from cognite.neat._utils.text import humanize_collection
19
+ from cognite.neat._utils.validation import ValidationContext, humanize_validation_error
20
+
21
+
22
+ class DMSAPIImporter(DMSImporter):
23
+ """Imports DMS in the API format."""
24
+
25
+ ENCODING = "utf-8"
26
+
27
+ def __init__(self, schema: RequestSchema | dict[str, Any]) -> None:
28
+ self._schema = schema
29
+
30
+ def to_data_model(self) -> RequestSchema:
31
+ if isinstance(self._schema, RequestSchema):
32
+ return self._schema
33
+ try:
34
+ return RequestSchema.model_validate(self._schema)
35
+ except ValidationError as e:
36
+ context = ValidationContext()
37
+ errors = [
38
+ ModelSyntaxError(message=humanize_validation_error(error, context))
39
+ for error in e.errors(include_input=True, include_url=False)
40
+ ]
41
+ raise DataModelImportException(errors) from None
42
+
43
+ @classmethod
44
+ def from_cdf(cls, data_model: DataModelReference, client: NeatClient) -> "DMSAPIImporter":
45
+ """Create a DMSAPIImporter from a data model in CDF."""
46
+ data_models = client.data_models.retrieve([data_model])
47
+ if not data_models:
48
+ available_data_models = [
49
+ str(model.as_reference()) for model in client.data_models.list(limit=1000, include_global=True)
50
+ ]
51
+ close_matches = difflib.get_close_matches(str(data_model), available_data_models, n=1, cutoff=0.9)
52
+ suggestion_msg = ""
53
+ if close_matches:
54
+ suggestion_msg = f" Did you mean: {close_matches[0]!r}?"
55
+ raise CDFAPIException(
56
+ messages=[
57
+ FailedRequestMessage(message=f"Data model '{data_model!s}' not found in CDF.{suggestion_msg}")
58
+ ]
59
+ )
60
+ data_model = data_models[0]
61
+ views = client.views.retrieve(data_model.views or [])
62
+ if missing_views := set(data_model.views or []) - {view.as_reference() for view in views}:
63
+ raise CDFAPIException(
64
+ messages=[
65
+ FailedRequestMessage(
66
+ message=f"Views {humanize_collection(missing_views)} not found in CDF "
67
+ f"for data model {data_model}."
68
+ )
69
+ ]
70
+ )
71
+ container_ids = list({container for view in views for container in view.mapped_containers})
72
+ containers = client.containers.retrieve(container_ids)
73
+ if missing_containers := set(container_ids) - {container.as_reference() for container in containers}:
74
+ raise CDFAPIException(
75
+ messages=[
76
+ FailedRequestMessage(
77
+ message=f"Containers {humanize_collection(missing_containers)} not found in CDF "
78
+ f"for data model {data_model}."
79
+ )
80
+ ]
81
+ )
82
+ node_types = [nt for view in views for nt in view.node_types]
83
+ space_ids = list(
84
+ {data_model.space}
85
+ | {view.space for view in views}
86
+ | {container.space for container in containers}
87
+ | {nt.space for nt in node_types}
88
+ )
89
+ spaces = client.spaces.retrieve([SpaceReference(space=space_id) for space_id in space_ids])
90
+ if missing_spaces := set(space_ids) - {space.space for space in spaces}:
91
+ raise CDFAPIException(
92
+ messages=[
93
+ FailedRequestMessage(
94
+ message=f"Spaces {humanize_collection(missing_spaces)} not found in CDF "
95
+ f"for data model {data_model}."
96
+ )
97
+ ]
98
+ )
99
+ return DMSAPIImporter(
100
+ RequestSchema(
101
+ dataModel=data_model.as_request(),
102
+ views=[view.as_request() for view in views],
103
+ containers=[container.as_request() for container in containers],
104
+ nodeTypes=node_types,
105
+ spaces=[space.as_request() for space in spaces],
106
+ )
107
+ )
108
+
109
+ @classmethod
110
+ def from_yaml(cls, yaml_file: Path) -> "DMSAPIImporter":
111
+ """Create a DMSTableImporter from a YAML file."""
112
+ source = cls._display_name(yaml_file)
113
+ if yaml_file.suffix.lower() in {".yaml", ".yml", ".json"}:
114
+ return cls(yaml.safe_load(yaml_file.read_text(encoding=cls.ENCODING)))
115
+ elif yaml_file.is_dir():
116
+ return cls(cls._read_yaml_files(yaml_file))
117
+ raise FileReadException(source.as_posix(), f"Unsupported file type: {source.suffix}")
118
+
119
+ @classmethod
120
+ def from_json(cls, json_file: Path) -> "DMSAPIImporter":
121
+ """Create a DMSTableImporter from a JSON file."""
122
+ return cls.from_yaml(json_file)
123
+
124
+ @classmethod
125
+ def _display_name(cls, filepath: Path) -> Path:
126
+ """Get a display-friendly version of the file path."""
127
+ cwd = Path.cwd()
128
+ source = filepath
129
+ if filepath.is_relative_to(cwd):
130
+ source = filepath.relative_to(cwd)
131
+ return source
132
+
133
+ @classmethod
134
+ def _read_yaml_files(cls, directory: Path) -> dict[str, Any]:
135
+ """Read all YAML files in a directory and combine them into a single dictionary."""
136
+ schema_data: dict[str, Any] = {}
137
+ data_model: dict[str, Any] | None = None
138
+ for yaml_file in directory.rglob("**/*"):
139
+ if yaml_file.suffix.lower() not in {".yaml", ".yml", ".json"}:
140
+ continue
141
+ stem = yaml_file.stem.casefold()
142
+ if stem.endswith("datamodel") and data_model is not None:
143
+ raise FileReadException(
144
+ cls._display_name(directory).as_posix(),
145
+ "Multiple data model files found in directory.",
146
+ )
147
+ data = yaml.safe_load(yaml_file.read_text(encoding=cls.ENCODING))
148
+ list_data = data if isinstance(data, list) else [data]
149
+ if stem.endswith("datamodel"):
150
+ data_model = data
151
+ elif stem.endswith("container"):
152
+ schema_data.setdefault("containers", []).extend(list_data)
153
+ elif stem.endswith("view"):
154
+ schema_data.setdefault("views", []).extend(list_data)
155
+ elif stem.endswith("space"):
156
+ schema_data.setdefault("spaces", []).extend(list_data)
157
+ elif stem.endswith("node"):
158
+ schema_data.setdefault("nodeTypes", []).extend(list_data)
159
+ # Ignore other files
160
+ if data_model is None:
161
+ raise FileReadException(
162
+ cls._display_name(directory).as_posix(),
163
+ "No data model file found in directory.",
164
+ )
165
+ schema_data["dataModel"] = data_model
166
+ return schema_data
@@ -0,0 +1,16 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from cognite.neat._data_model.models.dms import RequestSchema
4
+
5
+
6
+ class DMSImporter(ABC):
7
+ """This is the base class for all DMS importers."""
8
+
9
+ @abstractmethod
10
+ def to_data_model(self) -> RequestSchema:
11
+ """Convert the imported data to a RequestSchema.
12
+
13
+ Returns:
14
+ RequestSchema: The data model as a RequestSchema.
15
+ """
16
+ raise NotImplementedError()