cognite-neat 1.0.9__tar.gz → 1.0.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/PKG-INFO +24 -11
  2. cognite_neat-1.0.28/cognite/neat/__init__.py +7 -0
  3. cognite_neat-1.0.28/cognite/neat/_client/__init__.py +5 -0
  4. cognite_neat-1.0.28/cognite/neat/_client/api.py +178 -0
  5. cognite_neat-1.0.28/cognite/neat/_client/containers_api.py +77 -0
  6. cognite_neat-1.0.28/cognite/neat/_client/data_model_api.py +87 -0
  7. cognite_neat-1.0.28/cognite/neat/_client/filters.py +40 -0
  8. cognite_neat-1.0.28/cognite/neat/_client/init/credentials.py +60 -0
  9. cognite_neat-1.0.28/cognite/neat/_client/init/env_vars.py +143 -0
  10. cognite_neat-1.0.28/cognite/neat/_client/init/interactive.py +133 -0
  11. cognite_neat-1.0.28/cognite/neat/_client/init/main.py +61 -0
  12. cognite_neat-1.0.28/cognite/neat/_client/spaces_api.py +80 -0
  13. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_client/statistics_api.py +9 -4
  14. cognite_neat-1.0.28/cognite/neat/_client/views_api.py +94 -0
  15. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_config.py +19 -2
  16. cognite_neat-1.0.28/cognite/neat/_data_model/_analysis.py +571 -0
  17. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/_constants.py +8 -1
  18. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/_identifiers.py +1 -1
  19. cognite_neat-1.0.28/cognite/neat/_data_model/_snapshot.py +134 -0
  20. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/data_classes.py +21 -15
  21. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/deployer.py +23 -34
  22. cognite_neat-1.0.28/cognite/neat/_data_model/exporters/_api_exporter.py +122 -0
  23. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/exporters/_table_exporter/writer.py +59 -3
  24. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_table_importer/data_classes.py +73 -25
  25. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_table_importer/reader.py +54 -15
  26. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/conceptual/_data_model.py +1 -1
  27. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_base.py +3 -0
  28. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_limits.py +4 -0
  29. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_references.py +6 -0
  30. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_space.py +1 -1
  31. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_view_filter.py +27 -2
  32. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_views.py +6 -0
  33. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/_identifiers.py +1 -1
  34. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/__init__.py +2 -0
  35. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_ai_readiness.py +51 -34
  36. cognite_neat-1.0.28/cognite/neat/_data_model/validation/dms/_base.py +25 -0
  37. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_connections.py +140 -97
  38. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_consistency.py +12 -11
  39. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_containers.py +101 -38
  40. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_limits.py +68 -120
  41. cognite_neat-1.0.28/cognite/neat/_data_model/validation/dms/_orchestrator.py +70 -0
  42. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/validation/dms/_views.py +65 -4
  43. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_exceptions.py +12 -0
  44. cognite_neat-1.0.28/cognite/neat/_session/_cdf.py +36 -0
  45. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/_render.py +8 -3
  46. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/__init__.py +3 -0
  47. cognite_neat-1.0.28/cognite/neat/_session/_html/static/statistics.css +163 -0
  48. cognite_neat-1.0.28/cognite/neat/_session/_html/static/statistics.js +108 -0
  49. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/templates/__init__.py +1 -0
  50. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/templates/deployment.html +1 -1
  51. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/templates/issues.html +1 -1
  52. cognite_neat-1.0.28/cognite/neat/_session/_html/templates/statistics.html +26 -0
  53. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_physical.py +46 -18
  54. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_result/_deployment/_physical/_changes.py +1 -0
  55. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_session.py +18 -2
  56. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_wrappers.py +26 -7
  57. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_store/_provenance.py +7 -0
  58. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_store/_store.py +66 -2
  59. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/_reader.py +7 -7
  60. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/auxiliary.py +10 -0
  61. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/http_client/_client.py +3 -1
  62. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/http_client/_data_classes.py +3 -3
  63. cognite_neat-1.0.28/cognite/neat/_utils/repo.py +21 -0
  64. cognite_neat-1.0.28/cognite/neat/_version.py +2 -0
  65. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/legacy.py +10 -0
  66. cognite_neat-1.0.28/cognite/neat/py.typed +0 -0
  67. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/pyproject.toml +48 -14
  68. cognite_neat-1.0.9/cognite/neat/__init__.py +0 -7
  69. cognite_neat-1.0.9/cognite/neat/_client/__init__.py +0 -4
  70. cognite_neat-1.0.9/cognite/neat/_client/api.py +0 -8
  71. cognite_neat-1.0.9/cognite/neat/_client/containers_api.py +0 -138
  72. cognite_neat-1.0.9/cognite/neat/_client/data_model_api.py +0 -115
  73. cognite_neat-1.0.9/cognite/neat/_client/spaces_api.py +0 -115
  74. cognite_neat-1.0.9/cognite/neat/_client/views_api.py +0 -144
  75. cognite_neat-1.0.9/cognite/neat/_data_model/_analysis.py +0 -196
  76. cognite_neat-1.0.9/cognite/neat/_data_model/exporters/_api_exporter.py +0 -37
  77. cognite_neat-1.0.9/cognite/neat/_data_model/validation/dms/_base.py +0 -349
  78. cognite_neat-1.0.9/cognite/neat/_data_model/validation/dms/_orchestrator.py +0 -222
  79. cognite_neat-1.0.9/cognite/neat/_version.py +0 -2
  80. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/README.md +0 -0
  81. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_client/client.py +0 -0
  82. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_client/config.py +0 -0
  83. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_client/data_classes.py +0 -0
  84. {cognite_neat-1.0.9/cognite/neat/_data_model → cognite_neat-1.0.28/cognite/neat/_client/init}/__init__.py +0 -0
  85. {cognite_neat-1.0.9/cognite/neat/_data_model/deployer → cognite_neat-1.0.28/cognite/neat/_data_model}/__init__.py +0 -0
  86. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/_shared.py +0 -0
  87. {cognite_neat-1.0.9/cognite/neat/_data_model/exporters/_table_exporter → cognite_neat-1.0.28/cognite/neat/_data_model/deployer}/__init__.py +0 -0
  88. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/_differ.py +0 -0
  89. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/_differ_container.py +0 -0
  90. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/_differ_data_model.py +0 -0
  91. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/_differ_space.py +0 -0
  92. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/deployer/_differ_view.py +0 -0
  93. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/exporters/__init__.py +0 -0
  94. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/exporters/_base.py +0 -0
  95. {cognite_neat-1.0.9/cognite/neat/_data_model/importers/_table_importer → cognite_neat-1.0.28/cognite/neat/_data_model/exporters/_table_exporter}/__init__.py +0 -0
  96. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/exporters/_table_exporter/exporter.py +0 -0
  97. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/exporters/_table_exporter/workbook.py +0 -0
  98. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/__init__.py +0 -0
  99. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_api_importer.py +0 -0
  100. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_base.py +0 -0
  101. {cognite_neat-1.0.9/cognite/neat/_data_model/models → cognite_neat-1.0.28/cognite/neat/_data_model/importers/_table_importer}/__init__.py +0 -0
  102. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_table_importer/importer.py +0 -0
  103. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/importers/_table_importer/source.py +0 -0
  104. {cognite_neat-1.0.9/cognite/neat/_data_model/models/conceptual → cognite_neat-1.0.28/cognite/neat/_data_model/models}/__init__.py +0 -0
  105. {cognite_neat-1.0.9/cognite/neat/_data_model/validation → cognite_neat-1.0.28/cognite/neat/_data_model/models/conceptual}/__init__.py +0 -0
  106. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/conceptual/_base.py +0 -0
  107. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/conceptual/_concept.py +0 -0
  108. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/conceptual/_properties.py +0 -0
  109. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/conceptual/_property.py +0 -0
  110. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/__init__.py +0 -0
  111. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_constants.py +0 -0
  112. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_constraints.py +0 -0
  113. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_container.py +0 -0
  114. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_data_model.py +0 -0
  115. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_data_types.py +0 -0
  116. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_http.py +0 -0
  117. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_indexes.py +0 -0
  118. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_schema.py +0 -0
  119. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_types.py +0 -0
  120. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/dms/_view_property.py +0 -0
  121. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/__init__.py +0 -0
  122. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/_base.py +0 -0
  123. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/_constants.py +0 -0
  124. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/_data_types.py +0 -0
  125. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_data_model/models/entities/_parser.py +0 -0
  126. {cognite_neat-1.0.9/cognite/neat/_session/_html → cognite_neat-1.0.28/cognite/neat/_data_model/validation}/__init__.py +0 -0
  127. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_issues.py +0 -0
  128. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/__init__.py +0 -0
  129. {cognite_neat-1.0.9/cognite/neat/_session/_result/_deployment → cognite_neat-1.0.28/cognite/neat/_session/_html}/__init__.py +0 -0
  130. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/deployment.css +0 -0
  131. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/deployment.js +0 -0
  132. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/issues.css +0 -0
  133. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/issues.js +0 -0
  134. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_html/static/shared.css +0 -0
  135. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_issues.py +0 -0
  136. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_result/__init__.py +0 -0
  137. {cognite_neat-1.0.9/cognite/neat/_session/_result/_deployment/_physical → cognite_neat-1.0.28/cognite/neat/_session/_result/_deployment}/__init__.py +0 -0
  138. {cognite_neat-1.0.9/cognite/neat/_session/_usage_analytics → cognite_neat-1.0.28/cognite/neat/_session/_result/_deployment/_physical}/__init__.py +0 -0
  139. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_result/_deployment/_physical/_statistics.py +0 -0
  140. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_result/_deployment/_physical/serializer.py +0 -0
  141. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_result/_result.py +0 -0
  142. {cognite_neat-1.0.9/cognite/neat/_utils → cognite_neat-1.0.28/cognite/neat/_session/_usage_analytics}/__init__.py +0 -0
  143. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_usage_analytics/_collector.py +0 -0
  144. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_usage_analytics/_constants.py +0 -0
  145. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_session/_usage_analytics/_storage.py +0 -0
  146. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_state_machine/__init__.py +0 -0
  147. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_state_machine/_base.py +0 -0
  148. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_state_machine/_states.py +0 -0
  149. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_store/__init__.py +0 -0
  150. {cognite_neat-1.0.9/cognite/neat/_v0 → cognite_neat-1.0.28/cognite/neat/_utils}/__init__.py +0 -0
  151. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/collection.py +0 -0
  152. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/http_client/__init__.py +0 -0
  153. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/http_client/_config.py +0 -0
  154. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/http_client/_tracker.py +0 -0
  155. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/text.py +0 -0
  156. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/useful_types.py +0 -0
  157. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_utils/validation.py +0 -0
  158. {cognite_neat-1.0.9/cognite/neat/_v0/core → cognite_neat-1.0.28/cognite/neat/_v0}/__init__.py +0 -0
  159. {cognite_neat-1.0.9/cognite/neat/_v0/core/_client/_api → cognite_neat-1.0.28/cognite/neat/_v0/core}/__init__.py +0 -0
  160. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/__init__.py +0 -0
  161. {cognite_neat-1.0.9/cognite/neat/_v0/core/_client/data_classes → cognite_neat-1.0.28/cognite/neat/_v0/core/_client/_api}/__init__.py +0 -0
  162. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/_api/data_modeling_loaders.py +0 -0
  163. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/_api/neat_instances.py +0 -0
  164. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/_api/schema.py +0 -0
  165. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/_api/statistics.py +0 -0
  166. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/_api_client.py +0 -0
  167. {cognite_neat-1.0.9/cognite/neat/_v0/core/_data_model → cognite_neat-1.0.28/cognite/neat/_v0/core/_client/data_classes}/__init__.py +0 -0
  168. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/data_classes/data_modeling.py +0 -0
  169. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/data_classes/neat_sequence.py +0 -0
  170. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/data_classes/schema.py +0 -0
  171. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/data_classes/statistics.py +0 -0
  172. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_client/testing.py +0 -0
  173. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_config.py +0 -0
  174. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_constants.py +0 -0
  175. {cognite_neat-1.0.9/cognite/neat/_v0/core/_instances → cognite_neat-1.0.28/cognite/neat/_v0/core/_data_model}/__init__.py +0 -0
  176. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/_constants.py +0 -0
  177. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/_shared.py +0 -0
  178. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/analysis/__init__.py +0 -0
  179. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/analysis/_base.py +0 -0
  180. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/catalog/__init__.py +0 -0
  181. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/catalog/classic_model.xlsx +0 -0
  182. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
  183. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
  184. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/__init__.py +0 -0
  185. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_base.py +0 -0
  186. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_data_model2dms.py +0 -0
  187. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_data_model2excel.py +0 -0
  188. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_data_model2instance_template.py +0 -0
  189. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_data_model2semantic_model.py +0 -0
  190. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/exporters/_data_model2yaml.py +0 -0
  191. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/__init__.py +0 -0
  192. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_base.py +0 -0
  193. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_base_file_reader.py +0 -0
  194. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_dict2data_model.py +0 -0
  195. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_dms2data_model.py +0 -0
  196. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_graph2data_model.py +0 -0
  197. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_rdf/__init__.py +0 -0
  198. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_rdf/_base.py +0 -0
  199. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +0 -0
  200. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_rdf/_owl2data_model.py +0 -0
  201. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_rdf/_shared.py +0 -0
  202. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/importers/_spreadsheet2data_model.py +0 -0
  203. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/__init__.py +0 -0
  204. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/_base_unverified.py +0 -0
  205. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/_base_verified.py +0 -0
  206. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/_import_contexts.py +0 -0
  207. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/_types.py +0 -0
  208. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/conceptual/__init__.py +0 -0
  209. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/conceptual/_unverified.py +0 -0
  210. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/conceptual/_validation.py +0 -0
  211. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/conceptual/_verified.py +0 -0
  212. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/data_types.py +0 -0
  213. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/__init__.py +0 -0
  214. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_constants.py +0 -0
  215. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_loaders.py +0 -0
  216. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_multi_value.py +0 -0
  217. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_restrictions.py +0 -0
  218. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_single_value.py +0 -0
  219. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_types.py +0 -0
  220. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/entities/_wrapped.py +0 -0
  221. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/mapping/__init__.py +0 -0
  222. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.py +0 -0
  223. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.yaml +0 -0
  224. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/physical/__init__.py +0 -0
  225. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/physical/_exporter.py +0 -0
  226. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/physical/_unverified.py +0 -0
  227. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/physical/_validation.py +0 -0
  228. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/models/physical/_verified.py +0 -0
  229. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/__init__.py +0 -0
  230. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/_base.py +0 -0
  231. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/_converters.py +0 -0
  232. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/_mapping.py +0 -0
  233. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/_union_conceptual.py +0 -0
  234. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_data_model/transformers/_verification.py +0 -0
  235. {cognite_neat-1.0.9/cognite/neat/_v0/core/_instances/extractors/_classic_cdf → cognite_neat-1.0.28/cognite/neat/_v0/core/_instances}/__init__.py +0 -0
  236. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/_shared.py +0 -0
  237. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/_tracking/__init__.py +0 -0
  238. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/_tracking/base.py +0 -0
  239. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/_tracking/log.py +0 -0
  240. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
  241. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
  242. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/examples/__init__.py +0 -0
  243. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  244. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/__init__.py +0 -0
  245. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_base.py +0 -0
  246. {cognite_neat-1.0.9/cognite/neat/_v0/core/_utils → cognite_neat-1.0.28/cognite/neat/_v0/core/_instances/extractors/_classic_cdf}/__init__.py +0 -0
  247. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_assets.py +0 -0
  248. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_base.py +0 -0
  249. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_classic.py +0 -0
  250. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
  251. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_events.py +0 -0
  252. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_files.py +0 -0
  253. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_labels.py +0 -0
  254. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_relationships.py +0 -0
  255. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_sequences.py +0 -0
  256. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
  257. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_dict.py +0 -0
  258. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_dms.py +0 -0
  259. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_dms_graph.py +0 -0
  260. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_mock_graph_generator.py +0 -0
  261. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_raw.py +0 -0
  262. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/extractors/_rdf_file.py +0 -0
  263. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/loaders/__init__.py +0 -0
  264. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/loaders/_base.py +0 -0
  265. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/loaders/_rdf2dms.py +0 -0
  266. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/loaders/_rdf_to_instance_space.py +0 -0
  267. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/queries/__init__.py +0 -0
  268. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/queries/_base.py +0 -0
  269. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/queries/_queries.py +0 -0
  270. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/queries/_select.py +0 -0
  271. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/queries/_update.py +0 -0
  272. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/__init__.py +0 -0
  273. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/_base.py +0 -0
  274. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/_classic_cdf.py +0 -0
  275. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/_prune_graph.py +0 -0
  276. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/_rdfpath.py +0 -0
  277. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_instances/transformers/_value_type.py +0 -0
  278. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/__init__.py +0 -0
  279. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/_base.py +0 -0
  280. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/_contextmanagers.py +0 -0
  281. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/_factory.py +0 -0
  282. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/__init__.py +0 -0
  283. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/_external.py +0 -0
  284. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/_general.py +0 -0
  285. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/_properties.py +0 -0
  286. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/_resources.py +0 -0
  287. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/errors/_wrapper.py +0 -0
  288. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/formatters.py +0 -0
  289. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/__init__.py +0 -0
  290. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/_external.py +0 -0
  291. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/_general.py +0 -0
  292. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/_models.py +0 -0
  293. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/_properties.py +0 -0
  294. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/_resources.py +0 -0
  295. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_issues/warnings/user_modeling.py +0 -0
  296. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_shared.py +0 -0
  297. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_store/__init__.py +0 -0
  298. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_store/_data_model.py +0 -0
  299. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_store/_instance.py +0 -0
  300. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_store/_provenance.py +0 -0
  301. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_store/exceptions.py +0 -0
  302. /cognite_neat-1.0.9/cognite/neat/py.typed → /cognite_neat-1.0.28/cognite/neat/_v0/core/_utils/__init__.py +0 -0
  303. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/auth.py +0 -0
  304. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/auxiliary.py +0 -0
  305. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/collection_.py +0 -0
  306. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/graph_transformations_report.py +0 -0
  307. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/io_.py +0 -0
  308. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/rdf_.py +0 -0
  309. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/reader/__init__.py +0 -0
  310. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/reader/_base.py +0 -0
  311. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/spreadsheet.py +0 -0
  312. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/tarjan.py +0 -0
  313. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/text.py +0 -0
  314. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/time_.py +0 -0
  315. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/upload.py +0 -0
  316. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/core/_utils/xml_.py +0 -0
  317. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/engine/__init__.py +0 -0
  318. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/engine/_import.py +0 -0
  319. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/engine/_interface.py +0 -0
  320. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/engine/_load.py +0 -0
  321. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/plugins/__init__.py +0 -0
  322. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/plugins/_base.py +0 -0
  323. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/plugins/_data_model.py +0 -0
  324. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/plugins/_issues.py +0 -0
  325. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/plugins/_manager.py +0 -0
  326. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/__init__.py +0 -0
  327. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_base.py +0 -0
  328. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_collector.py +0 -0
  329. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_diff.py +0 -0
  330. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_drop.py +0 -0
  331. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_experimental.py +0 -0
  332. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_explore.py +0 -0
  333. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_fix.py +0 -0
  334. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_inspect.py +0 -0
  335. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_mapping.py +0 -0
  336. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_plugin.py +0 -0
  337. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_prepare.py +0 -0
  338. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_read.py +0 -0
  339. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_set.py +0 -0
  340. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_show.py +0 -0
  341. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_state/README.md +0 -0
  342. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_state.py +0 -0
  343. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_subset.py +0 -0
  344. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_template.py +0 -0
  345. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_to.py +0 -0
  346. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/_wizard.py +0 -0
  347. {cognite_neat-1.0.9 → cognite_neat-1.0.28}/cognite/neat/_v0/session/exceptions.py +0 -0
