cognite-neat 0.93.0__py3-none-any.whl → 0.95.0__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.

Potentially problematic release.


This version of cognite-neat might be problematic. Click here for more details.

@@ -5,6 +5,7 @@ from collections.abc import Hashable
5
5
  from datetime import datetime
6
6
  from typing import TYPE_CHECKING, Any, ClassVar, Literal
7
7
 
8
+ import pandas as pd
8
9
  from cognite.client import data_modeling as dm
9
10
  from pydantic import Field, field_serializer, field_validator, model_validator
10
11
  from pydantic_core.core_schema import SerializationInfo, ValidationInfo
@@ -451,3 +452,18 @@ class DMSRules(BaseRules):
451
452
  from ._exporter import _DMSExporter
452
453
 
453
454
  return _DMSExporter(self, include_pipeline, instance_space).to_schema()
455
+
456
+ def _repr_html_(self) -> str:
457
+ summary = {
458
+ "type": "Physical Data Model",
459
+ "intended for": "DMS Architect",
460
+ "name": self.metadata.name,
461
+ "space": self.metadata.space,
462
+ "external_id": self.metadata.external_id,
463
+ "version": self.metadata.version,
464
+ "views": len(self.views),
465
+ "containers": len(self.containers) if self.containers else 0,
466
+ "properties": len(self.properties),
467
+ }
468
+
469
+ return pd.DataFrame([summary]).T.rename(columns={0: ""})._repr_html_() # type: ignore
@@ -3,6 +3,7 @@ from dataclasses import dataclass
3
3
  from datetime import datetime
4
4
  from typing import Any, Literal
5
5
 
6
+ import pandas as pd
6
7
  from cognite.client import data_modeling as dm
7
8
 
8
9
  from cognite.neat._rules.models._base_input import InputComponent, InputRules
@@ -291,3 +292,18 @@ class DMSInputRules(InputRules[DMSRules]):
291
292
  "Last": last,
292
293
  "Reference": reference,
293
294
  }
295
+
296
+ def _repr_html_(self) -> str:
297
+ summary = {
298
+ "type": "Physical Data Model",
299
+ "intended for": "DMS Architect",
300
+ "name": self.metadata.name,
301
+ "space": self.metadata.space,
302
+ "external_id": self.metadata.external_id,
303
+ "version": self.metadata.version,
304
+ "views": len(self.views),
305
+ "containers": len(self.containers) if self.containers else 0,
306
+ "properties": len(self.properties),
307
+ }
308
+
309
+ return pd.DataFrame([summary]).T.rename(columns={0: ""})._repr_html_() # type: ignore
@@ -4,6 +4,7 @@ from collections.abc import Hashable
4
4
  from datetime import datetime
5
5
  from typing import TYPE_CHECKING, Any, ClassVar
6
6
 
7
+ import pandas as pd
7
8
  from pydantic import Field, field_serializer, field_validator, model_validator
8
9
  from pydantic_core.core_schema import SerializationInfo
9
10
  from rdflib import Namespace
@@ -380,3 +381,16 @@ class InformationRules(BaseRules):
380
381
  from cognite.neat._rules.transformers._converters import _InformationRulesConverter
381
382
 
382
383
  return _InformationRulesConverter(self).as_dms_rules()
384
+
385
+ def _repr_html_(self) -> str:
386
+ summary = {
387
+ "type": "Logical Data Model",
388
+ "intended for": "Information Architect",
389
+ "name": self.metadata.name,
390
+ "external_id": self.metadata.prefix,
391
+ "version": self.metadata.version,
392
+ "classes": len(self.classes),
393
+ "properties": len(self.properties),
394
+ }
395
+
396
+ return pd.DataFrame([summary]).T.rename(columns={0: ""})._repr_html_() # type: ignore
@@ -2,6 +2,7 @@ from dataclasses import dataclass, field
2
2
  from datetime import datetime
3
3
  from typing import Any, Literal
4
4
 
5
+ import pandas as pd
5
6
  from rdflib import Namespace
6
7
 
7
8
  from cognite.neat._rules.models._base_input import InputComponent, InputRules
@@ -144,3 +145,16 @@ class InformationInputRules(InputRules[InformationRules]):
144
145
  Last=last,
145
146
  Reference=reference,
146
147
  )
148
+
149
+ def _repr_html_(self) -> str:
150
+ summary = {
151
+ "type": "Logical Data Model",
152
+ "intended for": "Information Architect",
153
+ "name": self.metadata.name,
154
+ "external_id": self.metadata.prefix,
155
+ "version": self.metadata.version,
156
+ "classes": len(self.classes),
157
+ "properties": len(self.properties),
158
+ }
159
+
160
+ return pd.DataFrame([summary]).T.rename(columns={0: ""})._repr_html_() # type: ignore
@@ -1,13 +1,11 @@
1
1
  from typing import Literal, cast
