cognite-neat 0.123.24__py3-none-any.whl → 1.0.22__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 (342) hide show
  1. cognite/neat/__init__.py +4 -3
  2. cognite/neat/_client/__init__.py +5 -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 +138 -0
  7. cognite/neat/_client/data_classes.py +44 -0
  8. cognite/neat/_client/data_model_api.py +115 -0
  9. cognite/neat/_client/init/credentials.py +70 -0
  10. cognite/neat/_client/init/env_vars.py +131 -0
  11. cognite/neat/_client/init/main.py +51 -0
  12. cognite/neat/_client/spaces_api.py +115 -0
  13. cognite/neat/_client/statistics_api.py +24 -0
  14. cognite/neat/_client/views_api.py +144 -0
  15. cognite/neat/_config.py +266 -0
  16. cognite/neat/_data_model/_analysis.py +571 -0
  17. cognite/neat/_data_model/_constants.py +74 -0
  18. cognite/neat/_data_model/_identifiers.py +61 -0
  19. cognite/neat/_data_model/_shared.py +41 -0
  20. cognite/neat/_data_model/_snapshot.py +134 -0
  21. cognite/neat/_data_model/deployer/_differ.py +140 -0
  22. cognite/neat/_data_model/deployer/_differ_container.py +360 -0
  23. cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
  24. cognite/neat/_data_model/deployer/_differ_space.py +9 -0
  25. cognite/neat/_data_model/deployer/_differ_view.py +299 -0
  26. cognite/neat/_data_model/deployer/data_classes.py +644 -0
  27. cognite/neat/_data_model/deployer/deployer.py +431 -0
  28. cognite/neat/_data_model/exporters/__init__.py +15 -0
  29. cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
  30. cognite/neat/_data_model/exporters/_base.py +24 -0
  31. cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
  32. cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
  33. cognite/neat/_data_model/exporters/_table_exporter/writer.py +480 -0
  34. cognite/neat/_data_model/importers/__init__.py +5 -0
  35. cognite/neat/_data_model/importers/_api_importer.py +166 -0
  36. cognite/neat/_data_model/importers/_base.py +16 -0
  37. cognite/neat/_data_model/importers/_table_importer/data_classes.py +344 -0
  38. cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
  39. cognite/neat/_data_model/importers/_table_importer/reader.py +1102 -0
  40. cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
  41. cognite/neat/_data_model/models/conceptual/_base.py +18 -0
  42. cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
  43. cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
  44. cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
  45. cognite/neat/_data_model/models/conceptual/_property.py +105 -0
  46. cognite/neat/_data_model/models/dms/__init__.py +206 -0
  47. cognite/neat/_data_model/models/dms/_base.py +31 -0
  48. cognite/neat/_data_model/models/dms/_constants.py +48 -0
  49. cognite/neat/_data_model/models/dms/_constraints.py +42 -0
  50. cognite/neat/_data_model/models/dms/_container.py +159 -0
  51. cognite/neat/_data_model/models/dms/_data_model.py +95 -0
  52. cognite/neat/_data_model/models/dms/_data_types.py +195 -0
  53. cognite/neat/_data_model/models/dms/_http.py +28 -0
  54. cognite/neat/_data_model/models/dms/_indexes.py +30 -0
  55. cognite/neat/_data_model/models/dms/_limits.py +96 -0
  56. cognite/neat/_data_model/models/dms/_references.py +141 -0
  57. cognite/neat/_data_model/models/dms/_schema.py +18 -0
  58. cognite/neat/_data_model/models/dms/_space.py +48 -0
  59. cognite/neat/_data_model/models/dms/_types.py +17 -0
  60. cognite/neat/_data_model/models/dms/_view_filter.py +310 -0
  61. cognite/neat/_data_model/models/dms/_view_property.py +235 -0
  62. cognite/neat/_data_model/models/dms/_views.py +216 -0
  63. cognite/neat/_data_model/models/entities/__init__.py +50 -0
  64. cognite/neat/_data_model/models/entities/_base.py +101 -0
  65. cognite/neat/_data_model/models/entities/_constants.py +22 -0
  66. cognite/neat/_data_model/models/entities/_data_types.py +144 -0
  67. cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
  68. cognite/neat/_data_model/models/entities/_parser.py +226 -0
  69. cognite/neat/_data_model/validation/dms/__init__.py +75 -0
  70. cognite/neat/_data_model/validation/dms/_ai_readiness.py +381 -0
  71. cognite/neat/_data_model/validation/dms/_base.py +25 -0
  72. cognite/neat/_data_model/validation/dms/_connections.py +681 -0
  73. cognite/neat/_data_model/validation/dms/_consistency.py +58 -0
  74. cognite/neat/_data_model/validation/dms/_containers.py +199 -0
  75. cognite/neat/_data_model/validation/dms/_limits.py +368 -0
  76. cognite/neat/_data_model/validation/dms/_orchestrator.py +70 -0
  77. cognite/neat/_data_model/validation/dms/_views.py +164 -0
  78. cognite/neat/_exceptions.py +68 -0
  79. cognite/neat/_issues.py +68 -0
  80. cognite/neat/_session/__init__.py +3 -0
  81. cognite/neat/_session/_html/_render.py +30 -0
  82. cognite/neat/_session/_html/static/__init__.py +8 -0
  83. cognite/neat/_session/_html/static/deployment.css +476 -0
  84. cognite/neat/_session/_html/static/deployment.js +181 -0
  85. cognite/neat/_session/_html/static/issues.css +211 -0
  86. cognite/neat/_session/_html/static/issues.js +168 -0
  87. cognite/neat/_session/_html/static/shared.css +186 -0
  88. cognite/neat/_session/_html/templates/__init__.py +4 -0
  89. cognite/neat/_session/_html/templates/deployment.html +80 -0
  90. cognite/neat/_session/_html/templates/issues.html +45 -0
  91. cognite/neat/_session/_issues.py +81 -0
  92. cognite/neat/_session/_physical.py +294 -0
  93. cognite/neat/_session/_result/__init__.py +3 -0
  94. cognite/neat/_session/_result/_deployment/__init__.py +0 -0
  95. cognite/neat/_session/_result/_deployment/_physical/__init__.py +0 -0
  96. cognite/neat/_session/_result/_deployment/_physical/_changes.py +196 -0
  97. cognite/neat/_session/_result/_deployment/_physical/_statistics.py +180 -0
  98. cognite/neat/_session/_result/_deployment/_physical/serializer.py +35 -0
  99. cognite/neat/_session/_result/_result.py +31 -0
  100. cognite/neat/_session/_session.py +81 -0
  101. cognite/neat/_session/_usage_analytics/__init__.py +0 -0
  102. cognite/neat/_session/_usage_analytics/_collector.py +131 -0
  103. cognite/neat/_session/_usage_analytics/_constants.py +23 -0
  104. cognite/neat/_session/_usage_analytics/_storage.py +240 -0
  105. cognite/neat/_session/_wrappers.py +101 -0
  106. cognite/neat/_state_machine/__init__.py +10 -0
  107. cognite/neat/_state_machine/_base.py +37 -0
  108. cognite/neat/_state_machine/_states.py +52 -0
  109. cognite/neat/_store/__init__.py +3 -0
  110. cognite/neat/_store/_provenance.py +88 -0
  111. cognite/neat/_store/_store.py +220 -0
  112. cognite/neat/_utils/__init__.py +0 -0
  113. cognite/neat/_utils/_reader.py +194 -0
  114. cognite/neat/_utils/auxiliary.py +49 -0
  115. cognite/neat/_utils/collection.py +11 -0
  116. cognite/neat/_utils/http_client/__init__.py +39 -0
  117. cognite/neat/_utils/http_client/_client.py +245 -0
  118. cognite/neat/_utils/http_client/_config.py +19 -0
  119. cognite/neat/_utils/http_client/_data_classes.py +294 -0
  120. cognite/neat/_utils/http_client/_tracker.py +31 -0
  121. cognite/neat/_utils/repo.py +19 -0
  122. cognite/neat/_utils/text.py +71 -0
  123. cognite/neat/_utils/useful_types.py +37 -0
  124. cognite/neat/_utils/validation.py +154 -0
  125. cognite/neat/_v0/__init__.py +0 -0
  126. cognite/neat/_v0/core/__init__.py +0 -0
  127. cognite/neat/_v0/core/_client/_api/__init__.py +0 -0
  128. cognite/neat/{core → _v0/core}/_client/_api/data_modeling_loaders.py +8 -7
  129. cognite/neat/{core → _v0/core}/_client/_api/neat_instances.py +5 -5
  130. cognite/neat/{core → _v0/core}/_client/_api/schema.py +5 -5
  131. cognite/neat/{core → _v0/core}/_client/_api/statistics.py +3 -3
  132. cognite/neat/{core → _v0/core}/_client/_api_client.py +1 -1
  133. cognite/neat/_v0/core/_client/data_classes/__init__.py +0 -0
  134. cognite/neat/{core → _v0/core}/_client/data_classes/schema.py +4 -4
  135. cognite/neat/{core → _v0/core}/_client/testing.py +1 -1
  136. cognite/neat/{core → _v0/core}/_constants.py +5 -3
  137. cognite/neat/_v0/core/_data_model/__init__.py +0 -0
  138. cognite/neat/{core → _v0/core}/_data_model/_constants.py +7 -0
  139. cognite/neat/{core → _v0/core}/_data_model/_shared.py +4 -4
  140. cognite/neat/{core → _v0/core}/_data_model/analysis/_base.py +8 -8
  141. cognite/neat/{core → _v0/core}/_data_model/exporters/__init__.py +1 -2
  142. cognite/neat/{core → _v0/core}/_data_model/exporters/_base.py +7 -7
  143. cognite/neat/{core → _v0/core}/_data_model/exporters/_data_model2dms.py +9 -9
  144. cognite/neat/{core → _v0/core}/_data_model/exporters/_data_model2excel.py +12 -12
  145. cognite/neat/{core → _v0/core}/_data_model/exporters/_data_model2instance_template.py +4 -4
  146. cognite/neat/{core/_data_model/exporters/_data_model2ontology.py → _v0/core/_data_model/exporters/_data_model2semantic_model.py} +126 -116
  147. cognite/neat/{core → _v0/core}/_data_model/exporters/_data_model2yaml.py +1 -1
  148. cognite/neat/{core → _v0/core}/_data_model/importers/_base.py +5 -5
  149. cognite/neat/{core → _v0/core}/_data_model/importers/_base_file_reader.py +2 -2
  150. cognite/neat/{core → _v0/core}/_data_model/importers/_dict2data_model.py +5 -5
  151. cognite/neat/{core → _v0/core}/_data_model/importers/_dms2data_model.py +18 -15
  152. cognite/neat/{core → _v0/core}/_data_model/importers/_graph2data_model.py +12 -12
  153. cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/_base.py +12 -12
  154. cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/_inference2rdata_model.py +14 -14
  155. cognite/neat/_v0/core/_data_model/importers/_rdf/_owl2data_model.py +144 -0
  156. cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/_shared.py +17 -13
  157. cognite/neat/{core → _v0/core}/_data_model/importers/_spreadsheet2data_model.py +92 -12
  158. cognite/neat/{core → _v0/core}/_data_model/models/__init__.py +3 -3
  159. cognite/neat/{core → _v0/core}/_data_model/models/_base_verified.py +5 -5
  160. cognite/neat/{core → _v0/core}/_data_model/models/_import_contexts.py +1 -1
  161. cognite/neat/{core → _v0/core}/_data_model/models/_types.py +5 -5
  162. cognite/neat/{core → _v0/core}/_data_model/models/conceptual/_unverified.py +16 -10
  163. cognite/neat/{core → _v0/core}/_data_model/models/conceptual/_validation.py +12 -12
  164. cognite/neat/{core → _v0/core}/_data_model/models/conceptual/_verified.py +9 -9
  165. cognite/neat/{core → _v0/core}/_data_model/models/data_types.py +14 -4
  166. cognite/neat/{core → _v0/core}/_data_model/models/entities/__init__.py +6 -0
  167. cognite/neat/_v0/core/_data_model/models/entities/_loaders.py +155 -0
  168. cognite/neat/{core → _v0/core}/_data_model/models/entities/_multi_value.py +2 -2
  169. cognite/neat/_v0/core/_data_model/models/entities/_restrictions.py +230 -0
  170. cognite/neat/{core → _v0/core}/_data_model/models/entities/_single_value.py +121 -16
  171. cognite/neat/{core → _v0/core}/_data_model/models/entities/_types.py +10 -0
  172. cognite/neat/{core → _v0/core}/_data_model/models/mapping/_classic2core.py +5 -5
  173. cognite/neat/{core → _v0/core}/_data_model/models/physical/__init__.py +1 -1
  174. cognite/neat/{core → _v0/core}/_data_model/models/physical/_exporter.py +26 -19
  175. cognite/neat/{core → _v0/core}/_data_model/models/physical/_unverified.py +133 -37
  176. cognite/neat/{core → _v0/core}/_data_model/models/physical/_validation.py +24 -20
  177. cognite/neat/{core → _v0/core}/_data_model/models/physical/_verified.py +95 -24
  178. cognite/neat/{core → _v0/core}/_data_model/transformers/_base.py +4 -4
  179. cognite/neat/{core → _v0/core}/_data_model/transformers/_converters.py +35 -28
  180. cognite/neat/{core → _v0/core}/_data_model/transformers/_mapping.py +7 -7
  181. cognite/neat/{core → _v0/core}/_data_model/transformers/_union_conceptual.py +5 -5
  182. cognite/neat/{core → _v0/core}/_data_model/transformers/_verification.py +7 -7
  183. cognite/neat/_v0/core/_instances/__init__.py +0 -0
  184. cognite/neat/{core → _v0/core}/_instances/_tracking/base.py +1 -1
  185. cognite/neat/{core → _v0/core}/_instances/_tracking/log.py +1 -1
  186. cognite/neat/{core → _v0/core}/_instances/extractors/__init__.py +3 -2
  187. cognite/neat/{core → _v0/core}/_instances/extractors/_base.py +6 -6
  188. cognite/neat/_v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
  189. cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_base.py +7 -7
  190. cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_classic.py +12 -12
  191. cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_relationships.py +3 -3
  192. cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_sequences.py +2 -2
  193. cognite/neat/{core → _v0/core}/_instances/extractors/_dict.py +6 -3
  194. cognite/neat/{core → _v0/core}/_instances/extractors/_dms.py +6 -6
  195. cognite/neat/{core → _v0/core}/_instances/extractors/_dms_graph.py +11 -11
  196. cognite/neat/{core → _v0/core}/_instances/extractors/_mock_graph_generator.py +10 -10
  197. cognite/neat/{core → _v0/core}/_instances/extractors/_raw.py +3 -3
  198. cognite/neat/{core → _v0/core}/_instances/extractors/_rdf_file.py +7 -7
  199. cognite/neat/{core → _v0/core}/_instances/loaders/_base.py +5 -5
  200. cognite/neat/{core → _v0/core}/_instances/loaders/_rdf2dms.py +17 -17
  201. cognite/neat/{core → _v0/core}/_instances/loaders/_rdf_to_instance_space.py +11 -11
  202. cognite/neat/{core → _v0/core}/_instances/queries/_select.py +29 -3
  203. cognite/neat/{core → _v0/core}/_instances/queries/_update.py +1 -1
  204. cognite/neat/{core → _v0/core}/_instances/transformers/_base.py +4 -4
  205. cognite/neat/{core → _v0/core}/_instances/transformers/_classic_cdf.py +6 -6
  206. cognite/neat/{core → _v0/core}/_instances/transformers/_prune_graph.py +4 -4
  207. cognite/neat/{core → _v0/core}/_instances/transformers/_rdfpath.py +1 -1
  208. cognite/neat/{core → _v0/core}/_instances/transformers/_value_type.py +4 -4
  209. cognite/neat/{core → _v0/core}/_issues/_base.py +5 -5
  210. cognite/neat/{core → _v0/core}/_issues/_contextmanagers.py +1 -1
  211. cognite/neat/{core → _v0/core}/_issues/_factory.py +3 -3
  212. cognite/neat/{core → _v0/core}/_issues/errors/__init__.py +1 -1
  213. cognite/neat/{core → _v0/core}/_issues/errors/_external.py +1 -1
  214. cognite/neat/{core → _v0/core}/_issues/errors/_general.py +1 -1
  215. cognite/neat/{core → _v0/core}/_issues/errors/_properties.py +1 -1
  216. cognite/neat/{core → _v0/core}/_issues/errors/_resources.py +2 -2
  217. cognite/neat/{core → _v0/core}/_issues/errors/_wrapper.py +7 -3
  218. cognite/neat/{core → _v0/core}/_issues/warnings/__init__.py +1 -1
  219. cognite/neat/{core → _v0/core}/_issues/warnings/_external.py +1 -1
  220. cognite/neat/{core → _v0/core}/_issues/warnings/_general.py +1 -1
  221. cognite/neat/{core → _v0/core}/_issues/warnings/_models.py +2 -2
  222. cognite/neat/{core → _v0/core}/_issues/warnings/_properties.py +2 -2
  223. cognite/neat/{core → _v0/core}/_issues/warnings/_resources.py +1 -1
  224. cognite/neat/{core → _v0/core}/_issues/warnings/user_modeling.py +1 -1
  225. cognite/neat/{core → _v0/core}/_store/_data_model.py +12 -12
  226. cognite/neat/{core → _v0/core}/_store/_instance.py +43 -10
  227. cognite/neat/{core → _v0/core}/_store/_provenance.py +3 -3
  228. cognite/neat/{core → _v0/core}/_store/exceptions.py +4 -4
  229. cognite/neat/_v0/core/_utils/__init__.py +0 -0
  230. cognite/neat/{core → _v0/core}/_utils/auth.py +22 -12
  231. cognite/neat/{core → _v0/core}/_utils/auxiliary.py +1 -1
  232. cognite/neat/{core → _v0/core}/_utils/collection_.py +2 -2
  233. cognite/neat/{core → _v0/core}/_utils/graph_transformations_report.py +1 -1
  234. cognite/neat/{core → _v0/core}/_utils/rdf_.py +1 -1
  235. cognite/neat/{core → _v0/core}/_utils/reader/_base.py +1 -1
  236. cognite/neat/{core → _v0/core}/_utils/spreadsheet.py +18 -4
  237. cognite/neat/{core → _v0/core}/_utils/text.py +1 -1
  238. cognite/neat/{core → _v0/core}/_utils/upload.py +3 -3
  239. cognite/neat/{session → _v0}/engine/_load.py +1 -1
  240. cognite/neat/_v0/plugins/__init__.py +4 -0
  241. cognite/neat/_v0/plugins/_base.py +9 -0
  242. cognite/neat/_v0/plugins/_data_model.py +48 -0
  243. cognite/neat/{plugins → _v0/plugins}/_issues.py +1 -1
  244. cognite/neat/{plugins → _v0/plugins}/_manager.py +7 -16
  245. cognite/neat/{session → _v0/session}/_base.py +13 -15
  246. cognite/neat/{session → _v0/session}/_collector.py +1 -1
  247. cognite/neat/_v0/session/_diff.py +51 -0
  248. cognite/neat/{session → _v0/session}/_drop.py +3 -3
  249. cognite/neat/{session → _v0/session}/_explore.py +2 -2
  250. cognite/neat/{session → _v0/session}/_fix.py +2 -2
  251. cognite/neat/{session → _v0/session}/_inspect.py +3 -3
  252. cognite/neat/{session → _v0/session}/_mapping.py +3 -3
  253. cognite/neat/{session → _v0/session}/_plugin.py +4 -5
  254. cognite/neat/{session → _v0/session}/_prepare.py +8 -8
  255. cognite/neat/{session → _v0/session}/_read.py +34 -21
  256. cognite/neat/{session → _v0/session}/_set.py +8 -8
  257. cognite/neat/{session → _v0/session}/_show.py +5 -5
  258. cognite/neat/{session → _v0/session}/_state.py +10 -10
  259. cognite/neat/{session → _v0/session}/_subset.py +4 -4
  260. cognite/neat/{session → _v0/session}/_template.py +11 -11
  261. cognite/neat/{session → _v0/session}/_to.py +12 -12
  262. cognite/neat/{session → _v0/session}/_wizard.py +1 -1
  263. cognite/neat/{session → _v0/session}/exceptions.py +5 -5
  264. cognite/neat/_version.py +1 -1
  265. cognite/neat/legacy.py +6 -0
  266. cognite_neat-1.0.22.dist-info/METADATA +123 -0
  267. cognite_neat-1.0.22.dist-info/RECORD +329 -0
  268. cognite_neat-1.0.22.dist-info/WHEEL +4 -0
  269. cognite/neat/core/_data_model/importers/_rdf/_owl2data_model.py +0 -91
  270. cognite/neat/core/_data_model/models/entities/_loaders.py +0 -75
  271. cognite/neat/plugins/__init__.py +0 -3
  272. cognite/neat/plugins/data_model/importers/__init__.py +0 -5
  273. cognite/neat/plugins/data_model/importers/_base.py +0 -28
  274. cognite/neat/session/_session/_data_model/__init__.py +0 -3
  275. cognite/neat/session/_session/_data_model/_read.py +0 -193
  276. cognite/neat/session/_session/_data_model/_routes.py +0 -45
  277. cognite/neat/session/_session/_data_model/_show.py +0 -147
  278. cognite/neat/session/_session/_data_model/_write.py +0 -335
  279. cognite_neat-0.123.24.dist-info/METADATA +0 -144
  280. cognite_neat-0.123.24.dist-info/RECORD +0 -201
  281. cognite_neat-0.123.24.dist-info/WHEEL +0 -4
  282. cognite_neat-0.123.24.dist-info/licenses/LICENSE +0 -201
  283. /cognite/neat/{core → _client/init}/__init__.py +0 -0
  284. /cognite/neat/{core/_client/_api → _data_model}/__init__.py +0 -0
  285. /cognite/neat/{core/_client/data_classes → _data_model/deployer}/__init__.py +0 -0
  286. /cognite/neat/{core/_data_model → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  287. /cognite/neat/{core/_instances → _data_model/importers/_table_importer}/__init__.py +0 -0
  288. /cognite/neat/{core/_instances/extractors/_classic_cdf → _data_model/models}/__init__.py +0 -0
  289. /cognite/neat/{core/_utils → _data_model/models/conceptual}/__init__.py +0 -0
  290. /cognite/neat/{plugins/data_model → _data_model/validation}/__init__.py +0 -0
  291. /cognite/neat/{session/_session → _session/_html}/__init__.py +0 -0
  292. /cognite/neat/{core → _v0/core}/_client/__init__.py +0 -0
  293. /cognite/neat/{core → _v0/core}/_client/data_classes/data_modeling.py +0 -0
  294. /cognite/neat/{core → _v0/core}/_client/data_classes/neat_sequence.py +0 -0
  295. /cognite/neat/{core → _v0/core}/_client/data_classes/statistics.py +0 -0
  296. /cognite/neat/{core → _v0/core}/_config.py +0 -0
  297. /cognite/neat/{core → _v0/core}/_data_model/analysis/__init__.py +0 -0
  298. /cognite/neat/{core → _v0/core}/_data_model/catalog/__init__.py +0 -0
  299. /cognite/neat/{core → _v0/core}/_data_model/catalog/classic_model.xlsx +0 -0
  300. /cognite/neat/{core → _v0/core}/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  301. /cognite/neat/{core → _v0/core}/_data_model/catalog/hello_world_pump.xlsx +0 -0
  302. /cognite/neat/{core → _v0/core}/_data_model/importers/__init__.py +0 -0
  303. /cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/__init__.py +0 -0
  304. /cognite/neat/{core → _v0/core}/_data_model/models/_base_unverified.py +0 -0
  305. /cognite/neat/{core → _v0/core}/_data_model/models/conceptual/__init__.py +0 -0
  306. /cognite/neat/{core → _v0/core}/_data_model/models/entities/_constants.py +0 -0
  307. /cognite/neat/{core → _v0/core}/_data_model/models/entities/_wrapped.py +0 -0
  308. /cognite/neat/{core → _v0/core}/_data_model/models/mapping/__init__.py +0 -0
  309. /cognite/neat/{core → _v0/core}/_data_model/models/mapping/_classic2core.yaml +0 -0
  310. /cognite/neat/{core → _v0/core}/_data_model/transformers/__init__.py +0 -0
  311. /cognite/neat/{core → _v0/core}/_instances/_shared.py +0 -0
  312. /cognite/neat/{core → _v0/core}/_instances/_tracking/__init__.py +0 -0
  313. /cognite/neat/{core → _v0/core}/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  314. /cognite/neat/{core → _v0/core}/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
  315. /cognite/neat/{core → _v0/core}/_instances/examples/__init__.py +0 -0
  316. /cognite/neat/{core → _v0/core}/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  317. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_assets.py +0 -0
  318. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
  319. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_events.py +0 -0
  320. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_files.py +0 -0
  321. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_labels.py +0 -0
  322. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
  323. /cognite/neat/{core → _v0/core}/_instances/loaders/__init__.py +0 -0
  324. /cognite/neat/{core → _v0/core}/_instances/queries/__init__.py +0 -0
  325. /cognite/neat/{core → _v0/core}/_instances/queries/_base.py +0 -0
  326. /cognite/neat/{core → _v0/core}/_instances/queries/_queries.py +0 -0
  327. /cognite/neat/{core → _v0/core}/_instances/transformers/__init__.py +0 -0
  328. /cognite/neat/{core → _v0/core}/_issues/__init__.py +0 -0
  329. /cognite/neat/{core → _v0/core}/_issues/formatters.py +0 -0
  330. /cognite/neat/{core → _v0/core}/_shared.py +0 -0
  331. /cognite/neat/{core → _v0/core}/_store/__init__.py +0 -0
  332. /cognite/neat/{core → _v0/core}/_utils/io_.py +0 -0
  333. /cognite/neat/{core → _v0/core}/_utils/reader/__init__.py +0 -0
  334. /cognite/neat/{core → _v0/core}/_utils/tarjan.py +0 -0
  335. /cognite/neat/{core → _v0/core}/_utils/time_.py +0 -0
  336. /cognite/neat/{core → _v0/core}/_utils/xml_.py +0 -0
  337. /cognite/neat/{session → _v0}/engine/__init__.py +0 -0
  338. /cognite/neat/{session → _v0}/engine/_import.py +0 -0
  339. /cognite/neat/{session → _v0}/engine/_interface.py +0 -0
  340. /cognite/neat/{session → _v0/session}/__init__.py +0 -0
  341. /cognite/neat/{session → _v0/session}/_experimental.py +0 -0
  342. /cognite/neat/{session → _v0/session}/_state/README.md +0 -0
@@ -0,0 +1,409 @@
1
+ import itertools
2
+ from collections.abc import Mapping, Set
3
+ from dataclasses import dataclass
4
+ from functools import lru_cache
5
+ from typing import Literal, cast
6
+
7
+ from openpyxl import Workbook
8
+ from openpyxl.cell import MergedCell
9
+ from openpyxl.styles import Border, Font, PatternFill, Side
10
+ from openpyxl.utils import get_column_letter
11
+ from openpyxl.worksheet.datavalidation import DataValidation
12
+ from openpyxl.worksheet.worksheet import Worksheet
13
+
14
+ from cognite.neat._data_model._constants import (
15
+ CDF_CDM_SPACE,
16
+ CDF_CDM_VERSION,
17
+ COGNITE_CONCEPTS_3D,
18
+ COGNITE_CONCEPTS_ANNOTATIONS,
19
+ COGNITE_CONCEPTS_CONFIGURATIONS,
20
+ COGNITE_CONCEPTS_INTERFACES,
21
+ COGNITE_CONCEPTS_MAIN,
22
+ )
23
+ from cognite.neat._data_model.importers._table_importer.data_classes import DMSContainer, DMSProperty, DMSView, TableDMS
24
+ from cognite.neat._data_model.models.dms import (
25
+ DMS_DATA_TYPES,
26
+ EnumProperty,
27
+ FileCDFExternalIdReference,
28
+ SequenceCDFExternalIdReference,
29
+ TimeseriesCDFExternalIdReference,
30
+ )
31
+ from cognite.neat._utils.useful_types import CellValueType, DataModelTableType
32
+
33
+ MAIN_HEADERS_BY_SHEET_NAME: Mapping[str, str] = {
34
+ "Properties": "Definition of Properties",
35
+ "Views": "Definition of Views",
36
+ "Containers": "Definition of Containers",
37
+ "Nodes": "Definition of Nodes",
38
+ "Enum": "Definition of Enum Collections",
39
+ }
40
+ MAX_COLUMN_WIDTH = 70.0
41
+ HEADER_ROWS = 2
42
+
43
+
44
+ @dataclass
45
+ class WorkbookOptions:
46
+ """Options for creating an Excel workbook from a data model.
47
+
48
+ Attributes:
49
+ adjust_column_width (bool): Whether to adjust the column widths to fit the content. Default
50
+ is True.
51
+ style_headers (bool): Whether to style the header rows. Default is True.
52
+ row_band_highlighting (bool): Whether to apply row band highlighting to the properties sheet.
53
+ Default is True.
54
+ separate_view_properties (bool): Whether to separate properties by view with an empty row.
55
+ Default is False.
56
+ add_dropdowns (bool): Whether to add drop-down menus for certain columns. Default is True.
57
+ dropdown_implements (Set[Literal["main", "interface", "configuration", "annotation", "3D"]]):
58
+ The types of Cognite concepts to include in the "implements" drop-down menu. Default is
59
+ {"main", "interface"}.
60
+ max_views (int): The maximum number of views to support in the drop-down menus. Default is 100.
61
+ max_containers (int): The maximum number of containers to support in the drop-down menus. Default is 100.
62
+ max_properties_per_view (int): The maximum number of properties per view to support in the
63
+ drop-down menus. Default is 100.
64
+ skip_properties_in_other_spaces (bool): Whether to skip properties that are in other spaces
65
+ in the properties sheet. Default is True.
66
+ """
67
+
68
+ adjust_column_width: bool = True
69
+ style_headers: bool = True
70
+ row_band_highlighting: bool = True
71
+ separate_view_properties: bool = False
72
+ add_dropdowns: bool = True
73
+ dropdown_implements: Set[Literal["main", "interface", "configuration", "annotation", "3D"]] = frozenset(
74
+ {"main", "interface"}
75
+ )
76
+ max_views: int = 100
77
+ max_containers: int = 100
78
+ max_properties_per_view: int = 100
79
+ skip_properties_in_other_spaces: bool = True
80
+
81
+
82
+ class WorkbookCreator:
83
+ # skip types which require special handling (enum) or are surpassed by CDM (CDF references)
84
+ DROPDOWN_DMS_TYPE_EXCLUDE = frozenset(
85
+ {
86
+ # MyPy does not understand that model_fields is in all pydantic classes.
87
+ prop.model_fields["type"].default # type: ignore[attr-defined]
88
+ for prop in [
89
+ EnumProperty,
90
+ TimeseriesCDFExternalIdReference,
91
+ SequenceCDFExternalIdReference,
92
+ FileCDFExternalIdReference,
93
+ ]
94
+ }
95
+ )
96
+
97
+ # These classer are used to refer to sheets that needs to be explicitly checked for in the
98
+ # workbook creation.
99
+ class Sheets:
100
+ metadata = cast(str, TableDMS.model_fields["metadata"].validation_alias)
101
+ properties = cast(str, TableDMS.model_fields["properties"].validation_alias)
102
+ views = cast(str, TableDMS.model_fields["views"].validation_alias)
103
+ containers = cast(str, TableDMS.model_fields["containers"].validation_alias)
104
+ dropdown_source = "_dropdown_source"
105
+
106
+ # The following classes are used to refer to sheets and columns that are used
107
+ # in dropdown creation.
108
+ class PropertyColumns:
109
+ view = cast(str, DMSProperty.model_fields["view"].validation_alias)
110
+ value_type = cast(str, DMSProperty.model_fields["value_type"].validation_alias)
111
+ immutable = cast(str, DMSProperty.model_fields["immutable"].validation_alias)
112
+ container = cast(str, DMSProperty.model_fields["container"].validation_alias)
113
+
114
+ class ContainerColumns:
115
+ container = cast(str, DMSContainer.model_fields["container"].validation_alias)
116
+ used_for = cast(str, DMSContainer.model_fields["used_for"].validation_alias)
117
+
118
+ class ViewColumns:
119
+ view = cast(str, DMSView.model_fields["view"].validation_alias)
120
+ implements = cast(str, DMSView.model_fields["implements"].validation_alias)
121
+
122
+ class DropdownSourceColumns:
123
+ view = 1
124
+ implements = 2
125
+ value_type = 3
126
+ container = 4
127
+ in_model = 5
128
+ immutable = 5
129
+ used_for = 6
130
+
131
+ def __init__(self, options: WorkbookOptions | None = None) -> None:
132
+ options = options or WorkbookOptions()
133
+ self._adjust_column_width = options.adjust_column_width
134
+ self._style_headers = options.style_headers
135
+ self._row_band_highlighting = options.row_band_highlighting
136
+ self._separate_view_properties = options.separate_view_properties
137
+ self._add_dropdowns = options.add_dropdowns
138
+ self._dropdown_implements = options.dropdown_implements
139
+ self._max_views = options.max_views
140
+ self._max_containers = options.max_containers
141
+ self._max_properties_per_view = options.max_properties_per_view
142
+
143
+ def create_workbook(self, tables: DataModelTableType) -> Workbook:
144
+ """Creates an Excel workbook from the data model.
145
+
146
+ Args:
147
+ tables (DataModelTableType): The data model in table
148
+ """
149
+ workbook = Workbook()
150
+ # Remove default sheet named "Sheet"
151
+ workbook.remove(workbook["Sheet"])
152
+
153
+ index_by_sheet_name_column: dict[tuple[str, str], int] = {}
154
+ for sheet_name, table in tables.items():
155
+ if not table and sheet_name not in TableDMS.required_sheets():
156
+ continue
157
+ worksheet = workbook.create_sheet(title=sheet_name)
158
+ if sheet_name == self.Sheets.metadata:
159
+ self._write_metadata_to_worksheet(worksheet, table)
160
+ continue
161
+ if table:
162
+ column_headers = list(table[0].keys())
163
+ else:
164
+ column_headers = TableDMS.get_sheet_column_by_name(sheet_name, column_type="all")
165
+ self._write_table_to_worksheet(worksheet, table, MAIN_HEADERS_BY_SHEET_NAME[sheet_name], column_headers)
166
+ for i, column in enumerate(column_headers, 1):
167
+ index_by_sheet_name_column[(sheet_name, column)] = i
168
+
169
+ if self._adjust_column_width:
170
+ self._adjust_column_widths(worksheet)
171
+
172
+ if self._add_dropdowns:
173
+ self._add_drop_downs(workbook, index_by_sheet_name_column)
174
+ return workbook
175
+
176
+ @staticmethod
177
+ def _write_metadata_to_worksheet(worksheet: Worksheet, table: list[dict[str, CellValueType]]) -> None:
178
+ """Writes Metadata to the given worksheet.
179
+
180
+ Metadata is written as key-value pairs without headers.
181
+ """
182
+ for row in table:
183
+ worksheet.append(list(row.values()))
184
+
185
+ def _write_table_to_worksheet(
186
+ self, worksheet: Worksheet, table: list[dict[str, CellValueType]], main_header: str, column_headers: list[str]
187
+ ) -> None:
188
+ worksheet.append([main_header] + [""] * (len(column_headers) - 1))
189
+ if self._style_headers:
190
+ worksheet.merge_cells(start_row=1, start_column=1, end_row=1, end_column=max(3, len(column_headers)))
191
+ cell = worksheet.cell(row=1, column=1)
192
+ cell.font = Font(bold=True, size=20)
193
+ cell.fill = PatternFill(fgColor="FFC000", patternType="solid")
194
+
195
+ worksheet.append(column_headers)
196
+ header_row = 2 if main_header else 1
197
+ if self._style_headers:
198
+ for col_idx in range(1, len(column_headers) + 1):
199
+ cell = worksheet.cell(row=header_row, column=col_idx)
200
+ cell.font = Font(bold=True, size=14)
201
+ cell.fill = PatternFill(fgColor="FFD966", patternType="solid")
202
+
203
+ self._write_rows_to_worksheet(worksheet, table, column_headers)
204
+
205
+ if self._style_headers:
206
+ # openpyxl is not well typed
207
+ worksheet.freeze_panes = worksheet.cell(row=header_row + 1, column=1) # type: ignore[assignment]
208
+
209
+ def _write_rows_to_worksheet(
210
+ self, worksheet: Worksheet, table: list[dict[str, CellValueType]], headers: list[str]
211
+ ) -> None:
212
+ is_properties = worksheet.title == self.Sheets.properties
213
+ fill_colors = itertools.cycle(["CADCFC", "FFFFFF"])
214
+ fill_color = next(fill_colors)
215
+ is_new_view = False
216
+ last_view_value: CellValueType = None
217
+ side = Side(style="thin")
218
+ for row in table:
219
+ if is_properties:
220
+ is_new_view = row[self.PropertyColumns.view] != last_view_value and last_view_value is not None
221
+ if is_new_view and is_properties and self._separate_view_properties:
222
+ worksheet.append([None] * len(headers)) # Add an empty row between views
223
+ if self._row_band_highlighting:
224
+ for cell in worksheet[worksheet.max_row]:
225
+ cell.border = Border(left=side, right=side, top=side, bottom=side)
226
+
227
+ worksheet.append(list(row.values()))
228
+ if self._row_band_highlighting and is_new_view and is_properties:
229
+ fill_color = next(fill_colors)
230
+
231
+ if self._row_band_highlighting and is_properties:
232
+ for cell in worksheet[worksheet.max_row]:
233
+ cell.fill = PatternFill(fgColor=fill_color, fill_type="solid")
234
+ cell.border = Border(left=side, right=side, top=side, bottom=side)
235
+
236
+ if is_properties:
237
+ last_view_value = row[self.PropertyColumns.view]
238
+
239
+ @classmethod
240
+ def _adjust_column_widths(cls, worksheet: Worksheet) -> None:
241
+ for column_cells in worksheet.columns:
242
+ try:
243
+ max_length = max(len(str(cell.value)) for cell in column_cells if cell.value is not None)
244
+ except ValueError:
245
+ max_length = 0
246
+
247
+ selected_column = column_cells[0]
248
+ if isinstance(selected_column, MergedCell):
249
+ selected_column = column_cells[1]
250
+
251
+ current = worksheet.column_dimensions[selected_column.column_letter].width or (max_length + 0.5) # type: ignore[union-attr]
252
+ worksheet.column_dimensions[selected_column.column_letter].width = min( # type: ignore[union-attr]
253
+ max(current, max_length + 0.5), MAX_COLUMN_WIDTH
254
+ )
255
+ return None
256
+
257
+ def _add_drop_downs(self, workbook: Workbook, index_by_sheet_name_column: dict[tuple[str, str], int]) -> None:
258
+ """Adds drop down menus to specific columns for fast and accurate data entry
259
+
260
+ Args:
261
+ workbook: Workbook representation of the Excel file.
262
+ index_by_sheet_name_column: A mapping of (sheet name, column name) to column index.
263
+ """
264
+
265
+ self._create_dropdown_source_sheet(workbook)
266
+
267
+ property_sheet = workbook[self.Sheets.properties]
268
+ self._add_validation(
269
+ property_sheet,
270
+ self.DropdownSourceColumns.view,
271
+ self._max_views,
272
+ index_by_sheet_name_column[(self.Sheets.properties, self.PropertyColumns.view)],
273
+ self._max_views,
274
+ )
275
+ self._add_validation(
276
+ property_sheet,
277
+ self.DropdownSourceColumns.value_type,
278
+ len(DMS_DATA_TYPES) - len(self.DROPDOWN_DMS_TYPE_EXCLUDE) + self._max_views,
279
+ index_by_sheet_name_column[(self.Sheets.properties, self.PropertyColumns.value_type)],
280
+ self._max_views * self._max_properties_per_view,
281
+ )
282
+ self._add_validation(
283
+ property_sheet,
284
+ self.DropdownSourceColumns.immutable,
285
+ 2, # True, False
286
+ index_by_sheet_name_column[(self.Sheets.properties, self.PropertyColumns.immutable)],
287
+ self._max_views * self._max_properties_per_view,
288
+ )
289
+ self._add_validation(
290
+ property_sheet,
291
+ self.DropdownSourceColumns.container,
292
+ self._max_containers,
293
+ index_by_sheet_name_column[(self.Sheets.properties, self.PropertyColumns.container)],
294
+ self._max_views * self._max_properties_per_view,
295
+ )
296
+
297
+ view_sheet = workbook[self.Sheets.views]
298
+ self._add_validation(
299
+ view_sheet,
300
+ self.DropdownSourceColumns.implements,
301
+ self._max_views + len(self._get_cognite_concepts()),
302
+ index_by_sheet_name_column[(self.Sheets.views, self.ViewColumns.implements)],
303
+ self._max_views,
304
+ )
305
+ container_sheet = workbook[self.Sheets.containers]
306
+ self._add_validation(
307
+ container_sheet,
308
+ self.DropdownSourceColumns.used_for,
309
+ 3, # node, edge, all
310
+ index_by_sheet_name_column[(self.Sheets.containers, self.ContainerColumns.used_for)],
311
+ self._max_containers,
312
+ )
313
+
314
+ def _add_validation(
315
+ self, sheet: Worksheet, column_index: int, row_range: int, sheet_column_index: int, sheet_row_range: int
316
+ ) -> None:
317
+ """Adds data validation to a specific column in a sheet.
318
+
319
+ Args:
320
+ sheet: The worksheet to add the data validation to.
321
+ column_index: The column index in the dropdown source sheet to use as the source for the drop-down.
322
+ row_range: The number of rows in the dropdown source sheet to use as the source for the drop-down.
323
+ sheet_column_index: The column index in the target sheet to add the data validation to.
324
+ sheet_row_range: The number of rows in the target sheet to add the data validation to.
325
+ """
326
+ letter = get_column_letter(column_index)
327
+ data_validation = DataValidation(
328
+ type="list", formula1=f"={self.Sheets.dropdown_source}!${letter}$1:${letter}${row_range}"
329
+ )
330
+ sheet.add_data_validation(data_validation)
331
+ target_letter = get_column_letter(sheet_column_index)
332
+ data_validation.add(f"{target_letter}{HEADER_ROWS + 1}:{target_letter}{HEADER_ROWS + sheet_row_range}")
333
+
334
+ def _create_dropdown_source_sheet(self, workbook: Workbook) -> None:
335
+ """This methods creates a hidden sheet in the workbook which contains
336
+ the source data for the drop-down menus.
337
+
338
+ Args:
339
+ workbook: Workbook representation of the Excel file.
340
+
341
+ """
342
+ dropdown_sheet = workbook.create_sheet(title=self.Sheets.dropdown_source)
343
+ exclude = self.DROPDOWN_DMS_TYPE_EXCLUDE
344
+ for no, dms_type in enumerate([type for type in DMS_DATA_TYPES.keys() if type not in exclude], 1):
345
+ dropdown_sheet.cell(row=no, column=self.DropdownSourceColumns.value_type, value=dms_type)
346
+
347
+ cognite_concepts = self._get_cognite_concepts()
348
+
349
+ for i, concept in enumerate(cognite_concepts, 1):
350
+ dropdown_sheet.cell(
351
+ row=i,
352
+ column=self.DropdownSourceColumns.implements,
353
+ value=f"{CDF_CDM_SPACE}:{concept}(version={CDF_CDM_VERSION})",
354
+ )
355
+
356
+ dms_type_count = len(DMS_DATA_TYPES) - len(exclude)
357
+ core_concept_count = len(cognite_concepts)
358
+ for i in range(1, self._max_views + 1):
359
+ source_row = i + HEADER_ROWS
360
+ view_reference = f'=IF(ISBLANK({self.Sheets.views}!A{source_row}), "", {self.Sheets.views}!A{source_row})'
361
+ dropdown_sheet.cell(row=i, column=self.DropdownSourceColumns.view, value=view_reference)
362
+ dropdown_sheet.cell(
363
+ row=i + core_concept_count, column=self.DropdownSourceColumns.implements, value=view_reference
364
+ )
365
+ dropdown_sheet.cell(
366
+ row=i + dms_type_count, column=self.DropdownSourceColumns.value_type, value=view_reference
367
+ )
368
+
369
+ for i in range(1, self._max_containers + 1):
370
+ source_row = i + HEADER_ROWS
371
+ container_reference = (
372
+ f'=IF(ISBLANK({self.Sheets.containers}!A{source_row}), "", {self.Sheets.containers}!A{source_row})'
373
+ )
374
+ dropdown_sheet.cell(row=i, column=self.DropdownSourceColumns.container, value=container_reference)
375
+
376
+ for i, value in enumerate([True, False, None], 1):
377
+ dropdown_sheet.cell(row=i, column=self.DropdownSourceColumns.in_model, value=value)
378
+
379
+ for i, value in enumerate(["node", "edge", "all"], 1):
380
+ dropdown_sheet.cell(row=i, column=self.DropdownSourceColumns.used_for, value=value)
381
+
382
+ dropdown_sheet.sheet_state = "hidden"
383
+
384
+ def _get_cognite_concepts(self) -> list[str]:
385
+ """Gets the cognite concepts based on the dropdown_implements setting."""
386
+ return _get_cognite_concepts(self._dropdown_implements)
387
+
388
+
389
+ @lru_cache(maxsize=1)
390
+ def _get_cognite_concepts(
391
+ dropdown_implements: Set[Literal["main", "interface", "configuration", "annotation", "3D"]],
392
+ ) -> list[str]:
393
+ """Gets the cognite concepts based on the dropdown_implements setting.
394
+
395
+ This is moved outside of the class to enable caching.
396
+ """
397
+ cognite_concepts: list[str] = []
398
+
399
+ if "main" in dropdown_implements:
400
+ cognite_concepts.extend(COGNITE_CONCEPTS_MAIN)
401
+ if "interface" in dropdown_implements:
402
+ cognite_concepts.extend(COGNITE_CONCEPTS_INTERFACES)
403
+ if "configuration" in dropdown_implements:
404
+ cognite_concepts.extend(COGNITE_CONCEPTS_CONFIGURATIONS)
405
+ if "annotation" in dropdown_implements:
406
+ cognite_concepts.extend(COGNITE_CONCEPTS_ANNOTATIONS)
407
+ if "3D" in dropdown_implements:
408
+ cognite_concepts.extend(COGNITE_CONCEPTS_3D)
409
+ return cognite_concepts