@@ -1,26 +1,30 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognite-neat
3
- Version: 1.0.9
3
+ Version: 1.0.28
4
4
  Summary: Knowledge graph transformation
5
5
  Author: Nikola Vasiljevic, Anders Albert
6
6
  Author-email: Nikola Vasiljevic <nikola.vasiljevic@cognite.com>, Anders Albert <anders.albert@cognite.com>
7
7
  License-Expression: Apache-2.0
8
- Requires-Dist: pandas>=1.5.3,<3.0.0
8
+ Classifier: Development Status :: 5 - Production/Stable
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Intended Audience :: Information Technology
11
+ Classifier: Intended Audience :: Customer Service
12
+ Classifier: Topic :: Database
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Operating System :: OS Independent
9
20
  Requires-Dist: cognite-sdk>=7.83.0,<8.0.0
10
- Requires-Dist: rdflib>=7.0.0,<8.0.0
11
21
  Requires-Dist: httpx>=0.28.1
12
22
  Requires-Dist: pydantic>=2.0.0,<3.0.0
13
23
  Requires-Dist: pyyaml>=6.0.1,<7.0.0
14
- Requires-Dist: requests>=2.28.1,<3.0.0
15
24
  Requires-Dist: urllib3>=1.26.15,<3.0.0
16
25
  Requires-Dist: openpyxl>=3.0.10,<4.0.0