2
2
 
3
- import pandas as pd
4
3
  from cognite.client import CogniteClient
5
4
 
6
5
  from cognite.neat._issues import IssueList
7
6
  from cognite.neat._rules import importers
8
7
  from cognite.neat._rules._shared import ReadRules
9
8
  from cognite.neat._rules.models import DMSRules
10
- from cognite.neat._rules.models._base_input import InputComponent
11
9
  from cognite.neat._rules.models.information._rules import InformationRules
12
10
  from cognite.neat._rules.models.information._rules_input import InformationInputRules
13
11
  from cognite.neat._rules.transformers import ConvertToRules, VerifyAnyRules
@@ -72,13 +70,10 @@ class NeatSession:
72
70
 
73
71
  output = []
74
72
  if state.input_rules and not state.verified_rules:
75
- metadata = cast(InputComponent, state.input_rule.rules.metadata) # type: ignore[union-attr]
76
- table = pd.DataFrame([metadata.dump()]).T._repr_html_() # type: ignore[operator]
77
- output.append(f"<H2>Raw Data Model</H2><br />{table}")
73
+ output.append(f"<H2>Raw Data Model</H2><br />{state.input_rule.rules._repr_html_()}") # type: ignore
78
74
 
79
75
  if state.verified_rules:
80
- table = pd.DataFrame([state.last_verified_rule.metadata.model_dump()]).T._repr_html_() # type: ignore[operator]
81
- output.append(f"<H2>Data Model</H2><br />{table}")
76
+ output.append(f"<H2>Data Model</H2><br />{state.last_verified_rule._repr_html_()}") # type: ignore
82
77
 
83
78
  if state.has_store:
84
79
  output.append(f"<H2>Instances</H2> {state.store._repr_html_()}")
@@ -9,8 +9,10 @@ from cognite.neat._rules.models.information._rules_input import InformationInput
9
9
  from cognite.neat._rules.transformers import ReduceCogniteModel, ToCompliantEntities, ToExtension
10
10
 
11
11
  from ._state import SessionState
12
+ from .exceptions import intercept_session_exceptions
12
13
 
13
14
 
15
+ @intercept_session_exceptions
14
16
  class PrepareAPI:
15
17
  def __init__(self, state: SessionState, verbose: bool) -> None:
16
18
  self._state = state
@@ -18,6 +20,7 @@ class PrepareAPI:
18
20
  self.data_model = DataModelPrepareAPI(state, verbose)
19
21
 
20
22
 
23
+ @intercept_session_exceptions
21
24
  class DataModelPrepareAPI:
22
25
  def __init__(self, state: SessionState, verbose: bool) -> None:
23
26
  self._state = state
@@ -12,8 +12,10 @@ from cognite.neat._rules._shared import ReadRules
12
12
 
13
13
  from ._state import SessionState
14
14
  from ._wizard import NeatObjectType, RDFFileType, object_wizard, rdf_dm_wizard
15
+ from .exceptions import intercept_session_exceptions
15
16
 
16
17
 
18
+ @intercept_session_exceptions
17
19
  class ReadAPI:
18
20
  def __init__(self, state: SessionState, client: CogniteClient | None, verbose: bool) -> None:
19
21
  self._state = state
@@ -23,6 +25,7 @@ class ReadAPI:
23
25
  self.excel = ExcelReadAPI(state, client, verbose)
24
26
 
25
27
 
28
+ @intercept_session_exceptions
26
29
  class BaseReadAPI:
27
30
  def __init__(self, state: SessionState, client: CogniteClient | None, verbose: bool) -> None:
28
31
  self._state = state
@@ -47,6 +50,7 @@ class BaseReadAPI:
47
50
  raise ValueError(f"Expected str or Path, got {type(io)}")
48
51
 
49
52
 
53
+ @intercept_session_exceptions
50
54
  class CDFReadAPI(BaseReadAPI):
51
55
  def data_model(self, data_model_id: DataModelIdentifier) -> IssueList:
52
56
  if self._client is None:
@@ -58,6 +62,7 @@ class CDFReadAPI(BaseReadAPI):
58
62
  return input_rules.issues
59
63
 
60
64
 
65
+ @intercept_session_exceptions
61
66
  class ExcelReadAPI(BaseReadAPI):
62
67
  def __call__(self, io: Any) -> IssueList:
