cognite-neat 0.123.26__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 (341) 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/{core → _v0/core}/_data_model/importers/_rdf/_owl2data_model.py +41 -21
  156. cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/_shared.py +9 -9
  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/models/entities/_loaders.py +0 -75
  270. cognite/neat/plugins/__init__.py +0 -3
  271. cognite/neat/plugins/data_model/importers/__init__.py +0 -5
  272. cognite/neat/plugins/data_model/importers/_base.py +0 -28
  273. cognite/neat/session/_session/_data_model/__init__.py +0 -3
  274. cognite/neat/session/_session/_data_model/_read.py +0 -193
  275. cognite/neat/session/_session/_data_model/_routes.py +0 -45
  276. cognite/neat/session/_session/_data_model/_show.py +0 -147
  277. cognite/neat/session/_session/_data_model/_write.py +0 -335
  278. cognite_neat-0.123.26.dist-info/METADATA +0 -144
  279. cognite_neat-0.123.26.dist-info/RECORD +0 -201
  280. cognite_neat-0.123.26.dist-info/WHEEL +0 -4
  281. cognite_neat-0.123.26.dist-info/licenses/LICENSE +0 -201
  282. /cognite/neat/{core → _client/init}/__init__.py +0 -0
  283. /cognite/neat/{core/_client/_api → _data_model}/__init__.py +0 -0
  284. /cognite/neat/{core/_client/data_classes → _data_model/deployer}/__init__.py +0 -0
  285. /cognite/neat/{core/_data_model → _data_model/exporters/_table_exporter}/__init__.py +0 -0
  286. /cognite/neat/{core/_instances → _data_model/importers/_table_importer}/__init__.py +0 -0
  287. /cognite/neat/{core/_instances/extractors/_classic_cdf → _data_model/models}/__init__.py +0 -0
  288. /cognite/neat/{core/_utils → _data_model/models/conceptual}/__init__.py +0 -0
  289. /cognite/neat/{plugins/data_model → _data_model/validation}/__init__.py +0 -0
  290. /cognite/neat/{session/_session → _session/_html}/__init__.py +0 -0
  291. /cognite/neat/{core → _v0/core}/_client/__init__.py +0 -0
  292. /cognite/neat/{core → _v0/core}/_client/data_classes/data_modeling.py +0 -0
  293. /cognite/neat/{core → _v0/core}/_client/data_classes/neat_sequence.py +0 -0
  294. /cognite/neat/{core → _v0/core}/_client/data_classes/statistics.py +0 -0
  295. /cognite/neat/{core → _v0/core}/_config.py +0 -0
  296. /cognite/neat/{core → _v0/core}/_data_model/analysis/__init__.py +0 -0
  297. /cognite/neat/{core → _v0/core}/_data_model/catalog/__init__.py +0 -0
  298. /cognite/neat/{core → _v0/core}/_data_model/catalog/classic_model.xlsx +0 -0
  299. /cognite/neat/{core → _v0/core}/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  300. /cognite/neat/{core → _v0/core}/_data_model/catalog/hello_world_pump.xlsx +0 -0
  301. /cognite/neat/{core → _v0/core}/_data_model/importers/__init__.py +0 -0
  302. /cognite/neat/{core → _v0/core}/_data_model/importers/_rdf/__init__.py +0 -0
  303. /cognite/neat/{core → _v0/core}/_data_model/models/_base_unverified.py +0 -0
  304. /cognite/neat/{core → _v0/core}/_data_model/models/conceptual/__init__.py +0 -0
  305. /cognite/neat/{core → _v0/core}/_data_model/models/entities/_constants.py +0 -0
  306. /cognite/neat/{core → _v0/core}/_data_model/models/entities/_wrapped.py +0 -0
  307. /cognite/neat/{core → _v0/core}/_data_model/models/mapping/__init__.py +0 -0
  308. /cognite/neat/{core → _v0/core}/_data_model/models/mapping/_classic2core.yaml +0 -0
  309. /cognite/neat/{core → _v0/core}/_data_model/transformers/__init__.py +0 -0
  310. /cognite/neat/{core → _v0/core}/_instances/_shared.py +0 -0
  311. /cognite/neat/{core → _v0/core}/_instances/_tracking/__init__.py +0 -0
  312. /cognite/neat/{core → _v0/core}/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  313. /cognite/neat/{core → _v0/core}/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
  314. /cognite/neat/{core → _v0/core}/_instances/examples/__init__.py +0 -0
  315. /cognite/neat/{core → _v0/core}/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  316. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_assets.py +0 -0
  317. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
  318. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_events.py +0 -0
  319. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_files.py +0 -0
  320. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_labels.py +0 -0
  321. /cognite/neat/{core → _v0/core}/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
  322. /cognite/neat/{core → _v0/core}/_instances/loaders/__init__.py +0 -0
  323. /cognite/neat/{core → _v0/core}/_instances/queries/__init__.py +0 -0
  324. /cognite/neat/{core → _v0/core}/_instances/queries/_base.py +0 -0
  325. /cognite/neat/{core → _v0/core}/_instances/queries/_queries.py +0 -0
  326. /cognite/neat/{core → _v0/core}/_instances/transformers/__init__.py +0 -0
  327. /cognite/neat/{core → _v0/core}/_issues/__init__.py +0 -0
  328. /cognite/neat/{core → _v0/core}/_issues/formatters.py +0 -0
  329. /cognite/neat/{core → _v0/core}/_shared.py +0 -0
  330. /cognite/neat/{core → _v0/core}/_store/__init__.py +0 -0
  331. /cognite/neat/{core → _v0/core}/_utils/io_.py +0 -0
  332. /cognite/neat/{core → _v0/core}/_utils/reader/__init__.py +0 -0
  333. /cognite/neat/{core → _v0/core}/_utils/tarjan.py +0 -0
  334. /cognite/neat/{core → _v0/core}/_utils/time_.py +0 -0
  335. /cognite/neat/{core → _v0/core}/_utils/xml_.py +0 -0
  336. /cognite/neat/{session → _v0}/engine/__init__.py +0 -0
  337. /cognite/neat/{session → _v0}/engine/_import.py +0 -0
  338. /cognite/neat/{session → _v0}/engine/_interface.py +0 -0
  339. /cognite/neat/{session → _v0/session}/__init__.py +0 -0
  340. /cognite/neat/{session → _v0/session}/_experimental.py +0 -0
  341. /cognite/neat/{session → _v0/session}/_state/README.md +0 -0