17
26
  Requires-Dist: networkx>=3.4.2,<4.0.0
18
27
  Requires-Dist: mixpanel>=4.10.1,<5.0.0
19
- Requires-Dist: packaging>=22.0
20
- Requires-Dist: jsonpath-python>=1.0.6,<2.0.0
21
- Requires-Dist: elementpath>=4.0.0,<5.0.0
22
- Requires-Dist: pyvis>=0.3.2,<1.0.0
23
- Requires-Dist: rich[jupyter]>=13.7.1,<14.0.0
24
28
  Requires-Dist: exceptiongroup>=1.1.3,<2.0.0 ; python_full_version < '3.11'
25
29
  Requires-Dist: backports-strenum>=1.2,<2.0.0 ; python_full_version < '3.11'
26
30
  Requires-Dist: typing-extensions>=4.8.0,<5.0.0 ; python_full_version < '3.11'
@@ -39,16 +43,25 @@ Requires-Dist: mkdocs-autorefs>=0.5.0,<1.0.0 ; extra == 'docs'
39
43
  Requires-Dist: gspread>=5.0.0,<6.0.0 ; extra == 'google'
40
44
  Requires-Dist: google-api-python-client>=2.70.0,<3.0.0 ; extra == 'google'
41
45
  Requires-Dist: google-auth-oauthlib>=1.0.0,<2.0.0 ; extra == 'google'