63
68
  filepath = self._return_filepath(io)
@@ -66,6 +71,7 @@ class ExcelReadAPI(BaseReadAPI):
66
71
  return input_rules.issues
67
72
 
68
73
 
74
+ @intercept_session_exceptions
69
75
  class RDFReadAPI(BaseReadAPI):
70
76
  def __init__(self, state: SessionState, client: CogniteClient | None, verbose: bool) -> None:
71
77
  super().__init__(state, client, verbose)
@@ -1,70 +1,232 @@
1
+ import random
1
2
  from typing import Any, cast
2
3
 
3
4
  import networkx as nx
4
5
  from ipycytoscape import CytoscapeWidget # type: ignore
5
6
  from IPython.display import display
6
7
 
8
+ from cognite.neat._rules._constants import EntityTypes
7
9
  from cognite.neat._rules.models.dms._rules import DMSRules
8
- from cognite.neat._rules.models.entities._single_value import ViewEntity
10
+ from cognite.neat._rules.models.entities._single_value import ClassEntity, ViewEntity
11
+ from cognite.neat._rules.models.information._rules import InformationRules
12
+ from cognite.neat._session.exceptions import NeatSessionError
13
+ from cognite.neat._utils.rdf_ import remove_namespace_from_uri
9
14
 
10
15
  from ._state import SessionState
16
+ from .exceptions import intercept_session_exceptions
11
17
 
12
18
 
19
+ @intercept_session_exceptions
13
20
  class ShowAPI:
14
21
  def __init__(self, state: SessionState) -> None:
15
22
  self._state = state
16
23
  self.data_model = ShowDataModelAPI(self._state)
24
+ self.instances = ShowInstanceAPI(self._state)
17
25
 
18
26
 
27
+ @intercept_session_exceptions
28
+ class ShowInstanceAPI:
29
+ def __init__(self, state: SessionState) -> None:
30
+ self._state = state
31
+
32
+ def __call__(self) -> Any:
33
+ if not self._state.store.graph:
34
+ raise NeatSessionError("No instances available. Try using [bold].read[/bold] to load instances.")
35
+
36
+ widget = CytoscapeWidget()
37
+ widget.layout.height = "700px"
38
+
39
+ NxGraph, types = self._generate_instance_di_graph_and_types()
40
+ widget_style = self._generate_cytoscape_widget_style(types)
41
+ widget.set_style(widget_style)
42
+
43
+ widget.graph.add_graph_from_networkx(NxGraph)
44
+ print("Max of 100 nodes and edges are displayed, which are randomly selected.")
45
+
46
+ return display(widget)
47
+
48
+ def _generate_instance_di_graph_and_types(self) -> tuple[nx.DiGraph, set[str]]:
49
+ query = """
50
+ SELECT ?s ?p ?o ?ts ?to WHERE {
51
+ ?s ?p ?o .
52
+ FILTER(isIRI(?o)) # Example filter to check if ?o is an IRI (object type)
53
+ FILTER(BOUND(?o))
54
+ FILTER(?p != rdf:type)
55
+
56
+ ?s a ?ts .
57
+ ?o a ?to .
58
+ }
59
+ LIMIT 100
60
+ """
61
+
62
+ NxGraph = nx.DiGraph()
63
+
64
+ types = set()
65
+
66
+ for ( # type: ignore
67
+ subject,
68
+ property_,
69
+ object,
70
+ subject_type,
71
+ object_type,
72
+ ) in self._state.store.graph.query(query):
73
+ subject = remove_namespace_from_uri(subject)
74
+ property_ = remove_namespace_from_uri(property_)
75
+ object = remove_namespace_from_uri(object)
76
+ subject_type = remove_namespace_from_uri(subject_type)
77
+ object_type = remove_namespace_from_uri(object_type)
78
+
79
+ NxGraph.add_node(subject, label=subject, type=subject_type)
80
+ NxGraph.add_node(object, label=object, type=object_type)
81
+ NxGraph.add_edge(subject, object, label=property_)
82
+
83
+ types.add(subject_type)
84
+ types.add(object_type)
85
+
86
+ return NxGraph, types
87
+
88
+ def _generate_cytoscape_widget_style(self, types: set[str]) -> list[dict]:
89
+ widget_style = [
90
+ {
91
+ "selector": "edge",
92
+ "style": {
93
+ "width": 1,
94
+ "target-arrow-shape": "triangle",
95
+ "curve-style": "bezier",
96
+ "label": "data(label)",
97
+ "font-size": "8px",
98
+ "line-color": "black",
99
+ "target-arrow-color": "black",
100
+ },
101
+ },
102
+ ]
103
+
104
+ colors = self._generate_hex_colors(len(types))
105
+
106
+ for i, type_ in enumerate(types):
107
+ widget_style.append(self._generate_node_cytoscape_style(type_, colors[i]))
108
+
109
+ return widget_style
110
+
111
+ @staticmethod
112
+ def _generate_hex_colors(n: int) -> list[str]:
113
+ """Generate a list of N random HEX color codes."""
114
+ random.seed(42) # Set a seed for deterministic behavior
115
+ hex_colors = []
116
+ for _ in range(n):
117
+ color = f"#{random.randint(0, 0xFFFFFF):06x}"
118
+ hex_colors.append(color)
119
+ return hex_colors
120
+
121
+ @staticmethod
122
+ def _generate_node_cytoscape_style(type_: str, color: str) -> dict:
123
+ template = {
124
+ "css": {
125
+ "content": "data(label)",
126
+ "text-valign": "center",
127
+ "color": "black",
128
+ "font-size": "10px",
129
+ "width": "mapData(score, 0, 1, 10, 50)",
130
+ "height": "mapData(score, 0, 1, 10, 50)",
131
+ },
132
+ }
133
+
134
+ template["selector"] = f'node[type = "{type_}"]' # type: ignore
135
+ template["css"]["background-color"] = color
136
+
137
+ return template
138
+
139
+
140
+ @intercept_session_exceptions
19
141
  class ShowDataModelAPI:
