cognite-neat 0.123.2__py3-none-any.whl → 0.127.30__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 (333) hide show
  1. cognite/neat/__init__.py +2 -2
  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/_config.py +185 -0
  13. cognite/neat/_data_model/_analysis.py +196 -0
  14. cognite/neat/_data_model/_constants.py +67 -0
  15. cognite/neat/_data_model/_identifiers.py +61 -0
  16. cognite/neat/_data_model/_shared.py +41 -0
  17. cognite/neat/_data_model/deployer/_differ.py +140 -0
  18. cognite/neat/_data_model/deployer/_differ_container.py +360 -0
  19. cognite/neat/_data_model/deployer/_differ_data_model.py +54 -0
  20. cognite/neat/_data_model/deployer/_differ_space.py +9 -0
  21. cognite/neat/_data_model/deployer/_differ_view.py +299 -0
  22. cognite/neat/_data_model/deployer/data_classes.py +529 -0
  23. cognite/neat/_data_model/deployer/deployer.py +401 -0
  24. cognite/neat/_data_model/exporters/__init__.py +15 -0
  25. cognite/neat/_data_model/exporters/_api_exporter.py +37 -0
  26. cognite/neat/_data_model/exporters/_base.py +24 -0
  27. cognite/neat/_data_model/exporters/_table_exporter/exporter.py +128 -0
  28. cognite/neat/_data_model/exporters/_table_exporter/workbook.py +409 -0
  29. cognite/neat/_data_model/exporters/_table_exporter/writer.py +421 -0
  30. cognite/neat/_data_model/importers/__init__.py +5 -0
  31. cognite/neat/_data_model/importers/_api_importer.py +166 -0
  32. cognite/neat/_data_model/importers/_base.py +16 -0
  33. cognite/neat/_data_model/importers/_table_importer/data_classes.py +295 -0
  34. cognite/neat/_data_model/importers/_table_importer/importer.py +192 -0
  35. cognite/neat/_data_model/importers/_table_importer/reader.py +1063 -0
  36. cognite/neat/_data_model/importers/_table_importer/source.py +94 -0
  37. cognite/neat/_data_model/models/conceptual/_base.py +18 -0
  38. cognite/neat/_data_model/models/conceptual/_concept.py +67 -0
  39. cognite/neat/_data_model/models/conceptual/_data_model.py +51 -0
  40. cognite/neat/_data_model/models/conceptual/_properties.py +104 -0
  41. cognite/neat/_data_model/models/conceptual/_property.py +105 -0
  42. cognite/neat/_data_model/models/dms/__init__.py +206 -0
  43. cognite/neat/_data_model/models/dms/_base.py +31 -0
  44. cognite/neat/_data_model/models/dms/_constants.py +48 -0
  45. cognite/neat/_data_model/models/dms/_constraints.py +42 -0
  46. cognite/neat/_data_model/models/dms/_container.py +159 -0
  47. cognite/neat/_data_model/models/dms/_data_model.py +95 -0
  48. cognite/neat/_data_model/models/dms/_data_types.py +195 -0
  49. cognite/neat/_data_model/models/dms/_http.py +28 -0
  50. cognite/neat/_data_model/models/dms/_indexes.py +30 -0
  51. cognite/neat/_data_model/models/dms/_limits.py +96 -0
  52. cognite/neat/_data_model/models/dms/_references.py +135 -0
  53. cognite/neat/_data_model/models/dms/_schema.py +18 -0
  54. cognite/neat/_data_model/models/dms/_space.py +48 -0
  55. cognite/neat/_data_model/models/dms/_types.py +17 -0
  56. cognite/neat/_data_model/models/dms/_view_filter.py +282 -0
  57. cognite/neat/_data_model/models/dms/_view_property.py +235 -0
  58. cognite/neat/_data_model/models/dms/_views.py +210 -0
  59. cognite/neat/_data_model/models/entities/__init__.py +50 -0
  60. cognite/neat/_data_model/models/entities/_base.py +101 -0
  61. cognite/neat/_data_model/models/entities/_constants.py +22 -0
  62. cognite/neat/_data_model/models/entities/_data_types.py +144 -0
  63. cognite/neat/_data_model/models/entities/_identifiers.py +61 -0
  64. cognite/neat/_data_model/models/entities/_parser.py +226 -0
  65. cognite/neat/_data_model/validation/dms/__init__.py +75 -0
  66. cognite/neat/_data_model/validation/dms/_ai_readiness.py +364 -0
  67. cognite/neat/_data_model/validation/dms/_base.py +307 -0
  68. cognite/neat/_data_model/validation/dms/_connections.py +638 -0
  69. cognite/neat/_data_model/validation/dms/_consistency.py +57 -0
  70. cognite/neat/_data_model/validation/dms/_containers.py +174 -0
  71. cognite/neat/_data_model/validation/dms/_limits.py +420 -0
  72. cognite/neat/_data_model/validation/dms/_orchestrator.py +222 -0
  73. cognite/neat/_data_model/validation/dms/_views.py +103 -0
  74. cognite/neat/_exceptions.py +56 -0
  75. cognite/neat/_issues.py +68 -0
  76. cognite/neat/_session/__init__.py +3 -0
  77. cognite/neat/_session/_html/_render.py +30 -0
  78. cognite/neat/_session/_html/static/__init__.py +8 -0
  79. cognite/neat/_session/_html/static/deployment.css +303 -0
  80. cognite/neat/_session/_html/static/deployment.js +150 -0
  81. cognite/neat/_session/_html/static/issues.css +211 -0
  82. cognite/neat/_session/_html/static/issues.js +168 -0
  83. cognite/neat/_session/_html/static/shared.css +186 -0
  84. cognite/neat/_session/_html/templates/__init__.py +4 -0
  85. cognite/neat/_session/_html/templates/deployment.html +75 -0
  86. cognite/neat/_session/_html/templates/issues.html +45 -0
  87. cognite/neat/_session/_issues.py +81 -0
  88. cognite/neat/_session/_opt.py +35 -0
  89. cognite/neat/_session/_physical.py +261 -0
  90. cognite/neat/_session/_result.py +236 -0
  91. cognite/neat/_session/_session.py +88 -0
  92. cognite/neat/_session/_usage_analytics/__init__.py +0 -0
  93. cognite/neat/_session/_usage_analytics/_collector.py +131 -0
  94. cognite/neat/_session/_usage_analytics/_constants.py +23 -0
  95. cognite/neat/_session/_usage_analytics/_storage.py +240 -0
  96. cognite/neat/_session/_wrappers.py +82 -0
  97. cognite/neat/_state_machine/__init__.py +10 -0
  98. cognite/neat/_state_machine/_base.py +37 -0
  99. cognite/neat/_state_machine/_states.py +52 -0
  100. cognite/neat/_store/__init__.py +3 -0
  101. cognite/neat/_store/_provenance.py +81 -0
  102. cognite/neat/_store/_store.py +156 -0
  103. cognite/neat/_utils/__init__.py +0 -0
  104. cognite/neat/_utils/_reader.py +194 -0
  105. cognite/neat/_utils/auxiliary.py +39 -0
  106. cognite/neat/_utils/collection.py +11 -0
  107. cognite/neat/_utils/http_client/__init__.py +39 -0
  108. cognite/neat/_utils/http_client/_client.py +245 -0
  109. cognite/neat/_utils/http_client/_config.py +19 -0
  110. cognite/neat/_utils/http_client/_data_classes.py +294 -0
  111. cognite/neat/_utils/http_client/_tracker.py +31 -0
  112. cognite/neat/_utils/text.py +71 -0
  113. cognite/neat/_utils/useful_types.py +37 -0
  114. cognite/neat/_utils/validation.py +154 -0
  115. cognite/neat/_version.py +1 -1
  116. cognite/neat/v0/__init__.py +0 -0
  117. cognite/neat/v0/core/__init__.py +0 -0
  118. cognite/neat/v0/core/_client/_api/__init__.py +0 -0
  119. cognite/neat/{core → v0/core}/_client/_api/data_modeling_loaders.py +86 -7
  120. cognite/neat/{core → v0/core}/_client/_api/neat_instances.py +5 -5
  121. cognite/neat/{core → v0/core}/_client/_api/schema.py +5 -5
  122. cognite/neat/{core → v0/core}/_client/_api/statistics.py +3 -3
  123. cognite/neat/{core → v0/core}/_client/_api_client.py +1 -1
  124. cognite/neat/v0/core/_client/data_classes/__init__.py +0 -0
  125. cognite/neat/{core → v0/core}/_client/data_classes/schema.py +4 -4
  126. cognite/neat/{core → v0/core}/_client/testing.py +1 -1
  127. cognite/neat/{core → v0/core}/_constants.py +10 -3
  128. cognite/neat/v0/core/_data_model/__init__.py +0 -0
  129. cognite/neat/{core → v0/core}/_data_model/_constants.py +9 -6
  130. cognite/neat/{core → v0/core}/_data_model/_shared.py +5 -5
  131. cognite/neat/{core → v0/core}/_data_model/analysis/_base.py +12 -8
  132. cognite/neat/{core → v0/core}/_data_model/exporters/__init__.py +1 -2
  133. cognite/neat/{core → v0/core}/_data_model/exporters/_base.py +7 -7
  134. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2dms.py +9 -9
  135. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2excel.py +13 -13
  136. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2instance_template.py +4 -4
  137. cognite/neat/{core/_data_model/exporters/_data_model2ontology.py → v0/core/_data_model/exporters/_data_model2semantic_model.py} +126 -133
  138. cognite/neat/{core → v0/core}/_data_model/exporters/_data_model2yaml.py +1 -1
  139. cognite/neat/{core → v0/core}/_data_model/importers/__init__.py +4 -6
  140. cognite/neat/{core → v0/core}/_data_model/importers/_base.py +5 -5
  141. cognite/neat/{core → v0/core}/_data_model/importers/_base_file_reader.py +2 -2
  142. cognite/neat/{core → v0/core}/_data_model/importers/_dict2data_model.py +6 -6
  143. cognite/neat/{core → v0/core}/_data_model/importers/_dms2data_model.py +19 -16
  144. cognite/neat/v0/core/_data_model/importers/_graph2data_model.py +299 -0
  145. cognite/neat/v0/core/_data_model/importers/_rdf/__init__.py +4 -0
  146. cognite/neat/{core → v0/core}/_data_model/importers/_rdf/_base.py +13 -13
  147. cognite/neat/{core → v0/core}/_data_model/importers/_rdf/_inference2rdata_model.py +14 -14
  148. cognite/neat/v0/core/_data_model/importers/_rdf/_owl2data_model.py +144 -0
  149. cognite/neat/v0/core/_data_model/importers/_rdf/_shared.py +255 -0
  150. cognite/neat/{core → v0/core}/_data_model/importers/_spreadsheet2data_model.py +94 -13
  151. cognite/neat/{core → v0/core}/_data_model/models/__init__.py +3 -3
  152. cognite/neat/{core → v0/core}/_data_model/models/_base_verified.py +5 -5
  153. cognite/neat/v0/core/_data_model/models/_import_contexts.py +82 -0
  154. cognite/neat/{core → v0/core}/_data_model/models/_types.py +5 -5
  155. cognite/neat/{core → v0/core}/_data_model/models/conceptual/_unverified.py +18 -12
  156. cognite/neat/v0/core/_data_model/models/conceptual/_validation.py +308 -0
  157. cognite/neat/{core → v0/core}/_data_model/models/conceptual/_verified.py +13 -11
  158. cognite/neat/{core → v0/core}/_data_model/models/data_types.py +14 -4
  159. cognite/neat/{core → v0/core}/_data_model/models/entities/__init__.py +6 -0
  160. cognite/neat/v0/core/_data_model/models/entities/_loaders.py +155 -0
  161. cognite/neat/{core → v0/core}/_data_model/models/entities/_multi_value.py +2 -2
  162. cognite/neat/v0/core/_data_model/models/entities/_restrictions.py +230 -0
  163. cognite/neat/{core → v0/core}/_data_model/models/entities/_single_value.py +121 -16
  164. cognite/neat/{core → v0/core}/_data_model/models/entities/_types.py +10 -0
  165. cognite/neat/{core → v0/core}/_data_model/models/mapping/_classic2core.py +5 -5
  166. cognite/neat/{core → v0/core}/_data_model/models/physical/__init__.py +1 -1
  167. cognite/neat/{core → v0/core}/_data_model/models/physical/_exporter.py +28 -21
  168. cognite/neat/{core → v0/core}/_data_model/models/physical/_unverified.py +141 -38
  169. cognite/neat/{core → v0/core}/_data_model/models/physical/_validation.py +190 -24
  170. cognite/neat/{core → v0/core}/_data_model/models/physical/_verified.py +135 -15
  171. cognite/neat/{core → v0/core}/_data_model/transformers/__init__.py +2 -0
  172. cognite/neat/{core → v0/core}/_data_model/transformers/_base.py +4 -4
  173. cognite/neat/{core → v0/core}/_data_model/transformers/_converters.py +39 -32
  174. cognite/neat/{core → v0/core}/_data_model/transformers/_mapping.py +7 -7
  175. cognite/neat/v0/core/_data_model/transformers/_union_conceptual.py +208 -0
  176. cognite/neat/{core → v0/core}/_data_model/transformers/_verification.py +7 -7
  177. cognite/neat/v0/core/_instances/__init__.py +0 -0
  178. cognite/neat/{core → v0/core}/_instances/_tracking/base.py +1 -1
  179. cognite/neat/{core → v0/core}/_instances/_tracking/log.py +1 -1
  180. cognite/neat/{core → v0/core}/_instances/extractors/__init__.py +1 -1
  181. cognite/neat/{core → v0/core}/_instances/extractors/_base.py +6 -6
  182. cognite/neat/v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
  183. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_base.py +7 -7
  184. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_classic.py +12 -12
  185. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_relationships.py +3 -3
  186. cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_sequences.py +2 -2
  187. cognite/neat/{core → v0/core}/_instances/extractors/_dict.py +6 -3
  188. cognite/neat/{core → v0/core}/_instances/extractors/_dms.py +6 -6
  189. cognite/neat/{core → v0/core}/_instances/extractors/_dms_graph.py +11 -11
  190. cognite/neat/{core → v0/core}/_instances/extractors/_mock_graph_generator.py +10 -10
  191. cognite/neat/{core → v0/core}/_instances/extractors/_raw.py +3 -3
  192. cognite/neat/{core → v0/core}/_instances/extractors/_rdf_file.py +7 -7
  193. cognite/neat/{core → v0/core}/_instances/loaders/_base.py +5 -5
  194. cognite/neat/{core → v0/core}/_instances/loaders/_rdf2dms.py +17 -17
  195. cognite/neat/{core → v0/core}/_instances/loaders/_rdf_to_instance_space.py +11 -11
  196. cognite/neat/{core → v0/core}/_instances/queries/_select.py +29 -3
  197. cognite/neat/{core → v0/core}/_instances/queries/_update.py +1 -1
  198. cognite/neat/{core → v0/core}/_instances/transformers/_base.py +4 -4
  199. cognite/neat/{core → v0/core}/_instances/transformers/_classic_cdf.py +6 -6
  200. cognite/neat/{core → v0/core}/_instances/transformers/_prune_graph.py +4 -4
  201. cognite/neat/{core → v0/core}/_instances/transformers/_rdfpath.py +1 -1
  202. cognite/neat/{core → v0/core}/_instances/transformers/_value_type.py +4 -4
  203. cognite/neat/{core → v0/core}/_issues/_base.py +11 -6
  204. cognite/neat/{core → v0/core}/_issues/_contextmanagers.py +8 -6
  205. cognite/neat/{core → v0/core}/_issues/_factory.py +11 -8
  206. cognite/neat/{core → v0/core}/_issues/errors/__init__.py +3 -1
  207. cognite/neat/{core → v0/core}/_issues/errors/_external.py +1 -1
  208. cognite/neat/{core → v0/core}/_issues/errors/_general.py +1 -1
  209. cognite/neat/{core → v0/core}/_issues/errors/_properties.py +12 -1
  210. cognite/neat/{core → v0/core}/_issues/errors/_resources.py +2 -2
  211. cognite/neat/{core → v0/core}/_issues/errors/_wrapper.py +7 -3
  212. cognite/neat/{core → v0/core}/_issues/warnings/__init__.py +5 -1
  213. cognite/neat/{core → v0/core}/_issues/warnings/_external.py +1 -1
  214. cognite/neat/{core → v0/core}/_issues/warnings/_general.py +1 -1
  215. cognite/neat/{core → v0/core}/_issues/warnings/_models.py +39 -4
  216. cognite/neat/{core → v0/core}/_issues/warnings/_properties.py +13 -2
  217. cognite/neat/{core → v0/core}/_issues/warnings/_resources.py +1 -1
  218. cognite/neat/{core → v0/core}/_issues/warnings/user_modeling.py +1 -1
  219. cognite/neat/{core → v0/core}/_store/_data_model.py +13 -12
  220. cognite/neat/{core → v0/core}/_store/_instance.py +45 -12
  221. cognite/neat/{core → v0/core}/_store/_provenance.py +3 -3
  222. cognite/neat/{core → v0/core}/_store/exceptions.py +4 -4
  223. cognite/neat/v0/core/_utils/__init__.py +0 -0
  224. cognite/neat/{core → v0/core}/_utils/auth.py +1 -1
  225. cognite/neat/{core → v0/core}/_utils/auxiliary.py +7 -1
  226. cognite/neat/{core → v0/core}/_utils/collection_.py +2 -2
  227. cognite/neat/{core → v0/core}/_utils/graph_transformations_report.py +1 -1
  228. cognite/neat/{core → v0/core}/_utils/rdf_.py +38 -14
  229. cognite/neat/{core → v0/core}/_utils/reader/_base.py +1 -1
  230. cognite/neat/{core → v0/core}/_utils/spreadsheet.py +22 -4
  231. cognite/neat/v0/core/_utils/tarjan.py +44 -0
  232. cognite/neat/{core → v0/core}/_utils/text.py +1 -1
  233. cognite/neat/{core → v0/core}/_utils/upload.py +3 -3
  234. cognite/neat/v0/plugins/__init__.py +4 -0
  235. cognite/neat/v0/plugins/_base.py +9 -0
  236. cognite/neat/v0/plugins/_data_model.py +48 -0
  237. cognite/neat/{plugins → v0/plugins}/_issues.py +1 -1
  238. cognite/neat/{plugins → v0/plugins}/_manager.py +7 -16
  239. cognite/neat/{session → v0/session}/_base.py +13 -10
  240. cognite/neat/{session → v0/session}/_collector.py +1 -1
  241. cognite/neat/v0/session/_diff.py +51 -0
  242. cognite/neat/{session → v0/session}/_drop.py +3 -3
  243. cognite/neat/{session → v0/session}/_explore.py +2 -2
  244. cognite/neat/{session → v0/session}/_fix.py +2 -2
  245. cognite/neat/{session → v0/session}/_inspect.py +3 -3
  246. cognite/neat/{session → v0/session}/_mapping.py +3 -3
  247. cognite/neat/{session → v0/session}/_plugin.py +4 -5
  248. cognite/neat/{session → v0/session}/_prepare.py +8 -8
  249. cognite/neat/{session → v0/session}/_read.py +33 -43
  250. cognite/neat/{session → v0/session}/_set.py +8 -8
  251. cognite/neat/{session → v0/session}/_show.py +5 -5
  252. cognite/neat/{session → v0/session}/_state.py +22 -8
  253. cognite/neat/{session → v0/session}/_subset.py +4 -4
  254. cognite/neat/{session → v0/session}/_template.py +11 -11
  255. cognite/neat/{session → v0/session}/_to.py +12 -12
  256. cognite/neat/{session → v0/session}/_wizard.py +1 -1
  257. cognite/neat/{session → v0/session}/engine/_load.py +1 -1
  258. cognite/neat/{session → v0/session}/exceptions.py +5 -5
  259. cognite/neat/v1.py +3 -0
  260. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/METADATA +9 -8
  261. cognite_neat-0.127.30.dist-info/RECORD +319 -0
  262. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/WHEEL +1 -1
  263. cognite/neat/core/_data_model/importers/_dtdl2data_model/__init__.py +0 -3
  264. cognite/neat/core/_data_model/importers/_dtdl2data_model/_unit_lookup.py +0 -224
  265. cognite/neat/core/_data_model/importers/_dtdl2data_model/dtdl_converter.py +0 -320
  266. cognite/neat/core/_data_model/importers/_dtdl2data_model/dtdl_importer.py +0 -155
  267. cognite/neat/core/_data_model/importers/_dtdl2data_model/spec.py +0 -363
  268. cognite/neat/core/_data_model/importers/_rdf/__init__.py +0 -5
  269. cognite/neat/core/_data_model/importers/_rdf/_imf2data_model.py +0 -98
  270. cognite/neat/core/_data_model/importers/_rdf/_owl2data_model.py +0 -87
  271. cognite/neat/core/_data_model/importers/_rdf/_shared.py +0 -168
  272. cognite/neat/core/_data_model/models/conceptual/_validation.py +0 -294
  273. cognite/neat/core/_data_model/models/entities/_loaders.py +0 -75
  274. cognite/neat/plugins/__init__.py +0 -3
  275. cognite/neat/plugins/data_model/importers/__init__.py +0 -5
  276. cognite/neat/plugins/data_model/importers/_base.py +0 -28
  277. cognite_neat-0.123.2.dist-info/RECORD +0 -197
  278. /cognite/neat/{core → _data_model}/__init__.py +0 -0
  279. /cognite/neat/{core/_client/_api → _data_model/deployer}/__init__.py +0 -0
  280. /cognite/neat/{core/_client/data_classes → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  281. /cognite/neat/{core/_data_model → _data_model/importers/_table_importer}/__init__.py +0 -0
  282. /cognite/neat/{core/_instances → _data_model/models}/__init__.py +0 -0
  283. /cognite/neat/{core/_instances/extractors/_classic_cdf → _data_model/models/conceptual}/__init__.py +0 -0
  284. /cognite/neat/{core/_utils → _data_model/validation}/__init__.py +0 -0
  285. /cognite/neat/{plugins/data_model → _session/_html}/__init__.py +0 -0
  286. /cognite/neat/{core → v0/core}/_client/__init__.py +0 -0
  287. /cognite/neat/{core → v0/core}/_client/data_classes/data_modeling.py +0 -0
  288. /cognite/neat/{core → v0/core}/_client/data_classes/neat_sequence.py +0 -0
  289. /cognite/neat/{core → v0/core}/_client/data_classes/statistics.py +0 -0
  290. /cognite/neat/{core → v0/core}/_config.py +0 -0
  291. /cognite/neat/{core → v0/core}/_data_model/analysis/__init__.py +0 -0
  292. /cognite/neat/{core → v0/core}/_data_model/catalog/__init__.py +0 -0
  293. /cognite/neat/{core → v0/core}/_data_model/catalog/classic_model.xlsx +0 -0
  294. /cognite/neat/{core → v0/core}/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  295. /cognite/neat/{core → v0/core}/_data_model/catalog/hello_world_pump.xlsx +0 -0
  296. /cognite/neat/{core → v0/core}/_data_model/models/_base_unverified.py +0 -0
  297. /cognite/neat/{core → v0/core}/_data_model/models/conceptual/__init__.py +0 -0
  298. /cognite/neat/{core → v0/core}/_data_model/models/entities/_constants.py +0 -0
  299. /cognite/neat/{core → v0/core}/_data_model/models/entities/_wrapped.py +0 -0
  300. /cognite/neat/{core → v0/core}/_data_model/models/mapping/__init__.py +0 -0
  301. /cognite/neat/{core → v0/core}/_data_model/models/mapping/_classic2core.yaml +0 -0
  302. /cognite/neat/{core → v0/core}/_instances/_shared.py +0 -0
  303. /cognite/neat/{core → v0/core}/_instances/_tracking/__init__.py +0 -0
  304. /cognite/neat/{core → v0/core}/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  305. /cognite/neat/{core → v0/core}/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
  306. /cognite/neat/{core → v0/core}/_instances/examples/__init__.py +0 -0
  307. /cognite/neat/{core → v0/core}/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  308. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_assets.py +0 -0
  309. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
  310. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_events.py +0 -0
  311. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_files.py +0 -0
  312. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_labels.py +0 -0
  313. /cognite/neat/{core → v0/core}/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
  314. /cognite/neat/{core → v0/core}/_instances/loaders/__init__.py +0 -0
  315. /cognite/neat/{core → v0/core}/_instances/queries/__init__.py +0 -0
  316. /cognite/neat/{core → v0/core}/_instances/queries/_base.py +0 -0
  317. /cognite/neat/{core → v0/core}/_instances/queries/_queries.py +0 -0
  318. /cognite/neat/{core → v0/core}/_instances/transformers/__init__.py +0 -0
  319. /cognite/neat/{core → v0/core}/_issues/__init__.py +0 -0
  320. /cognite/neat/{core → v0/core}/_issues/formatters.py +0 -0
  321. /cognite/neat/{core → v0/core}/_shared.py +0 -0
  322. /cognite/neat/{core → v0/core}/_store/__init__.py +0 -0
  323. /cognite/neat/{core → v0/core}/_utils/io_.py +0 -0
  324. /cognite/neat/{core → v0/core}/_utils/reader/__init__.py +0 -0
  325. /cognite/neat/{core → v0/core}/_utils/time_.py +0 -0
  326. /cognite/neat/{core → v0/core}/_utils/xml_.py +0 -0
  327. /cognite/neat/{session → v0/session}/__init__.py +0 -0
  328. /cognite/neat/{session → v0/session}/_experimental.py +0 -0
  329. /cognite/neat/{session → v0/session}/_state/README.md +0 -0
  330. /cognite/neat/{session → v0/session}/engine/__init__.py +0 -0
  331. /cognite/neat/{session → v0/session}/engine/_import.py +0 -0
  332. /cognite/neat/{session → v0/session}/engine/_interface.py +0 -0
  333. {cognite_neat-0.123.2.dist-info → cognite_neat-0.127.30.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,168 @@
1
+ let currentFilter = 'all';
2
+ let currentSearch = '';
3
+ const storageKey = 'neat-issues-theme-' + uniqueId;
4
+ let isDarkMode = localStorage.getItem(storageKey) === 'dark';
5
+ let expandedGroups = new Set();
6
+
7
+ const container = document.getElementById('issuesContainer-' + uniqueId);
8
+ const themeToggle = document.getElementById('themeToggle-' + uniqueId);
9
+ const themeIcon = document.getElementById('themeIcon-' + uniqueId);
10
+ const themeText = document.getElementById('themeText-' + uniqueId);
11
+
12
+ // Initialize theme
13
+ function updateTheme() {
14
+ if (isDarkMode) {
15
+ container.classList.add('dark-mode');
16
+ themeIcon.textContent = '☀️';
17
+ themeText.textContent = 'Light';
18
+ } else {
19
+ container.classList.remove('dark-mode');
20
+ themeIcon.textContent = '🌙';
21
+ themeText.textContent = 'Dark';
22
+ }
23
+ }
24
+
25
+ updateTheme();
26
+
27
+ // Theme toggle
28
+ themeToggle.addEventListener('click', function() {
29
+ isDarkMode = !isDarkMode;
30
+ localStorage.setItem(storageKey, isDarkMode ? 'dark' : 'light');
31
+ updateTheme();
32
+ });
33
+
34
+ function groupIssues(issuesList) {
35
+ const grouped = new Map();
36
+
37
+ issuesList.forEach(issue => {
38
+ const key = issue.code ? `${issue.type}:${issue.code}` : `${issue.type}:${issue.id}`;
39
+
40
+ if (!grouped.has(key)) {
41
+ grouped.set(key, []);
42
+ }
43
+ grouped.get(key).push(issue);
44
+ });
45
+
46
+ return grouped;
47
+ }
48
+
49
+ function renderIssues() {
50
+ const listContainer = document.getElementById('issuesList-' + uniqueId);
51
+ const filtered = issues.filter(issue => {
52
+ const matchesFilter = currentFilter === 'all' || issue.type === currentFilter;
53
+ const matchesSearch = !currentSearch ||
54
+ issue.message.toLowerCase().includes(currentSearch.toLowerCase()) ||
55
+ (issue.code && issue.code.toLowerCase().includes(currentSearch.toLowerCase())) ||
56
+ (issue.fix && issue.fix.toLowerCase().includes(currentSearch.toLowerCase()));
57
+ return matchesFilter && matchesSearch;
58
+ });
59
+
60
+ if (filtered.length === 0) {
61
+ listContainer.innerHTML = '<div class="no-issues">No issues match your filters</div>';
62
+ return;
63
+ }
64
+
65
+ const grouped = groupIssues(filtered);
66
+ const html = [];
67
+
68
+ grouped.forEach((groupIssues, key) => {
69
+ const firstIssue = groupIssues[0];
70
+ const count = groupIssues.length;
71
+ const isExpanded = expandedGroups.has(key);
72
+ const codeLink = firstIssue.code
73
+ ? `<span class="issue-code-link" onclick="event.stopPropagation(); window.open('https://cognite-neat.readthedocs-hosted.com/en/latest/validation/${firstIssue.code.toLowerCase()}.html', '_blank')">${firstIssue.code}</span>`
74
+ : '';
75
+
76
+ if (count === 1) {
77
+ // Single issue - render normally
78
+ html.push(`
79
+ <div class="issue-item">
80
+ <div class="issue-header">
81
+ <span class="issue-badge badge-${firstIssue.type}">${firstIssue.type}</span>
82
+ ${codeLink}
83
+ </div>
84
+ <div class="issue-message">${firstIssue.message}</div>
85
+ ${firstIssue.fix ? `
86
+ <div class="issue-fix">
87
+ <div class="issue-fix-label">💡 Suggested Fix</div>
88
+ <div class="issue-fix-content">${firstIssue.fix}</div>
89
+ </div>
90
+ ` : ''}
91
+ </div>
92
+ `);
93
+ } else {
94
+ // Grouped issues
95
+ html.push(`
96
+ <div class="issue-group ${isExpanded ? 'expanded' : ''}">
97
+ <div class="issue-group-header" onclick="toggleGroup_${uniqueId}('${key}')">
98
+ <div class="issue-group-info">
99
+ <span class="expand-icon">${isExpanded ? '▼' : '▶'}</span>
100
+ <span class="issue-badge badge-${firstIssue.type}">${firstIssue.type}</span>
101
+ ${codeLink}
102
+ <span class="issue-count">${count} issues</span>
103
+ </div>
104
+ </div>
105
+ <div class="issue-group-items">
106
+ ${groupIssues.map((issue, idx) => `
107
+ <div class="issue-item grouped">
108
+ <div class="issue-number">#${idx + 1}</div>
109
+ <div class="issue-message">${issue.message}</div>
110
+ </div>
111
+ `).join('')}
112
+ ${firstIssue.fix ? `
113
+ <div class="issue-fix grouped">
114
+ <div class="issue-fix-label">💡 Suggested Fix</div>
115
+ <div class="issue-fix-content">${firstIssue.fix}</div>
116
+ </div>
117
+ ` : ''}
118
+ </div>
119
+ </div>
120
+ `);
121
+ }
122
+ });
123
+
124
+ listContainer.innerHTML = html.join('');
125
+ }
126
+
127
+ window['toggleGroup_' + uniqueId] = function(key) {
128
+ if (expandedGroups.has(key)) {
129
+ expandedGroups.delete(key);
130
+ } else {
131
+ expandedGroups.add(key);
132
+ }
133
+ renderIssues();
134
+ };
135
+
136
+ // Stat item filters
137
+ document.querySelectorAll('#issuesContainer-' + uniqueId + ' .stat-item').forEach(item => {
138
+ item.addEventListener('click', function() {
139
+ document.querySelectorAll('#issuesContainer-' + uniqueId + ' .stat-item').forEach(i => i.classList.remove('active'));
140
+ this.classList.add('active');
141
+ currentFilter = this.dataset.filter;
142
+ renderIssues();
143
+ });
144
+ });
145
+
146
+ // Search
147
+ document.getElementById('searchInput-' + uniqueId).addEventListener('input', function(e) {
148
+ currentSearch = e.target.value;
149
+ renderIssues();
150
+ });
151
+
152
+ // Export function
153
+ window['exportIssues_' + uniqueId] = function() {
154
+ const csv = [
155
+ ['Type', 'Code', 'Message', 'Fix'],
156
+ ...issues.map(i => [i.type, i.code || '', i.message, i.fix || ''])
157
+ ].map(row => row.map(cell => `"${String(cell).replace(/"/g, '""')}"`).join(',')).join('\n');
158
+
159
+ const blob = new Blob([csv], { type: 'text/csv' });
160
+ const url = window.URL.createObjectURL(blob);
161
+ const a = document.createElement('a');
162
+ a.href = url;
163
+ a.download = 'session_issues.csv';
164
+ a.click();
165
+ window.URL.revokeObjectURL(url);
166
+ };
167
+
168
+ renderIssues();
@@ -0,0 +1,186 @@
1
+ :root {
2
+ --bg-primary: white;
3
+ --bg-secondary: #f8f9fa;
4
+ --bg-header: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
5
+ --text-primary: #212529;
6
+ --text-secondary: #495057;
7
+ --text-muted: #6c757d;
8
+ --border-color: #dee2e6;
9
+ --border-light: #e9ecef;
10
+ --hover-bg: #f8f9fa;
11
+ --stat-bg: rgba(255, 255, 255, 0.2);
12
+ --stat-hover-bg: rgba(255, 255, 255, 0.3);
13
+ --stat-active-bg: rgba(255, 255, 255, 0.4);
14
+ --code-bg: #e9ecef;
15
+ --fix-bg: #e7f5ff;
16
+ --fix-border: #1971c2;
17
+ --fix-text: #1864ab;
18
+ --export-btn-bg: rgba(255, 255, 255, 0.2);
19
+ --export-btn-hover-bg: rgba(255, 255, 255, 0.3);
20
+ --export-btn-border: rgba(255, 255, 255, 0.5);
21
+ }
22
+
23
+ .dark-mode {
24
+ --bg-primary: #1e1e1e;
25
+ --bg-secondary: #2d2d30;
26
+ --bg-header: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
27
+ --text-primary: #e4e4e7;
28
+ --text-secondary: #a1a1aa;
29
+ --text-muted: #71717a;
30
+ --border-color: #3f3f46;
31
+ --border-light: #27272a;
32
+ --hover-bg: #27272a;
33
+ --stat-bg: rgba(255, 255, 255, 0.1);
34
+ --stat-hover-bg: rgba(255, 255, 255, 0.15);
35
+ --stat-active-bg: rgba(255, 255, 255, 0.2);
36
+ --code-bg: #27272a;
37
+ --fix-bg: #1e293b;
38
+ --fix-border: #3b82f6;
39
+ --fix-text: #60a5fa;
40
+ --export-btn-bg: rgba(255, 255, 255, 0.1);
41
+ --export-btn-hover-bg: rgba(255, 255, 255, 0.2);
42
+ --export-btn-border: rgba(255, 255, 255, 0.3);
43
+ }
44
+
45
+
46
+ .issues-container,
47
+ .deployment-container {
48
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Arial, sans-serif;
49
+ max-width: 100%;
50
+ margin: 10px 0;
51
+ background: var(--bg-primary);
52
+ color: var(--text-primary);
53
+ transition: all 0.3s ease;
54
+ }
55
+
56
+ .issues-header,
57
+ .deployment-header {
58
+ background: var(--bg-header);
59
+ color: white;
60
+ padding: 20px;
61
+ border-radius: 8px 8px 0 0;
62
+ margin-bottom: 0;
63
+ position: relative;
64
+ }
65
+
66
+ .theme-toggle {
67
+ position: absolute;
68
+ top: 15px;
69
+ right: 15px;
70
+ padding: 8px 12px;
71
+ background: rgba(255, 255, 255, 0.1);
72
+ border: 1px solid rgba(255, 255, 255, 0.2);
73
+ border-radius: 6px;
74
+ color: white;
75
+ cursor: pointer;
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 6px;
79
+ font-size: 13px;
80
+ transition: all 0.2s;
81
+ }
82
+
83
+ .theme-toggle:hover {
84
+ background: rgba(255, 255, 255, 0.2);
85
+ }
86
+
87
+ .issues-title,
88
+ .deployment-title {
89
+ margin: 0 0 15px 0;
90
+ font-size: 24px;
91
+ font-weight: 600;
92
+ }
93
+
94
+ .issues-stats,
95
+ .deployment-stats {
96
+ display: flex;
97
+ gap: 15px;
98
+ flex-wrap: wrap;
99
+ padding-right: 100px;
100
+ }
101
+
102
+ .stat-item {
103
+ padding: 8px 16px;
104
+ background: rgba(255, 255, 255, 0.1);
105
+ border-radius: 6px;
106
+ cursor: pointer;
107
+ transition: all 0.2s;
108
+ border: 2px solid transparent;
109
+ }
110
+
111
+ .stat-item:hover {
112
+ background: rgba(255, 255, 255, 0.15);
113
+ }
114
+
115
+ .stat-item.active {
116
+ background: rgba(255, 255, 255, 0.2);
117
+ border-color: rgba(255, 255, 255, 0.3);
118
+ }
119
+
120
+ .stat-number {
121
+ font-weight: 700;
122
+ font-size: 18px;
123
+ margin-right: 4px;
124
+ }
125
+
126
+ .export-btn {
127
+ margin-left: auto;
128
+ padding: 6px 14px;
129
+ border: 1px solid var(--export-btn-border);
130
+ background: var(--export-btn-bg);
131
+ color: white;
132
+ border-radius: 6px;
133
+ cursor: pointer;
134
+ font-size: 13px;
135
+ font-weight: 600;
136
+ transition: all 0.2s;
137
+ }
138
+ .export-btn:hover {
139
+ background: var(--export-btn-hover-bg);
140
+ border-color: white;
141
+ }
142
+
143
+ .issues-controls,
144
+ .deployment-controls {
145
+ background: var(--bg-secondary);
146
+ padding: 15px 20px;
147
+ border-left: 1px solid var(--border-color);
148
+ border-right: 1px solid var(--border-color);
149
+ }
150
+
151
+ .control-group {
152
+ display: flex;
153
+ gap: 10px;
154
+ align-items: center;
155
+ }
156
+
157
+ .search-input {
158
+ flex: 1;
159
+ padding: 10px 14px;
160
+ border: 1px solid var(--border-color);
161
+ border-radius: 6px;
162
+ font-size: 14px;
163
+ background: var(--bg-primary);
164
+ color: var(--text-primary);
165
+ transition: all 0.2s;
166
+ }
167
+
168
+ .search-input:focus {
169
+ outline: none;
170
+ border-color: var(--fix-border);
171
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
172
+ }
173
+
174
+ .search-input::placeholder {
175
+ color: var(--text-primary);
176
+ opacity: 0.7;
177
+ font-style: italic;
178
+ }
179
+
180
+ .no-issues,
181
+ .no-changes {
182
+ padding: 40px 20px;
183
+ text-align: center;
184
+ color: var(--text-muted);
185
+ font-size: 14px;
186
+ }
@@ -0,0 +1,4 @@
1
+ from pathlib import Path
2
+
3
+ issues = Path(__file__).parent / "issues.html"
4
+ deployment = Path(__file__).parent / "deployment.html"
@@ -0,0 +1,75 @@
1
+ <style>
2
+ {{SHARED_CSS}}
3
+ {{SPECIFIC_CSS}}
4
+ </style>
5
+
6
+ <div class="issues-container deployment-container" id="deploymentContainer-{{unique_id}}">
7
+ <div class="issues-header deployment-header">
8
+ <button class="theme-toggle" id="themeToggle-{{unique_id}}">
9
+ <span id="themeIcon-{{unique_id}}">🌙</span>
10
+ <span id="themeText-{{unique_id}}">Dark</span>
11
+ </button>
12
+ <h2 class="deployment-title issues-title">
13
+ <span>Deployment Result</span>
14
+ <span class="status-badge status-{{status}}" id="statusBadge-{{unique_id}}">
15
+ <span id="statusIcon-{{unique_id}}"></span>
16
+ <span id="statusText-{{unique_id}}"></span>
17
+ </span>
18
+ </h2>
19
+ <div class="deployment-stats issues-stats">
20
+ <div class="stat-item active" data-filter="all">
21
+ <span class="stat-number">{{total_changes}}</span> Total Changes
22
+ </div>
23
+ <div class="stat-item" data-filter="create">
24
+ <span class="stat-number">{{created}}</span> Created
25
+ </div>
26
+ <div class="stat-item" data-filter="update">
27
+ <span class="stat-number">{{updated}}</span> Updated
28
+ </div>
29
+ <div class="stat-item" data-filter="delete">
30
+ <span class="stat-number">{{deleted}}</span> Deleted
31
+ </div>
32
+ <div class="stat-item" data-filter="skip">
33
+ <span class="stat-number">{{skipped}}</span> Skipped
34
+ </div>
35
+ <div class="stat-item" data-filter="unchanged">
36
+ <span class="stat-number">{{unchanged}}</span> Unchanged
37
+ </div>
38
+ <button class="export-btn" onclick="exportDeployment_{{unique_id}}()">Export Report</button>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="deployment-controls issues-controls">
43
+ <div class="filter-group">
44
+ <span class="filter-label">Endpoint:</span>
45
+ <button class="filter-btn active" data-filter-type="endpoint" data-filter="all">All</button>
46
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="spaces">Spaces</button>
47
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="datamodels">Data Models</button>
48
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="views">Views</button>
49
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="containers">Containers</button>
50
+ </div>
51
+
52
+ <div class="filter-group">
53
+ <span class="filter-label">Severity:</span>
54
+ <button class="filter-btn active" data-filter-type="severity" data-filter="all">All</button>
55
+ <button class="filter-btn" data-filter-type="severity" data-filter="SAFE">Safe</button>
56
+ <button class="filter-btn" data-filter-type="severity" data-filter="WARNING">Warning</button>
57
+ <button class="filter-btn" data-filter-type="severity" data-filter="BREAKING">Breaking</button>
58
+ </div>
59
+
60
+ <div class="control-group">
61
+ <input type="text" class="search-input" placeholder="🔍 Search resource IDs, changes..." id="searchInput-{{unique_id}}">
62
+ </div>
63
+ </div>
64
+
65
+ <div class="deployment-list issues-list" id="deploymentList-{{unique_id}}"></div>
66
+ </div>
67
+
68
+ <script>
69
+ (function() {
70
+ const changes = {{CHANGES_JSON}};
71
+ const stats = {{STATS_JSON}};
72
+ const uniqueId = '{{unique_id}}';
73
+ {{SCRIPTS}}
74
+ })();
75
+ </script>
@@ -0,0 +1,45 @@
1
+ <style>
2
+ {{SHARED_CSS}}
3
+ {{SPECIFIC_CSS}}
4
+ </style>
5
+
6
+ <div class="issues-container" id="issuesContainer-{{unique_id}}">
7
+ <div class="issues-header">
8
+ <button class="theme-toggle" id="themeToggle-{{unique_id}}">
9
+ <span id="themeIcon-{{unique_id}}">🌙</span>
10
+ <span id="themeText-{{unique_id}}">Dark</span>
11
+ </button>
12
+ <h2 class="issues-title">Session Issues</h2>
13
+ <div class="issues-stats">
14
+ <div class="stat-item active" data-filter="all">
15
+ <span class="stat-number">{{total}}</span> Total Issues
16
+ </div>
17
+ <div class="stat-item" data-filter="ModelSyntaxError">
18
+ <span class="stat-number">{{syntax_errors}}</span> Syntax Errors
19
+ </div>
20
+ <div class="stat-item" data-filter="ConsistencyError">
21
+ <span class="stat-number">{{consistency_errors}}</span> Consistency Errors
22
+ </div>
23
+ <div class="stat-item" data-filter="Recommendation">
24
+ <span class="stat-number">{{recommendations}}</span> Recommendations
25
+ </div>
26
+ <button class="export-btn" onclick="exportIssues_{{unique_id}}()">Export CSV</button>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="issues-controls">
31
+ <div class="control-group">
32
+ <input type="text" class="search-input" placeholder="🔍 Search messages, codes, fixes..." id="searchInput-{{unique_id}}">
33
+ </div>
34
+ </div>
35
+
36
+ <div class="issues-list" id="issuesList-{{unique_id}}"></div>
37
+ </div>
38
+
39
+ <script>
40
+ (function() {
41
+ const issues = {{JSON}};
42
+ const uniqueId = '{{unique_id}}';
43
+ {{SCRIPTS}}
44
+ })();
45
+ </script>
@@ -0,0 +1,81 @@
1
+ import json
2
+ import uuid
3
+ from collections import defaultdict
4
+ from typing import Any
5
+
6
+ from cognite.neat._issues import ConsistencyError, IssueList, ModelSyntaxError, Recommendation
7
+ from cognite.neat._session._html._render import render
8
+ from cognite.neat._store import NeatStore
9
+
10
+
11
+ class Issues:
12
+ """Class to handle issues in the NeatSession."""
13
+
14
+ def __init__(self, store: NeatStore) -> None:
15
+ self._store = store
16
+
17
+ @property
18
+ def _issues(self) -> IssueList:
19
+ """Get all issues from the last change in the store."""
20
+ issues = IssueList()
21
+ if change := self._store.provenance.last_change:
22
+ issues += change.errors or IssueList()
23
+ issues += change.issues or IssueList()
24
+ return issues
25
+
26
+ @property
27
+ def _stats(self) -> dict[str, Any]:
28
+ """Compute statistics about issues."""
29
+ by_type: defaultdict[str, int] = defaultdict(int)
30
+ by_code: defaultdict[str, int] = defaultdict(int)
31
+
32
+ stats: dict[str, Any] = {
33
+ "total": len(self._issues),
34
+ "by_type": by_type,
35
+ "by_code": by_code,
36
+ "severity_order": [ModelSyntaxError.__name__, ConsistencyError.__name__, Recommendation.__name__],
37
+ }
38
+
39
+ for issue in self._issues:
40
+ stats["by_type"][issue.issue_type()] += 1
41
+
42
+ if issue.code:
43
+ stats["by_code"][f"{issue.issue_type()}:{issue.code}"] += 1
44
+
45
+ return stats
46
+
47
+ @property
48
+ def _serialized_issues(self) -> list[dict[str, Any]]:
49
+ """Convert issues to JSON-serializable format."""
50
+ serialized = []
51
+ for idx, issue in enumerate(self._issues):
52
+ serialized.append(
53
+ {
54
+ "id": idx,
55
+ "type": issue.issue_type(),
56
+ "code": issue.code or "",
57
+ "message": issue.message,
58
+ "fix": issue.fix or "",
59
+ }
60
+ )
61
+ return serialized
62
+
63
+ def _repr_html_(self) -> str:
64
+ """Generate interactive HTML representation."""
65
+ if not self._issues:
66
+ return "<b>No issues found.</b>"
67
+ stats = self._stats
68
+
69
+ # Generate unique ID for this render to avoid conflicts in Jupyter
70
+ unique_id = uuid.uuid4().hex[:8]
71
+
72
+ template_vars = {
73
+ "JSON": json.dumps(self._serialized_issues),
74
+ "total": stats["total"],
75
+ "syntax_errors": stats["by_type"].get("ModelSyntaxError", 0),
76
+ "consistency_errors": stats["by_type"].get("ConsistencyError", 0),
77
+ "recommendations": stats["by_type"].get("Recommendation", 0),
78
+ "unique_id": unique_id,
79
+ }
80
+
81
+ return render("issues", template_vars)
@@ -0,0 +1,35 @@
1
+ from cognite.neat._session._usage_analytics._collector import Collector
2
+ from cognite.neat._session._wrappers import session_wrapper
3
+ from cognite.neat._store import NeatStore
4
+
5
+
6
+ @session_wrapper
7
+ class Opt:
8
+ """For the user to decide if they want their usage of neat to be collected or not. We do not collect personal
9
+ information like name etc. only usage.
10
+ """
11
+
12
+ def __init__(self, store: NeatStore) -> None:
13
+ self._collector = Collector()
14
+ self._display()
15
+ self._store = store
16
+
17
+ def _display(self) -> None:
18
+ if self._collector.is_opted_in or self._collector.is_opted_out:
19
+ return
20
+ print(
21
+ "For Neat to improve, we need to collect usage information. "
22
+ "You acknowledge and agree that neat may collect usage information."
23
+ "To remove this message run 'neat.opt.in_() "
24
+ "or to stop collecting usage information run 'neat.opt.out()'."
25
+ )
26
+
27
+ def in_(self) -> None:
28
+ """Consent to collection of neat user insights."""
29
+ self._collector.enable()
30
+ print("You have successfully opted in to data collection.")
31
+
32
+ def out(self) -> None:
33
+ """Opt out of allowing usage of neat to be collected from current user."""
34
+ self._collector.disable()
35
+ print("You have successfully opted out of data collection.")