46
+ Requires-Dist: rdflib>=7.0.0,<8.0.0 ; extra == 'legacy'
47
+ Requires-Dist: pandas>=1.5.3,<3.0.0 ; extra == 'legacy'
48
+ Requires-Dist: requests>=2.28.1,<3.0.0 ; extra == 'legacy'
49
+ Requires-Dist: packaging>=22.0 ; extra == 'legacy'
50
+ Requires-Dist: jsonpath-python>=1.0.6,<2.0.0 ; extra == 'legacy'
51
+ Requires-Dist: elementpath>=4.0.0,<5.0.0 ; extra == 'legacy'
52
+ Requires-Dist: pyvis>=0.3.2,<1.0.0 ; extra == 'legacy'
53
+ Requires-Dist: rich[jupyter]>=13.7.1,<14.0.0 ; extra == 'legacy'
42
54
  Requires-Dist: lxml>=5.3.0,<6.0.0 ; extra == 'lxml'
43
55
  Requires-Dist: oxrdflib>=0.4.0,<0.5.0 ; extra == 'oxi'
44
56
  Requires-Dist: pyoxigraph>=0.4.3,<0.5.0 ; extra == 'oxi'
45
57
  Requires-Python: >=3.10
46
- Project-URL: Changelog, https://github.com/cognitedata/neat/releases
47
58
  Project-URL: Documentation, https://cognite-neat.readthedocs-hosted.com/
48
- Project-URL: GitHub, https://github.com/cognitedata/neat
49
59
  Project-URL: Homepage, https://cognite-neat.readthedocs-hosted.com/
60
+ Project-URL: GitHub, https://github.com/cognitedata/neat
61
+ Project-URL: Changelog, https://github.com/cognitedata/neat/releases
50
62
  Provides-Extra: docs
51
63
  Provides-Extra: google
64
+ Provides-Extra: legacy
52
65
  Provides-Extra: lxml
53
66
  Provides-Extra: oxi
54
67
  Description-Content-Type: text/markdown