20
142
  def __init__(self, state: SessionState) -> None:
21
143
  self._state = state
22
144
 
23
145
  def __call__(self) -> Any:
146
+ if not self._state.last_verified_dms_rules and not self._state.last_verified_information_rules:
147
+ raise NeatSessionError(
148
+ "No verified data model available. Try using [bold].verify()[/bold] to verify data model."
149
+ )
150
+
24
151
  if self._state.last_verified_dms_rules:
25
- digraph = self._generate_dms_di_graph()
26
- widget = self._generate_widget()
27
- widget.graph.add_graph_from_networkx(digraph)
28
- return display(widget)
152
+ NxGraph = self._generate_dms_di_graph()
153
+ elif self._state.last_verified_information_rules:
154
+ NxGraph = self._generate_info_di_graph()
155
+
156
+ widget = self._generate_widget()
157
+ widget.graph.add_graph_from_networkx(NxGraph)
158
+ return display(widget)
29
159
 
30
160
  def _generate_dms_di_graph(self) -> nx.DiGraph:
31
161
  """Generate a DiGraph from the last verified DMS rules."""
32
- G = nx.DiGraph()
162
+ NxGraph = nx.DiGraph()
33
163
 
34
- nodes, edges = self._generate_dms_rules_nodes_and_edges()
35
- G.add_nodes_from(nodes)
36
- G.add_edges_from(edges)
37
- for node in G.nodes:
38
- G.nodes[node]["label"] = node
39
-
40
- return G
164
+ # Add nodes and edges from Views sheet
165
+ for view in cast(DMSRules, self._state.last_verified_dms_rules).views:
166
+ # if possible use human readable label coming from the view name
167
+ if not NxGraph.has_node(view.view.suffix):
168
+ NxGraph.add_node(view.view.suffix, label=view.name or view.view.suffix)
41
169
 
42
- def _generate_dms_rules_nodes_and_edges(self) -> tuple[list[str], list[tuple[str, str, dict]]]:
43
- """Generate nodes and edges for the last verified DMS rules for DiGraph."""
170
+ # add implements as edges
171
+ if view.implements:
172
+ for implement in view.implements:
173
+ if not NxGraph.has_node(implement.suffix):
174
+ NxGraph.add_node(implement.suffix, label=implement.suffix)
44
175
 
45
- nodes = []
46
- edges = []
176
+ NxGraph.add_edge(view.view.suffix, implement.suffix, label="implements")
47
177
 
178
+ # Add nodes and edges from Properties sheet
48
179
  for prop_ in cast(DMSRules, self._state.last_verified_dms_rules).properties:
49
- nodes.append(prop_.view.suffix)
50
-
51
180
  if prop_.connection and isinstance(prop_.value_type, ViewEntity):
181
+ if not NxGraph.has_node(prop_.view.suffix):
182
+ NxGraph.add_node(prop_.view.suffix, label=prop_.view.suffix)
183
+
52
184
  label = f"{prop_.property_} [{0 if prop_.nullable else 1}..{ '' if prop_.is_list else 1}]"