@@ -0,0 +1,211 @@
1
+ .issues-list {
2
+ background: var(--bg-primary);
3
+ border: 1px solid var(--border-color);
4
+ border-top: none;
5
+ border-radius: 0 0 8px 8px;
6
+ max-height: 600px;
7
+ overflow-y: auto;
8
+ }
9
+
10
+ .issue-item {
11
+ padding: 16px 20px;
12
+ border-bottom: 1px solid var(--border-light);
13
+ transition: background 0.2s;
14
+ }
15
+
16
+ .issue-item:last-child {
17
+ border-bottom: none;
18
+ }
19
+
20
+ .issue-item:hover {
21
+ background: var(--hover-bg);
22
+ }
23
+
24
+ .issue-header {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 10px;
28
+ margin-bottom: 8px;
29
+ }
30
+
31
+ .issue-badge {
32
+ padding: 4px 10px;
33
+ border-radius: 4px;
34
+ font-size: 11px;
35
+ font-weight: 600;
36
+ text-transform: uppercase;
37
+ letter-spacing: 0.5px;
38
+ }
39
+
40
+ .badge-ModelSyntaxError {
41
+ background: #fee2e2;
42
+ color: #991b1b;
43
+ }
44
+
45
+ .badge-ConsistencyError {
46
+ background: #fef3c7;
47
+ color: #92400e;
48
+ }
49
+
50
+ .badge-Recommendation {
51
+ background: #dbeafe;
52
+ color: #1e40af;
53
+ }
54
+
55
+ .dark-mode .badge-ModelSyntaxError {
56
+ background: #7f1d1d;
57
+ color: #fca5a5;
58
+ }
59
+
60
+ .dark-mode .badge-ConsistencyError {
61
+ background: #78350f;
62
+ color: #fde68a;
63
+ }
64
+
65
+ .dark-mode .badge-Recommendation {
66
+ background: #1e3a8a;
67
+ color: #93c5fd;
68
+ }
69
+
70
+ .issue-code {
71
+ font-family: 'Monaco', 'Courier New', monospace;
72
+ font-size: 12px;
73
+ color: var(--text-secondary);
74
+ background: var(--bg-secondary);
75
+ padding: 3px 8px;
76
+ border-radius: 3px;
77
+ }
78
+
79
+ .issue-message {
80
+ color: var(--text-primary);
81
+ line-height: 1.6;
82
+ font-size: 14px;
83
+ }
84
+
85
+ .issue-fix {
86
+ margin-top: 12px;
87
+ padding: 12px;
88
+ background: var(--fix-bg);
89
+ border-left: 3px solid var(--fix-border);
90
+ border-radius: 4px;
91
+ }
92
+
93
+ .issue-fix-label {
94
+ font-weight: 600;
95
+ font-size: 12px;
96
+ color: var(--fix-text);
97
+ margin-bottom: 6px;
98
+ }
99
+
100
+ .issue-fix-content {
101
+ color: var(--fix-text);
102
+ font-size: 13px;
103
+ line-height: 1.5;
104
+ }
105
+
106
+ .issue-group {
107
+ background: var(--bg-secondary);
108
+ border: 1px solid var(--border-color);
109
+ border-radius: 8px;
110
+ margin-bottom: 12px;
111
+ overflow: hidden;
112
+ }
113
+
114
+ .issue-group-header {
115
+ display: flex;
116
+ align-items: center;
117
+ padding: 12px 16px;
118
+ cursor: pointer;
119
+ background: var(--bg-primary);
120
+ border-bottom: 1px solid var(--border-color);
121
+ transition: background-color 0.2s;
122
+ }
123
+
124
+ .issue-group-header:hover {
125
+ background: var(--bg-secondary);
126
+ }
127
+
128
+ .issue-group-info {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 10px;
132
+ flex: 1;
133
+ }
134
+
135
+ .expand-icon {
136
+ font-size: 12px;
137
+ transition: transform 0.2s;
138
+ width: 16px;
139
+ }
140
+
141
+ .issue-count {
142
+ color: var(--text-secondary);
143
+ font-size: 13px;
144
+ font-weight: 500;
145
+ }
146
+
147
+ .issue-group-preview {
148
+ padding: 8px 16px 8px 48px;
149
+ color: var(--text-secondary);
150
+ font-size: 13px;
151
+ border-bottom: 1px solid var(--border-color);
152
+ }
153
+
154
+ .issue-group-items {
155
+ display: none;
156
+ padding: 8px 0;
157
+ }
158
+
159
+ .issue-group.expanded .issue-group-items {
160
+ display: block;
161
+ }
162
+
163
+ .issue-group.expanded .expand-icon {
164
+ transform: rotate(0deg);
165
+ }
166
+
167
+ .issue-item.grouped {
168
+ margin: 4px 16px 4px 48px;
169
+ padding: 12px;
170
+ border-left: 3px solid var(--border-color);
171
+ }
172
+
173
+ .issue-number {
174
+ display: inline-block;
175
+ background: var(--bg-tertiary);
176
+ color: var(--text-secondary);
177
+ font-size: 11px;
178
+ font-weight: 600;
179
+ padding: 2px 8px;
180
+ border-radius: 4px;
181
+ margin-bottom: 6px;
182
+ }
183
+
184
+ .issue-fix.grouped {
185
+ margin: 12px 16px 8px 48px;
186
+ }
187
+
188
+ .issue-code-link {
189
+ font-family: 'Monaco', 'Courier New', monospace;
190
+ font-size: 12px;
191
+ color: #2563eb;
192
+ background: var(--bg-secondary);
193
+ padding: 3px 8px;
194
+ border-radius: 3px;
195
+ text-decoration: none;
196
+ transition: all 0.2s;
197
+ }
198
+
199
+ .issue-code-link:hover {
200
+ background: #dbeafe;
201
+ color: #1e40af;
202
+ }
203
+
204
+ .dark-mode .issue-code-link {
205
+ color: #60a5fa;
206
+ }
207
+
208
+ .dark-mode .issue-code-link:hover {
209
+ background: #1e3a8a;
210
+ color: #93c5fd;
211
+ }
@@ -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,80 @@
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 Insights
22
+ </div>
23
+ <div class="stat-item" data-filter="failed">
24
+ <span class="stat-number">{{failed}}</span> Failed
25
+ </div>
26
+ <div class="stat-item" data-filter="create">
27
+ <span class="stat-number">{{created}}</span> Created
28
+ </div>
29
+ <div class="stat-item" data-filter="update">
30
+ <span class="stat-number">{{updated}}</span> Updated
31
+ </div>
32
+ <div class="stat-item" data-filter="delete">
33
+ <span class="stat-number">{{deleted}}</span> Deleted
34
+ </div>
35
+ <div class="stat-item" data-filter="unchanged">
36
+ <span class="stat-number">{{unchanged}}</span> Unchanged
37
+ </div>
38
+ <div class="stat-item" data-filter="skip">
39
+ <span class="stat-number">{{skipped}}</span> Skipped
40
+ </div>
41
+ <button class="export-btn" onclick="exportDeployment_{{unique_id}}()">Export Report</button>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="deployment-controls issues-controls">
46
+ <div class="filter-group">
47
+ <span class="filter-label">Endpoint:</span>
48
+ <button class="filter-btn active" data-filter-type="endpoint" data-filter="all">All</button>
49
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="spaces">Spaces</button>
50
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="datamodels">Data Models</button>
51
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="views">Views</button>
52
+ <button class="filter-btn" data-filter-type="endpoint" data-filter="containers">Containers</button>
53
+ </div>
54
+
55
+ <div class="filter-group">
56
+ <span class="filter-label">Severity:</span>
57
+ <button class="filter-btn active" data-filter-type="severity" data-filter="all">All</button>
58
+ <button class="filter-btn" data-filter-type="severity" data-filter="SAFE">Safe</button>
59
+ <button class="filter-btn" data-filter-type="severity" data-filter="WARNING">Warning</button>
60
+ <button class="filter-btn" data-filter-type="severity" data-filter="BREAKING">Breaking</button>
61
+ </div>
62
+
63
+ <div class="control-group">
64
+ <input type="text" class="search-input" placeholder="🔍 Search resource IDs, changes..." id="searchInput-{{unique_id}}">
65
+ </div>
66
+ </div>
67
+
68
+ <div class="deployment-list issues-list" id="deploymentList-{{unique_id}}"></div>
69
+ </div>
70
+
71
+ <script>
72
+ (function() {
73
+ const changes = {{CHANGES_JSON}};
74
+ const stats = {{STATS_JSON}};
75
+ const uniqueId = '{{unique_id}}';
76
+ const is_dry_run = '{{is_dry_run}}';
77
+ const deploymentStatus = '{{status}}';
78
+ {{SCRIPTS}}
79
+ })();
80
+ </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 Insights
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>