@@ -0,0 +1,7 @@
1
+ from cognite.neat._client.init.main import get_cognite_client
2
+
3
+ from ._config import NeatConfig, get_neat_config_from_file
4
+ from ._session import NeatSession
5
+ from ._version import __version__
6
+
7
+ __all__ = ["NeatConfig", "NeatSession", "__version__", "get_cognite_client", "get_neat_config_from_file"]
@@ -0,0 +1,5 @@
1
+ from .client import NeatClient
2
+ from .config import NeatClientConfig
3
+ from .init.main import get_cognite_client
4
+
5
+ __all__ = ["NeatClient", "NeatClientConfig", "get_cognite_client"]
@@ -0,0 +1,178 @@
1
+ from abc import ABC, abstractmethod
2
+ from collections.abc import Iterable, Sequence
3
+ from dataclasses import dataclass
4
+ from typing import Any, Generic, Literal, TypeAlias, TypeVar
5
+
6
+ from pydantic import BaseModel, JsonValue, TypeAdapter
7
+
8
+ from cognite.neat._client.config import NeatClientConfig
9
+ from cognite.neat._data_model.models.dms._base import T_Resource, T_Response
10
+ from cognite.neat._utils.collection import chunker_sequence
11
+ from cognite.neat._utils.http_client import HTTPClient, ParametersRequest, SimpleBodyRequest, SuccessResponse
12
+ from cognite.neat._utils.useful_types import T_Reference
13
+
14
+ from .data_classes import PagedResponse
15
+
16
+ _T_BaseModel = TypeVar("_T_BaseModel", bound=BaseModel)
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class Endpoint:
21
+ method: Literal["GET", "POST"]
22
+ path: str
23
+ item_limit: int
24
+
25
+
26
+ APIMethod: TypeAlias = Literal["apply", "retrieve", "delete", "list"]
27
+
28
+
29
+ class NeatAPI(Generic[T_Reference, T_Resource, T_Response], ABC):
30
+ def __init__(
31
+ self, neat_config: NeatClientConfig, http_client: HTTPClient, endpoint_map: dict[APIMethod, Endpoint]
32
+ ) -> None:
33
+ self._config = neat_config
34
+ self._http_client = http_client
35
+ self._method_endpoint_map = endpoint_map
36
+
37
+ @abstractmethod
38
+ def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[T_Response]:
39
+ """Parse a single item response."""
40
+ raise NotImplementedError()
41
+
42
+ @abstractmethod
43
+ def _validate_id_response(self, response: SuccessResponse) -> list[T_Reference]:
44
+ """Parse a single item response."""
45
+ raise NotImplementedError()
46
+
47
+ def _make_url(self, path: str = "") -> str:
48
+ """Create the full URL for this resource endpoint."""
49
+ return self._config.create_api_url(path)
50
+
51
+ def _request_item_response(
52
+ self,
53
+ items: Sequence[BaseModel],
54
+ method: APIMethod,
55
+ extra_body: dict[str, Any] | None = None,
56
+ ) -> list[T_Response]:
57
+ response_items: list[T_Response] = []
58
+ for response in self._chunk_requests(items, method, extra_body):
59
+ response_items.extend(self._validate_page_response(response).items)
60
+ return response_items
61
+
62
+ def _request_id_response(
63
+ self,
64
+ items: Sequence[BaseModel],
65
+ method: APIMethod,
66
+ extra_body: dict[str, Any] | None = None,
67
+ ) -> list[T_Reference]:
68
+ response_items: list[T_Reference] = []
69
+ for response in self._chunk_requests(items, method, extra_body):
70
+ response_items.extend(self._validate_id_response(response))
71
+ return response_items
72
+
73
+ def _chunk_requests(
74
+ self,
75
+ items: Sequence[_T_BaseModel],
76
+ method: APIMethod,
77
+ extra_body: dict[str, Any] | None = None,
78
+ ) -> Iterable[SuccessResponse]:
79
+ """Send requests in chunks and yield responses.
80
+
81
+ Args:
82
+ items: The items to process.
83
+ method: The API method to use. This is used ot look the up the endpoint.
84
+ extra_body: Optional extra body content to include in the request.
85
+
86
+ Yields:
87
+ The successful responses from the API.
88
+ """
89
+ # Filter out None
90
+ endpoint = self._method_endpoint_map[method]
91
+
92
+ for chunk in chunker_sequence(items, endpoint.item_limit):
93
+ request = SimpleBodyRequest(
94
+ endpoint_url=self._make_url(endpoint.path),
95
+ method=endpoint.method,
96
+ body=TypeAdapter(dict[str, JsonValue]).dump_json(
97
+ {
98
+ "items": [item.model_dump(by_alias=True) for item in chunk],
99
+ **(extra_body or {}),
100
+ },
101
+ ),
102
+ )
103
+ response = self._http_client.request_with_retries(request)
104
+ response.raise_for_status()
105
+ yield response.success_response
106
+
107
+ @classmethod
108
+ def _filter_out_none_values(cls, params: dict[str, Any] | None) -> dict[str, Any] | None:
109
+ request_params: dict[str, Any] | None = None
110
+ if params:
111
+ request_params = {k: v for k, v in params.items() if v is not None}
112
+ return request_params
113
+
114
+ def _paginate(
115
+ self,
116
+ limit: int,
117
+ cursor: str | None = None,
118
+ params: dict[str, Any] | None = None,
119
+ ) -> PagedResponse[T_Response]:
120
+ """Fetch a single page of resources.
121
+
122
+ Args:
123
+ params: Query parameters for the request. Supported parameters depend on
124
+ the resource type but typically include:
125
+ - cursor: Cursor for pagination
126
+ - limit: Maximum number of items (defaults to list limit)
127
+ - space: Filter by space
128
+ - includeGlobal: Whether to include global resources
129
+ limit: Maximum number of items to return in the page.
130
+ cursor: Cursor for pagination.
131
+
132
+ Returns:
133
+ A Page containing the items and the cursor for the next page.
134
+ """
135
+ endpoint = self._method_endpoint_map["list"]
136
+ if not (0 < limit <= endpoint.item_limit):
137
+ raise ValueError(f"Limit must be between 1 and {endpoint.item_limit}, got {limit}.")
138
+ if endpoint.method != "GET":
139
+ raise NotImplementedError(f"Pagination not implemented for method {endpoint.method}.")
140
+ request_params = self._filter_out_none_values(params) or {}
141
+ request_params["limit"] = limit
142
+ if cursor is not None:
143
+ request_params["cursor"] = cursor
144
+ request = ParametersRequest(
145
+ endpoint_url=self._make_url(endpoint.path),
146
+ method=endpoint.method,
147
+ parameters=request_params,
148
+ )
149
+ result = self._http_client.request_with_retries(request)
150
+ result.raise_for_status()
151
+ return self._validate_page_response(result.success_response)
152
+
153
+ def _iterate(
154
+ self,
155
+ limit: int | None = None,
156
+ cursor: str | None = None,
157
+ params: dict[str, Any] | None = None,
158
+ ) -> Iterable[list[T_Response]]:
159
+ """Iterate over all resources, handling pagination automatically."""
160
+ next_cursor = cursor
161
+ total = 0
162
+ endpoint = self._method_endpoint_map["list"]
163
+ while True:
164
+ page_limit = endpoint.item_limit if limit is None else min(limit - total, endpoint.item_limit)
165
+ page = self._paginate(limit=page_limit, cursor=next_cursor, params=params)
166
+ yield page.items
167
+ total += len(page.items)
168
+ if page.next_cursor is None or (limit is not None and total >= limit):
169
+ break
170
+ next_cursor = page.next_cursor
171
+
172
+ def _list(
173
+ self,
174
+ limit: int | None = None,
175
+ params: dict[str, Any] | None = None,
176
+ ) -> list[T_Response]:
177
+ """List all resources, handling pagination automatically."""
178
+ return [item for batch in self._iterate(limit=limit, params=params) for item in batch]
@@ -0,0 +1,77 @@
1
+ from collections.abc import Sequence
2
+
3
+ from cognite.neat._data_model.models.dms import ContainerReference, ContainerRequest, ContainerResponse
4
+ from cognite.neat._utils.http_client import HTTPClient, SuccessResponse
5
+
6
+ from .api import Endpoint, NeatAPI
7
+ from .config import NeatClientConfig
8
+ from .data_classes import PagedResponse
9
+ from .filters import ContainerFilter
10
+
11
+
12
+ class ContainersAPI(NeatAPI):
13
+ def __init__(self, neat_config: NeatClientConfig, http_client: HTTPClient) -> None:
14
+ super().__init__(
15
+ neat_config,
16
+ http_client,
17
+ endpoint_map={
18
+ "apply": Endpoint("POST", "models/containers", item_limit=100),
19
+ "retrieve": Endpoint("POST", "models/containers/byids", item_limit=100),
20
+ "delete": Endpoint("POST", "models/containers/delete", item_limit=100),
21
+ "list": Endpoint("GET", "models/containers", item_limit=1000),
22
+ },
23
+ )
24
+
25
+ def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[ContainerResponse]:
26
+ return PagedResponse[ContainerResponse].model_validate_json(response.body)
27
+
28
+ def _validate_id_response(self, response: SuccessResponse) -> list[ContainerReference]:
29
+ return PagedResponse[ContainerReference].model_validate_json(response.body).items
30
+
31
+ def apply(self, items: Sequence[ContainerRequest]) -> list[ContainerResponse]:
32
+ """Apply (create or update) containers in CDF.
33
+
34
+ Args:
35
+ items: List of ContainerRequest objects to apply.
36
+ Returns:
37
+ List of ContainerResponse objects.
38
+ """
39
+ return self._request_item_response(items, "apply")
40
+
41
+ def retrieve(self, items: list[ContainerReference]) -> list[ContainerResponse]:
42
+ """Retrieve containers by their identifiers.
43
+
44
+ Args:
45
+ items: List of (space, external_id) tuples identifying the containers to retrieve.
46
+
47
+ Returns:
48
+ List of ContainerResponse objects.
49
+ """
50
+ return self._request_item_response(items, "retrieve")
51
+
52
+ def delete(self, items: list[ContainerReference]) -> list[ContainerReference]:
53
+ """Delete containers by their identifiers.
54
+
55
+ Args:
56
+ items: List of ContainerReference objects identifying the containers to delete.
57
+
58
+ Returns:
59
+ List of ContainerReference objects representing the deleted containers.
60
+ """
61
+ return self._request_id_response(items, "delete")
62
+
63
+ def list(
64
+ self, space: str | None = None, include_global: bool = False, limit: int | None = 10
65
+ ) -> list[ContainerResponse]:
66
+ """List containers in CDF Project.
67
+
68
+ Args:
69
+ space: If specified, only containers in this space are returned.
70
+ include_global: If True, include global containers.
71
+ limit: Maximum number of containers to return. If None, return all containers.
72
+
73
+ Returns:
74
+ List of ContainerResponse objects.
75
+ """
76
+ filter = ContainerFilter(space=space, include_global=include_global)
77
+ return self._list(limit=limit, params=filter.dump())
@@ -0,0 +1,87 @@
1
+ from collections.abc import Sequence
2
+
3
+ from cognite.neat._data_model.models.dms import DataModelReference, DataModelRequest, DataModelResponse
4
+ from cognite.neat._utils.http_client import HTTPClient, SuccessResponse
5
+
6
+ from .api import Endpoint, NeatAPI
7
+ from .config import NeatClientConfig
8
+ from .data_classes import PagedResponse
9
+ from .filters import DataModelFilter
10
+
11
+
12
+ class DataModelsAPI(NeatAPI):
13
+ def __init__(self, neat_config: NeatClientConfig, http_client: HTTPClient) -> None:
14
+ super().__init__(
15
+ neat_config,
16
+ http_client,
17
+ endpoint_map={
18
+ "apply": Endpoint("POST", "/models/datamodels", item_limit=100),
19
+ "retrieve": Endpoint("POST", "/models/datamodels/byids", item_limit=100),
20
+ "delete": Endpoint("POST", "/models/datamodels/delete", item_limit=100),
21
+ "list": Endpoint("GET", "/models/datamodels", item_limit=1000),
22
+ },
23
+ )
24
+
25
+ def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[DataModelResponse]:
26
+ return PagedResponse[DataModelResponse].model_validate_json(response.body)
27
+
28
+ def _validate_id_response(self, response: SuccessResponse) -> list[DataModelReference]:
29
+ return PagedResponse[DataModelReference].model_validate_json(response.body).items
30
+
31
+ def apply(self, data_models: Sequence[DataModelRequest]) -> list[DataModelResponse]:
32
+ """Apply (create or update) data models in CDF.
33
+
34
+ Args:
35
+ data_models: List of DataModelRequest objects to apply.
36
+ Returns:
37
+ List of DataModelResponse objects.
38
+ """
39
+ return self._request_item_response(data_models, "apply")
40
+
41
+ def retrieve(self, items: list[DataModelReference]) -> list[DataModelResponse]:
42
+ """Retrieve data models by their identifiers.
43
+
44
+ Args:
45
+ items: List of data models references identifying the data models to retrieve.
46
+ Returns:
47
+ List of DataModelResponse objects.
48
+ """
49
+ return self._request_item_response(items, "retrieve")
50
+
51
+ def delete(self, items: list[DataModelReference]) -> list[DataModelReference]:
52
+ """Delete data models by their identifiers.
53
+
54
+ Args:
55
+ items: List of data model references identifying the data models to delete.
56
+ Returns:
57
+ List of DataModelReference objects representing the deleted data models.
58
+ """
59
+ return self._request_id_response(items, "delete")
60
+
61
+ def list(
62
+ self,
63
+ space: str | None = None,
64
+ all_versions: bool = False,
65
+ inline_views: bool = False,
66
+ include_global: bool = False,
67
+ limit: int | None = 10,
68
+ ) -> list[DataModelResponse]:
69
+ """List data models in CDF Project.
70
+
71
+ Args:
72
+ space: If specified, only data models in this space are returned.
73
+ all_versions: If True, return all versions. If False, only return the latest version.
74
+ inline_views: If True, include views inline in the response.
75
+ include_global: If True, include global data models.
76
+ limit: Maximum number of data models to return. If None, return all data models.
77
+
78
+ Returns:
79
+ List of DataModelResponse objects.
80
+ """
81
+ filter = DataModelFilter(
82
+ space=space,
83
+ all_versions=all_versions,
84
+ inline_views=inline_views,
85
+ include_global=include_global,
86
+ )
87
+ return self._list(limit=limit, params=filter.dump())
@@ -0,0 +1,40 @@
1
+ from typing import Any, Literal
2
+
3
+ from pydantic import BaseModel, ConfigDict
4
+ from pydantic.alias_generators import to_camel
5
+
6
+
7
+ class BaseModelRequest(BaseModel):
8
+ """Base class for all object. This includes resources and nested objects."""
9
+
10
+
11
+ class Filter(BaseModel):
12
+ model_config = ConfigDict(alias_generator=to_camel, extra="ignore", populate_by_name=True)
13
+
14
+ def dump(self, camel_case: bool = True) -> dict[str, Any]:
15
+ """Dump the object to a dictionary.
16
+
17
+ Args:
18
+ camel_case (bool): Whether to use camelCase for the keys. Default is True.
19
+
20
+ """
21
+ return self.model_dump(mode="json", by_alias=camel_case, exclude_unset=True)
22
+
23
+
24
+ class DataModelingFilter(Filter):
25
+ space: str | None = None
26
+ include_global: bool | None = None
27
+
28
+
29
+ class ContainerFilter(DataModelingFilter):
30
+ used_for: Literal["node", "edge", "record", "all"] | None = None
31
+
32
+
33
+ class ViewFilter(DataModelingFilter):
34
+ include_inherited_properties: bool | None = None
35
+ all_versions: bool | None = None
36
+
37
+
38
+ class DataModelFilter(DataModelingFilter):
39
+ inline_views: bool | None = None
40
+ all_versions: bool | None = None
@@ -0,0 +1,60 @@
1
+ from collections.abc import Callable
2
+
3
+ from cognite.client.credentials import CredentialProvider, OAuthClientCredentials, OAuthInteractive, Token
4
+
5
+ from cognite.neat._utils.text import humanize_collection
6
+
7
+ from .env_vars import ClientEnvironmentVariables, LoginFlow
8
+
9
+
10
+ def get_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
11
+ options: dict[LoginFlow, Callable[[ClientEnvironmentVariables], CredentialProvider]] = {
12
+ "client_credentials": create_client_credentials,
13
+ "interactive": create_interactive_credentials,
14
+ "token": create_token_credentials,
15
+ }
16
+ return options[env_vars.LOGIN_FLOW](env_vars)
17
+
18
+
19
+ def create_client_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
20
+ missing: list[str] = []
21
+ if not env_vars.IDP_CLIENT_ID:
22
+ missing.append("IDP_CLIENT_ID")
23
+ if not env_vars.IDP_CLIENT_SECRET:
24
+ missing.append("IDP_CLIENT_SECRET")
25
+ if env_vars.IDP_CLIENT_ID is None or env_vars.IDP_CLIENT_SECRET is None:
26
+ raise ValueError(
27
+ f"The following environment variables must be set for "
28
+ f"client credentials authentication: {humanize_collection(missing)}"
29
+ )
30
+
31
+ if env_vars.PROVIDER == "cdf":
32
+ return OAuthClientCredentials(
33
+ client_id=env_vars.IDP_CLIENT_ID,
34
+ client_secret=env_vars.IDP_CLIENT_SECRET,
35
+ token_url=env_vars.idp_token_url,
36
+ scopes=None, # type: ignore[arg-type]
37
+ )
38
+ return OAuthClientCredentials(
39
+ client_id=env_vars.IDP_CLIENT_ID,
40
+ client_secret=env_vars.IDP_CLIENT_SECRET,
41
+ token_url=env_vars.idp_token_url,
42
+ audience=env_vars.idp_audience,
43
+ scopes=env_vars.idp_scopes,
44
+ )
45
+
46
+
47
+ def create_interactive_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
48
+ if not env_vars.IDP_CLIENT_ID:
49
+ raise ValueError("IDP_CLIENT_ID environment variable must be set for interactive authentication.")
50
+ return OAuthInteractive(
51
+ client_id=env_vars.IDP_CLIENT_ID,
52
+ authority_url=env_vars.idp_authority_url,
53
+ scopes=env_vars.idp_scopes,
54
+ )
55
+
56
+
57
+ def create_token_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
58
+ if not env_vars.CDF_TOKEN:
59
+ raise ValueError("CDF_TOKEN environment variable must be set for token authentication.")
60
+ return Token(env_vars.CDF_TOKEN)
@@ -0,0 +1,143 @@
1
+ import sys
2
+ from pathlib import Path
3
+ from typing import Any, Literal, TypeAlias, get_args
4
+
5
+ from pydantic import BaseModel, ConfigDict, ValidationError
6
+
7
+ from cognite.neat._utils.validation import humanize_validation_error
8
+
9
+ if sys.version_info >= (3, 11):
10
+ from typing import Self
11
+ else:
12
+ from typing_extensions import Self
13
+
14
+ LoginFlow: TypeAlias = Literal["client_credentials", "interactive", "token"]
15
+ AVAILABLE_LOGIN_FLOWS: tuple[LoginFlow, ...] = get_args(LoginFlow)
16
+ Provider: TypeAlias = Literal["entra_id", "auth0", "cdf", "other"]
17
+ AVAILABLE_PROVIDERS: tuple[Provider, ...] = get_args(Provider)
18
+
19
+
20
+ class ClientEnvironmentVariables(BaseModel):
21
+ """Configuration for environment variables used by the NEAT client."""
22
+
23
+ model_config = ConfigDict(extra="forbid", frozen=True)
24
+ CDF_CLUSTER: str
25
+ CDF_PROJECT: str
26
+ PROVIDER: Provider = "entra_id"
27
+ LOGIN_FLOW: LoginFlow = "client_credentials"
28
+
29
+ IDP_CLIENT_ID: str | None = None
30
+ IDP_CLIENT_SECRET: str | None = None
31
+ CDF_TOKEN: str | None = None
32
+
33
+ IDP_TENANT_ID: str | None = None
34
+ IDP_TOKEN_URL: str | None = None
35
+
36
+ CDF_URL: str | None = None
37
+ IDP_AUDIENCE: str | None = None
38
+ IDP_SCOPES: str | None = None
39
+ IDP_AUTHORITY_URL: str | None = None
40
+ IDP_DISCOVERY_URL: str | None = None
41
+ CDF_MAX_WORKERS: int | None = None
42
+ CDF_CLIENT_TIMEOUT: int | None = None
43
+ CDF_REDIRECT_PORT: int = 53_000
44
+
45
+ @classmethod
46
+ def create_humanize(cls, values: dict[str, Any]) -> Self:
47
+ try:
48
+ return cls.model_validate(values)
49
+ except ValidationError as e:
50
+ errors = [humanize_validation_error(error) for error in e.errors()]
51
+ raise ValueError("Invalid environment variable configuration:\n" + "\n - ".join(errors)) from e
52
+
53
+ @property
54
+ def idp_tenant_id(self) -> str:
55
+ if self.IDP_TENANT_ID:
56
+ return self.IDP_TENANT_ID
57
+ # This line is technically unreachable due to the checks in idp_token_url and idp_authority_url
58
+ raise RuntimeError("IDP_TENANT_ID is missing")
59
+
60
+ @property
61
+ def idp_token_url(self) -> str:
62
+ if self.PROVIDER == "cdf":
63
+ return "https://auth.cognite.com/oauth2/token"
64
+ if self.IDP_TOKEN_URL:
65
+ return self.IDP_TOKEN_URL
66
+ if self.PROVIDER == "entra_id" and self.IDP_TENANT_ID:
67
+ return f"https://login.microsoftonline.com/{self.IDP_TENANT_ID}/oauth2/v2.0/token"
68
+ alternative = " or provide IDP_TENANT_ID" if self.PROVIDER == "entra_id" else ""
69
+ raise ValueError(
70
+ f"IDP_TOKEN_URL is missing. Please provide it{alternative} in the environment variables.",
71
+ )
72
+
73
+ @property
74
+ def cdf_url(self) -> str:
75
+ return self.CDF_URL or f"https://{self.CDF_CLUSTER}.cognitedata.com"
76
+
77
+ @property
78
+ def idp_audience(self) -> str:
79
+ if self.IDP_AUDIENCE:
80
+ return self.IDP_AUDIENCE
81
+ if self.PROVIDER == "auth0":
82
+ return f"https://{self.CDF_PROJECT}.fusion.cognite.com/{self.CDF_PROJECT}"
83
+ else:
84
+ return f"https://{self.CDF_CLUSTER}.cognitedata.com"
85
+
86
+ @property
87
+ def idp_scopes(self) -> list[str]:
88
+ if self.IDP_SCOPES:
89
+ return self.IDP_SCOPES.split(",")
90
+ if self.PROVIDER == "auth0":
91
+ return ["IDENTITY", "user_impersonation"]
92
+ return [f"https://{self.CDF_CLUSTER}.cognitedata.com/.default"]
93
+
94
+ @property
95
+ def idp_authority_url(self) -> str:
96
+ if self.IDP_AUTHORITY_URL:
97
+ return self.IDP_AUTHORITY_URL
98
+ if self.PROVIDER == "entra_id" and self.IDP_TENANT_ID:
99
+ return f"https://login.microsoftonline.com/{self.IDP_TENANT_ID}"
100
+ alternative = " or provide IDP_TENANT_ID" if self.PROVIDER == "entra_id" else ""
101
+ raise ValueError(
102
+ f"IDP_AUTHORITY_URL is missing. Please provide it{alternative} in the environment variables.",
103
+ )
104
+
105
+
106
+ def parse_env_file(env_file_path: Path) -> ClientEnvironmentVariables:
107
+ content = env_file_path.read_text()
108
+ variables: dict[str, Any] = {}
109
+ for line in content.splitlines():
110
+ if line.startswith("#") or "=" not in line:
111
+ continue
112
+ key, value = line.strip().split("=", 1)
113
+ variables[key] = value
114
+ return ClientEnvironmentVariables.create_humanize(variables)
115
+
116
+
117
+ def create_env_file_content(provider: Provider, login_flow: LoginFlow) -> str:
118
+ lines = [
119
+ "# Cognite NEAT Client Environment Variables",
120
+ "CDF_CLUSTER=<your-cdf-cluster>",
121
+ "CDF_PROJECT=<your-cdf-project>",
122
+ "",
123
+ ]
124
+ if login_flow != "token":
125
+ lines.append(f"PROVIDER={provider}")
126
+ lines.append(f"LOGIN_FLOW={login_flow}")
127
+ lines.append("")
128
+ if login_flow in ("client_credentials", "interactive"):
129
+ lines.append("IDP_CLIENT_ID=<your-idp-client-id>")
130
+ if login_flow == "client_credentials":
131
+ lines.append("IDP_CLIENT_SECRET=<your-idp-client-secret>")
132
+ if provider == "entra_id":
133
+ lines.append("IDP_TENANT_ID=<your-idp-tenant-id>")
134
+ if provider not in ("cdf", "entra_id"):
135
+ lines.append("IDP_TOKEN_URL=<your-idp-token-url>")
136
+ if provider == "other":
137
+ lines.append("IDP_AUDIENCE=<your-idp-audience>")
138
+ lines.append("IDP_SCOPES=<your-idp-scopes-comma-separated>")
139
+ lines.append("IDP_AUTHORITY_URL=<your-idp-authority-url>")
140
+ elif login_flow == "token":
141
+ lines.append("CDF_TOKEN=<your-cdf-token>")
142
+
143
+ return "\n".join(lines)