53
- edges.append((prop_.view.suffix, prop_.value_type.suffix, {"label": label}))
185
+ NxGraph.add_edge(prop_.view.suffix, prop_.value_type.suffix, label=label)
54
186
 
55
- for view in cast(DMSRules, self._state.last_verified_dms_rules).views:
56
- nodes.append(view.view.suffix)
187
+ return NxGraph
57
188
 
58
- if view.implements:
59
- for implement in view.implements:
60
- edges.append((view.view.suffix, implement.suffix, {"label": "implements"}))
189
+ def _generate_info_di_graph(self) -> nx.DiGraph:
190
+ """Generate nodes and edges for the last verified Information rules for DiGraph."""
191
+
192
+ NxGraph = nx.DiGraph()
193
+
194
+ # Add nodes and edges from Views sheet
195
+ for class_ in cast(InformationRules, self._state.last_verified_information_rules).classes:
196
+ # if possible use human readable label coming from the view name
197
+ if not NxGraph.has_node(class_.class_.suffix):
198
+ NxGraph.add_node(
199
+ class_.class_.suffix,
200
+ label=class_.name or class_.class_.suffix,
201
+ )
202
+
203
+ # add implements as edges
204
+ if class_.parent:
205
+ for parent in class_.parent:
206
+ if not NxGraph.has_node(parent.suffix):
207
+ NxGraph.add_node(parent.suffix, label=parent.suffix)
61
208
 
62
- return nodes, edges
209
+ NxGraph.add_edge(class_.class_.suffix, parent.suffix, label="subClassOf")
210
+
211
+ # Add nodes and edges from Properties sheet
212
+ for prop_ in cast(InformationRules, self._state.last_verified_information_rules).properties:
213
+ if prop_.type_ == EntityTypes.object_property:
214
+ if not NxGraph.has_node(prop_.class_.suffix):
215
+ NxGraph.add_node(prop_.class_.suffix, label=prop_.class_.suffix)
216
+
217
+ label = f"{prop_.property_} [{1 if prop_.is_mandatory else 0}..{ '' if prop_.is_list else 1}]"
218
+ NxGraph.add_edge(
219
+ prop_.class_.suffix,
220
+ cast(ClassEntity, prop_.value_type).suffix,
221
+ label=label,
222
+ )
223
+
224
+ return NxGraph
63
225
 
64
226
  def _generate_widget(self):
65
227
  """Generates an empty a CytoscapeWidget."""
66
228
  widget = CytoscapeWidget()
67
- widget.layout.height = "500px"
229
+ widget.layout.height = "700px"
68
230
 
69
231
  widget.set_style(
70
232
  [
@@ -88,6 +250,26 @@ class ShowDataModelAPI:
88
250
  "curve-style": "bezier",
89
251
  "label": "data(label)",
90
252
  "font-size": "8px",
253
+ "line-color": "black",
254
+ "target-arrow-color": "black",
255
+ },
256
+ },
257
+ {
258
+ "selector": 'edge[label = "subClassOf"]',
259
+ "style": {
260
+ "line-color": "grey",
261
+ "target-arrow-color": "grey",
262
+ "line-style": "dashed",
263
+ "font-size": "8px",
264
+ },
265
+ },
266
+ {
267
+ "selector": 'edge[label = "implements"]',
268
+ "style": {
269
+ "line-color": "grey",
270
+ "target-arrow-color": "grey",
271
+ "line-style": "dashed",
272
+ "font-size": "8px",
91
273
  },
92
274
  },
93
275
  ]
@@ -8,8 +8,10 @@ from cognite.neat._rules import exporters
8
8
  from cognite.neat._session._wizard import space_wizard
9
9
 
10
10
  from ._state import SessionState
11
+ from .exceptions import intercept_session_exceptions
11
12
 
12
13
 
14
+ @intercept_session_exceptions
13
15
  class ToAPI:
14
16
  def __init__(self, state: SessionState, client: CogniteClient | None, verbose: bool) -> None:
15
17
  self._state = state
@@ -39,6 +41,7 @@ class ToAPI:
39
41
  return None
40
42
 
41
43
 
44
+ @intercept_session_exceptions
42
45
  class CDFToAPI:
43
46
  def __init__(self, state: SessionState, client: CogniteClient | None, verbose: bool) -> None:
44
47
  self._client = client
@@ -23,6 +23,8 @@ def _intercept_session_exceptions(func: Callable):
23
23
  return func(*args, **kwargs)
24
24
  except NeatSessionError as e:
25
25
  action = func.__name__
26
+ if action == "__call__":
27
+ action = func.__qualname__.removesuffix(".__call__").removesuffix("API")
26
28
  print(f"{_PREFIX} Cannot {action}: {e}")
27
29
 
28
30
  return wrapper
@@ -33,10 +35,11 @@ def intercept_session_exceptions(cls: type):
33
35
  while to_check:
34
36
  cls = to_check.pop()
35
37
  for attr_name in dir(cls):
36
- if not attr_name.startswith("_"):
37
- attr = getattr(cls, attr_name)
38
- if callable(attr):
39
- setattr(cls, attr_name, _intercept_session_exceptions(attr))
40
- elif isinstance(attr, type):
41
- to_check.append(attr)
38
+ if attr_name.startswith("_") and not attr_name == "__call__":
39
+ continue
40
+ attr = getattr(cls, attr_name)
41
+ if callable(attr):
42
+ setattr(cls, attr_name, _intercept_session_exceptions(attr))
43
+ elif isinstance(attr, type):
44
+ to_check.append(attr)
42
45
  return cls
@@ -3,7 +3,7 @@ import warnings
3
3
  from collections.abc import Iterable
4
4
  from datetime import datetime, timezone
5
5
  from pathlib import Path
6
- from typing import Any, cast
6
+ from typing import cast
7
7
 
8
8
  import pandas as pd
9
9
  from pandas import Index
@@ -383,6 +383,6 @@ class NeatGraphStore:
383
383
  ],
384
384
  ignore_index=True,
385
385
  )
386
- shorter_summary.index = cast(Index[Any], indexes)
386
+ shorter_summary.index = cast(Index, indexes)
387
387
 
388
388
  return shorter_summary
cognite/neat/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.93.0"
1
+ __version__ = "0.95.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.93.0
3
+ Version: 0.95.0
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -30,7 +30,7 @@ Requires-Dist: google-auth-oauthlib ; extra == "google"
30
30
  Requires-Dist: gspread ; extra == "google"
31
31
  Requires-Dist: ipycytoscape (>=1.3.3,<2.0.0)
32
32
  Requires-Dist: jinja2 (>=3.1.2,<4.0.0) ; extra == "graphql" or extra == "all"
33
- Requires-Dist: matplotlib (>=3.9.2,<4.0.0)
33
+ Requires-Dist: matplotlib (==3.5.2)
34
34
  Requires-Dist: mkdocs ; extra == "docs"
35
35
  Requires-Dist: mkdocs-autorefs (>=0.5.0,<0.6.0) ; extra == "docs"
36
36
  Requires-Dist: mkdocs-git-authors-plugin ; extra == "docs"
@@ -186,8 +186,8 @@ cognite/neat/_rules/models/asset/_validation.py,sha256=6u86qLlr1ehG1I5kIZhfCYTqU
186
186
  cognite/neat/_rules/models/data_types.py,sha256=ACQjS9vs7EjaNSO8R1kHiiNYbdeVQLCvxJYfZhWF8mM,9620
187
187
  cognite/neat/_rules/models/dms/__init__.py,sha256=CUqUlVjz4yZX_-61F-2ofSoV7N9MlSYx2N7vM-omp7E,640
188
188
  cognite/neat/_rules/models/dms/_exporter.py,sha256=dZAl5439p2K6LsA4yNpwCsEgNsxVkGjcmV9JGL3JAYE,30345
189
- cognite/neat/_rules/models/dms/_rules.py,sha256=8VlGchvUHtBrcaP6DhpkQn6qBgd2zlmeQoakh09axuk,19369
190
- cognite/neat/_rules/models/dms/_rules_input.py,sha256=LgehVseHiKLKfc7Osg3q8n1H64DUIe2iRDayh6Be4io,10919
189
+ cognite/neat/_rules/models/dms/_rules.py,sha256=JCYss9Nqf2tloyZj4gZktaW_45gMCjw7aLf5XeD_kRk,19980
190
+ cognite/neat/_rules/models/dms/_rules_input.py,sha256=MjkkoEa5lRzQE0NUJ7TyQsrelWSoyGCCDFjMVG5pQvc,11530
191
191
  cognite/neat/_rules/models/dms/_schema.py,sha256=HSmSDvOm5S0x4Vb9tH9Jvd5i9tXiiM08E_Sdu6q_iA8,50783
192
192
  cognite/neat/_rules/models/dms/_validation.py,sha256=2KL1_GNnJ5cjsdk9uJTBV691_o8ZehqmgXSiaN5q8aw,15798
193
193
  cognite/neat/_rules/models/domain.py,sha256=HOZ6e6pIWJWWYTTDPDWpuwEHoiUacOdkvjAI81vMdMk,3999
@@ -199,8 +199,8 @@ cognite/neat/_rules/models/entities/_single_value.py,sha256=JLX8t-Uft0qeY_honmv0
199
199
  cognite/neat/_rules/models/entities/_types.py,sha256=df9rnXJJKciv2Bp-Ve2q4xdEJt6WWniq12Z0hW2d6sk,1917
200
200
  cognite/neat/_rules/models/entities/_wrapped.py,sha256=FxC8HztW_tUUtuArAOwxyFfkdJnSEB4bgZoNmmmfiPk,7137
201
201
  cognite/neat/_rules/models/information/__init__.py,sha256=fVvgXt-JuyZCP_mLgIVaeKD9pdAXe2BWUxU_BZs8e5g,480
202
- cognite/neat/_rules/models/information/_rules.py,sha256=myMmtJLJs1nF81Su96wmDTM9-DP7dF-Ezs41RlmqMzk,14869
203
- cognite/neat/_rules/models/information/_rules_input.py,sha256=LqWJM7D4kjPPC3Ok7WbsqwYpbSIk8hQun22JK8gVUFw,5277
202
+ cognite/neat/_rules/models/information/_rules.py,sha256=BXsQvDrtHBrLzLZt9Q9QGHfzW8OeGdJ-M2dT_TcdocE,15370
203
+ cognite/neat/_rules/models/information/_rules_input.py,sha256=c7JPGe0n0srF2LM9x5_5EtMx8-8EPEZ_HDImuR9tV2I,5778
204
204
  cognite/neat/_rules/models/information/_validation.py,sha256=0ntsrXJV28yOFfhhXcKsP9TUr0LwKG_vaYPMHzHbTEI,9252
205
205
  cognite/neat/_rules/models/mapping/__init__.py,sha256=jSn-dCckmVQF0ClSBOBvVacprzNxdhPpdyIlYVajjMY,198
206
206
  cognite/neat/_rules/models/mapping/_base.py,sha256=xDjtbNvDXAh0F93WSvgdwoI_5K9XYu_w9hhG02ZZKtg,5922
@@ -212,17 +212,17 @@ cognite/neat/_rules/transformers/_mapping.py,sha256=RWHKPMaP3JdeCNvoDGu9ZGHxfyeI
212
212
  cognite/neat/_rules/transformers/_pipelines.py,sha256=-E5Hgitnr6ee8R9_3sqtjmWIPJ0w1xaLErG6Fo6ExVU,2603
213
213
  cognite/neat/_rules/transformers/_verification.py,sha256=330I1i3Va7Nau3DK3bTgEEGSHppmLvT-1yBMocDxV1A,4694
214
214
  cognite/neat/_session/__init__.py,sha256=fxQ5URVlUnmEGYyB8Baw7IDq-uYacqkigbc4b-Pr9Fw,58
215
- cognite/neat/_session/_base.py,sha256=9QgOUeizAwG9P7xy5J8zOsRd5cMMkncYgv6PTeWgd_k,3564
216
- cognite/neat/_session/_prepare.py,sha256=u7dJ4nZqB9j6JWoBx6em9ABKc_PA_yaRQWfiI1n3iks,2484
217
- cognite/neat/_session/_read.py,sha256=JQyxG1-QyX8fbiUnwVexKzlgWMg9VUeTJvC0uFgAg_U,4401
218
- cognite/neat/_session/_show.py,sha256=0xzXx8fzM1CWxflWwQK0QYE3KU0ZDJUYL8W5Pg-21b0,3286
215
+ cognite/neat/_session/_base.py,sha256=VSYrKWCgyzV4RL8X7TESNDEdm-LBs6yz6OKl0EfrxxA,3250
216
+ cognite/neat/_session/_prepare.py,sha256=ZG8bJiLbKsQ5iEwPOnl7rr5pRl0cnVXZ0N-nCSLLrA8,2597
217
+ cognite/neat/_session/_read.py,sha256=ONYiNrGmN6G5iKsk30rg4OgddwLnbPBDMQKamNx3XYA,4604
218
+ cognite/neat/_session/_show.py,sha256=VZfgJIfEmU1lwejxcSW5sax0otLsTXi-waBGATfC6gc,10360
219
219
  cognite/neat/_session/_state.py,sha256=ef7OiCxavk4_asIivENaWrvC3HcXZNV6wGldus55JD0,2488
220
- cognite/neat/_session/_to.py,sha256=u--yGD2y9JKV-sf34PYsMf-nc9Qs2yibpPsv6IG0CLA,2125
220
+ cognite/neat/_session/_to.py,sha256=3StR71QNEb8JKW-O2iI3aNTlT-wRRaabDg6dovMHWRw,2238
221
221
  cognite/neat/_session/_wizard.py,sha256=Rdld2eZ-Q5BYbmAwW8FlfAYebdlw_P6L6V2WSDk-dHI,1306
222
- cognite/neat/_session/exceptions.py,sha256=qT0Mq3h-0NaDatvyr2D476LkSjmvyZtNmmLXtd1SLVg,1106
222
+ cognite/neat/_session/exceptions.py,sha256=tVearBcnz7gq0Wn5f7qssCUML_4oxrEvTCj6QnIcCxo,1265
223
223
  cognite/neat/_shared.py,sha256=RSaHm2eJceTlvb-hMMe4nHgoHdPYDfN3XcxDXo24k3A,1530
224
224
  cognite/neat/_store/__init__.py,sha256=G-VG_YwfRt1kuPao07PDJyZ3w_0-eguzLUM13n-Z_RA,64
225
- cognite/neat/_store/_base.py,sha256=W-xcxfmlAUG-7JKcL2JwUuPG5xA4KugHT2x_FdZXJQY,14215
225
+ cognite/neat/_store/_base.py,sha256=xi9uxV12X5XcGW-fzTEeDfaTM6Rkt-KpGaeyLXqep4Q,14205
226
226
  cognite/neat/_store/_provenance.py,sha256=mD14UnETX6YkR8RO60Oxz7vBPm2Dm8m2xwthhLIxqSc,4122
227
227
  cognite/neat/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
228
228
  cognite/neat/_utils/auth.py,sha256=hyDnVBUbbgVANzayxbh9uTWlYb924hmzPYkVwwLfDIg,13241
@@ -240,7 +240,7 @@ cognite/neat/_utils/text.py,sha256=PvTEsEjaTu8SE8yYaKUrce4msboMj933dK7-0Eey_rE,3
240
240
  cognite/neat/_utils/time_.py,sha256=O30LUiDH9TdOYz8_a9pFqTtJdg8vEjC3qHCk8xZblG8,345
241
241
  cognite/neat/_utils/upload.py,sha256=X5GGWHswnW0BrL2ulmm5MnKKtn-t1C8Ps3gb9Byc914,4016
242
242
  cognite/neat/_utils/xml_.py,sha256=FQkq84u35MUsnKcL6nTMJ9ajtG9D5i1u4VBnhGqP2DQ,1710
243
- cognite/neat/_version.py,sha256=W-KEJT0wpRrG8XJ2aDG4NSyzaUucgZR9y6mwfCTlku4,23
243
+ cognite/neat/_version.py,sha256=1KBvo1_4ig2ZeMfCvFApYtfDll8Ysfu6h45ByRERz1E,23
244
244
  cognite/neat/_workflows/__init__.py,sha256=S0fZq7kvoqDKodHu1UIPsqcpdvXoefUWRPt1lqeQkQs,420
245
245
  cognite/neat/_workflows/base.py,sha256=O1pcmfbme2gIVF2eOGrKZSUDmhZc8L9rI8UfvLN2YAM,26839
246
246
  cognite/neat/_workflows/cdf_store.py,sha256=3pebnATPo6In4-1srpa3wzstynTOi3T6hwFX5uaie4c,18050
@@ -269,8 +269,8 @@ cognite/neat/_workflows/tasks.py,sha256=dr2xuIb8P5e5e9p_fjzRlvDbKsre2xGYrkc3wnRx
269
269
  cognite/neat/_workflows/triggers.py,sha256=u69xOsaTtM8_WD6ZeIIBB-XKwvlZmPHAsZQh_TnyHcM,7073
270
270
  cognite/neat/_workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
271
271
  cognite/neat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
- cognite_neat-0.93.0.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
273
- cognite_neat-0.93.0.dist-info/METADATA,sha256=7LtcqYVhejVdcOylDNH0joitMI2PEGd-Dn6JJkKVDuQ,9668
274
- cognite_neat-0.93.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
275
- cognite_neat-0.93.0.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
276
- cognite_neat-0.93.0.dist-info/RECORD,,
272
+ cognite_neat-0.95.0.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
273
+ cognite_neat-0.95.0.dist-info/METADATA,sha256=GGSZ4F6EOmFOFIn6ondR3nEJeOe1LLWolqm48mR4wis,9661
274
+ cognite_neat-0.95.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
275
+ cognite_neat-0.95.0.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
276
+ cognite_neat-0.95.0.dist-info/RECORD,,