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

@@ -6,7 +6,7 @@ from typing import ClassVar, Generic, TypeVar
6
6
  from cognite.client import CogniteClient
7
7
  from cognite.client.data_classes.capabilities import Capability
8
8
 
9
- from cognite.neat._issues import IssueList, NeatIssue, NeatIssueList
9
+ from cognite.neat._issues import IssueList, NeatIssue
10
10
  from cognite.neat._issues.errors import AuthorizationError
11
11
  from cognite.neat._store import NeatGraphStore
12
12
  from cognite.neat._utils.auxiliary import class_html_doc
@@ -94,6 +94,6 @@ class CDFLoader(BaseLoader[T_Output]):
94
94
  client: CogniteClient,
95
95
  items: list[T_Output],
96
96
  dry_run: bool,
97
- read_issues: NeatIssueList,
97
+ read_issues: IssueList,
98
98
  ) -> Iterable[UploadResult]:
99
99
  raise NotImplementedError
@@ -19,7 +19,7 @@ from cognite.client.exceptions import CogniteAPIError, CogniteDuplicatedError
19
19
 
20
20
  from cognite.neat._graph._tracking.base import Tracker
21
21
  from cognite.neat._graph._tracking.log import LogTracker
22
- from cognite.neat._issues import IssueList, NeatError, NeatIssue, NeatIssueList
22
+ from cognite.neat._issues import IssueList, NeatError, NeatIssue
23
23
  from cognite.neat._issues.errors import ResourceCreationError, ResourceNotFoundError
24
24
  from cognite.neat._rules._constants import EntityTypes
25
25
  from cognite.neat._rules.analysis._asset import AssetAnalysis
@@ -283,7 +283,7 @@ class AssetLoader(CDFLoader[AssetWrite]):
283
283
  client: CogniteClient,
284
284
  items: list[AssetWrite] | list[RelationshipWrite] | list[LabelDefinitionWrite],
285
285
  dry_run: bool,
286
- read_issues: NeatIssueList,
286
+ read_issues: IssueList,
287
287
  ) -> Iterable[UploadResult]:
288
288
  if isinstance(items[0], AssetWrite) and all(isinstance(item, AssetWrite) for item in items):
289
289
  yield from self._upload_assets_to_cdf(client, cast(list[AssetWrite], items), dry_run, read_issues)
@@ -303,7 +303,7 @@ class AssetLoader(CDFLoader[AssetWrite]):
303
303
  client: CogniteClient,
304
304
  items: list[LabelDefinitionWrite],
305
305
  dry_run: bool,
306
- read_issues: NeatIssueList,
306
+ read_issues: IssueList,
307
307
  ) -> Iterable[UploadResult]:
308
308
  try:
309
309
  created = client.labels.create(items)
@@ -324,7 +324,7 @@ class AssetLoader(CDFLoader[AssetWrite]):
324
324
  client: CogniteClient,
325
325
  items: list[AssetWrite],
326
326
  dry_run: bool,
327
- read_issues: NeatIssueList,
327
+ read_issues: IssueList,
328
328
  ) -> Iterable[UploadResult]:
329
329
  try:
330
330
  upserted = client.assets.upsert(items, mode="replace")
@@ -345,7 +345,7 @@ class AssetLoader(CDFLoader[AssetWrite]):
345
345
  client: CogniteClient,
346
346
  items: list[RelationshipWrite],
347
347
  dry_run: bool,
348
- read_issues: NeatIssueList,
348
+ read_issues: IssueList,
349
349
  ) -> Iterable[UploadResult]:
350
350
  try:
351
351
  upserted = client.relationships.upsert(items, mode="replace")
@@ -293,7 +293,7 @@ class DMSLoader(CDFLoader[dm.InstanceApply]):
293
293
  client: CogniteClient,
294
294
  items: list[dm.InstanceApply],
295
295
  dry_run: bool,
296
- read_issues: NeatIssueList,
296
+ read_issues: IssueList,
297
297
  ) -> Iterable[UploadResult]:
298
298
  try:
299
299
  nodes = [item for item in items if isinstance(item, dm.NodeApply)]
@@ -1,7 +1,16 @@
1
1
  """This is module contains all the Neat Exceptions (Errors) and Warnings as well
2
2
  as some helper classes to handle them like NeatIssueList"""
3
3
 
4
- from ._base import DefaultWarning, IssueList, MultiValueError, NeatError, NeatIssue, NeatIssueList, NeatWarning
4
+ from ._base import (
5
+ DefaultWarning,
6
+ IssueList,
7
+ MultiValueError,
8
+ NeatError,
9
+ NeatIssue,
10
+ NeatIssueList,
11
+ NeatWarning,
12
+ catch_warnings,
13
+ )
5
14
 
6
15
  __all__ = [
7
16
  "NeatIssue",
@@ -11,4 +20,5 @@ __all__ = [
11
20
  "NeatIssueList",
12
21
  "IssueList",
13
22
  "MultiValueError",
23
+ "catch_warnings",
14
24
  ]
@@ -2,7 +2,8 @@ import inspect
2
2
  import sys
3
3
  import warnings
4
4
  from abc import ABC
5
- from collections.abc import Collection, Hashable, Iterable, Sequence
5
+ from collections.abc import Collection, Hashable, Iterable, Iterator, Sequence
6
+ from contextlib import contextmanager
6
7
  from dataclasses import dataclass, fields
7
8
  from functools import total_ordering
8
9
  from pathlib import Path
@@ -371,9 +372,12 @@ T_NeatIssue = TypeVar("T_NeatIssue", bound=NeatIssue)
371
372
  class NeatIssueList(list, Sequence[T_NeatIssue], ABC):
372
373
  """This is a generic list of NeatIssues."""
373
374
 
374
- def __init__(self, issues: Sequence[T_NeatIssue] | None = None, title: str | None = None):
375
+ def __init__(
376
+ self, issues: Sequence[T_NeatIssue] | None = None, title: str | None = None, action: str | None = None
377
+ ):
375
378
  super().__init__(issues or [])
376
379
  self.title = title
380
+ self.action = action
377
381
 
378
382
  @property
379
383
  def errors(self) -> Self:
@@ -450,3 +454,18 @@ def _get_subclasses(cls_: type[T_Cls], include_base: bool = False) -> Iterable[t
450
454
  for s in cls_.__subclasses__():
451
455
  yield s
452
456
  yield from _get_subclasses(s, False)
457
+
458
+
459
+ @contextmanager
460
+ def catch_warnings(
461
+ issues: IssueList | None = None,
462
+ warning_cls: type[NeatWarning] = DefaultWarning,
463
+ ) -> Iterator[None]:
464
+ """Catch warnings and append them to the issues list."""
465
+ with warnings.catch_warnings(record=True) as warning_logger:
466
+ warnings.simplefilter("always")
467
+ try:
468
+ yield None
469
+ finally:
470
+ if warning_logger and issues is not None:
471
+ issues.extend([warning_cls.from_warning(warning) for warning in warning_logger]) # type: ignore[misc]
@@ -231,7 +231,9 @@ class DMSProperty(SheetRow):
231
231
  @field_serializer("connection", when_used="unless-none")
232
232
  def remove_defaults(self, value: Any, info: SerializationInfo) -> str:
233
233
  if isinstance(value, Entity) and (metadata := _metadata(info.context)):
234
- default_type = f"{metadata.space}{self.view.external_id}.{self.view_property}"
234
+ default_type = f"{self.view.external_id}.{self.view_property}"
235
+ if isinstance(value, EdgeEntity) and value.edge_type and value.edge_type.space != metadata.space:
236
+ default_type = f"{metadata.space}{default_type}"
235
237
  return value.dump(space=metadata.space, version=metadata.version, type=default_type)
236
238
  return str(value)
237
239
 
@@ -187,10 +187,10 @@ class Entity(BaseModel, extra="ignore"):
187
187
  }
188
188
  if isinstance(defaults, dict):
189
189
  for key, value in defaults.items():
190
- if key in model_dump and value == defaults.get(key):
190
+ if key in model_dump and model_dump[key] == value:
191
191
  del model_dump[key]
192
-
193
- args = ",".join(f"{k}={v}" for k, v in model_dump.items())
192
+ # Sorting to ensure deterministic order
193
+ args = ",".join(f"{k}={v}" for k, v in sorted(model_dump.items(), key=lambda x: x[0]))
194
194
  if self.prefix == Undefined or (isinstance(defaults, dict) and self.prefix == defaults.get("prefix")):
195
195
  base_id = str(self.suffix)
196
196
  else:
@@ -1,4 +1,3 @@
1
- import warnings
2
1
  from abc import ABC
3
2
  from collections.abc import Iterator
4
3
  from contextlib import contextmanager
@@ -6,7 +5,7 @@ from typing import Any, Literal
6
5
 
7
6
  from pydantic import ValidationError
8
7
 
9
- from cognite.neat._issues import IssueList, MultiValueError, NeatError, NeatWarning
8
+ from cognite.neat._issues import IssueList, MultiValueError, NeatError, NeatWarning, catch_warnings
10
9
  from cognite.neat._issues.errors import NeatTypeError
11
10
  from cognite.neat._rules._shared import (
12
11
  InputRules,
@@ -46,7 +45,7 @@ class VerificationTransformer(RulesTransformer[T_InputRules, T_VerifiedRules], A
46
45
  if isinstance(rules, ReadRules):
47
46
  error_args = rules.read_context
48
47
  verified_rules: T_VerifiedRules | None = None
49
- with _handle_issues(issues, NeatError, NeatWarning, error_args) as future:
48
+ with _catch_issues(issues, NeatError, NeatWarning, error_args) as future:
50
49
  rules_cls = self._get_rules_cls(in_)
51
50
  verified_rules = rules_cls.model_validate(in_.dump()) # type: ignore[assignment]
52
51
 
@@ -105,7 +104,7 @@ class _FutureResult:
105
104
 
106
105
 
107
106
  @contextmanager
108
- def _handle_issues(
107
+ def _catch_issues(
109
108
  issues: IssueList,
110
109
  error_cls: type[NeatError] = NeatError,
111
110
  warning_cls: type[NeatWarning] = NeatWarning,
@@ -121,8 +120,7 @@ def _handle_issues(
121
120
  Returns:
122
121
  FutureResult: A future result object that can be used to check the result of the context manager.
123
122
  """
124
- with warnings.catch_warnings(record=True) as warning_logger:
125
- warnings.simplefilter("always")
123
+ with catch_warnings(issues, warning_cls):
126
124
  future_result = _FutureResult()
127
125
  try:
128
126
  yield future_result
@@ -137,6 +135,3 @@ def _handle_issues(
137
135
  future_result._result = "failure"
138
136
  else:
139
137
  future_result._result = "success"
140
- finally:
141
- if warning_logger:
142
- issues.extend([warning_cls.from_warning(warning) for warning in warning_logger]) # type: ignore[misc]
@@ -53,6 +53,7 @@ class NeatSession:
53
53
  self._state.verified_rules.append(output.rules)
54
54
  if isinstance(output.rules, InformationRules):
55
55
  self._state.store.add_rules(output.rules)
56
+ output.issues.action = "verify"
56
57
  self._state.issue_lists.append(output.issues)
57
58
  if output.issues:
58
59
  print("You can inspect the issues with the .inspect.issues(...) method.")
@@ -5,6 +5,7 @@ import pandas as pd
5
5
 
6
6
  from cognite.neat._constants import IN_NOTEBOOK
7
7
  from cognite.neat._issues import IssueList
8
+ from cognite.neat._utils.upload import UploadResult, UploadResultCore, UploadResultList
8
9
 
9
10
  from ._state import SessionState
10
11
  from .exceptions import intercept_session_exceptions
@@ -15,6 +16,7 @@ class InspectAPI:
15
16
  def __init__(self, state: SessionState) -> None:
16
17
  self._state = state
17
18
  self.issues = InspectIssues(state)
19
+ self.outcome = InspectOutcome(state)
18
20
 
19
21
  @property
20
22
  def properties(self) -> pd.DataFrame:
@@ -87,3 +89,89 @@ class InspectIssues:
87
89
  "Inspect issues by calling .inspect.issues() or "
88
90
  "search for specific issues by calling .inspect.issues('MyTypeWarning')."
89
91
  )
92
+
93
+
94
+ @intercept_session_exceptions
95
+ class InspectOutcome:
96
+ def __init__(self, state: SessionState) -> None:
97
+ self._state = state
98
+
99
+ @staticmethod
100
+ def _as_set(value: str | list[str] | None) -> set[str] | None:
101
+ if value is None:
102
+ return None
103
+ if isinstance(value, str):
104
+ return {value}
105
+ return set(value)
106
+
107
+ @overload
108
+ def __call__(
109
+ self,
110
+ name: str | list[str] | None = None,
111
+ has_errors: bool = False,
112
+ has_issues: bool = False,
113
+ return_dataframe: Literal[False] = (False if IN_NOTEBOOK else True), # type: ignore[assignment]
114
+ ) -> None: ...
115
+
116
+ @overload
117
+ def __call__(
118
+ self,
119
+ name: str | list[str] | None = None,
120
+ has_errors: bool = False,
121
+ has_issues: bool = False,
122
+ return_dataframe: Literal[True] = (False if IN_NOTEBOOK else True), # type: ignore[assignment]
123
+ ) -> pd.DataFrame: ...
124
+
125
+ def __call__(
126
+ self,
127
+ name: str | list[str] | None = None,
128
+ has_errors: bool = False,
129
+ has_issues: bool = False,
130
+ return_dataframe: bool = (False if IN_NOTEBOOK else True), # type: ignore[assignment]
131
+ ) -> pd.DataFrame | None:
132
+ """Returns the outcome of the last upload."""
133
+ outcome = self._state.last_outcome
134
+ name_set = self._as_set(name)
135
+
136
+ def outcome_filter(item: UploadResultCore) -> bool:
137
+ nonlocal name_set
138
+ if name_set and item.name not in name_set:
139
+ return False
140
+ if has_errors and not item.error_messages:
141
+ return False
142
+ if has_issues and not item.issues:
143
+ return False
144
+ return True
145
+
146
+ outcome = UploadResultList([item for item in outcome if outcome_filter(item)])
147
+ if IN_NOTEBOOK:
148
+ from IPython.display import Markdown, display
149
+
150
+ lines: list[str] = []
151
+ for item in outcome:
152
+ lines.append(f"### {item.name}")
153
+ if unique_errors := set(item.error_messages):
154
+ lines.append("#### Errors")
155
+ for error in unique_errors:
156
+ lines.append(f" * {error}")
157
+ if unique_issue_messages := set([issue.as_message() for issue in item.issues]):
158
+ lines.append("#### Issues")
159
+ for issue in unique_issue_messages:
160
+ lines.append(f" * {issue}")
161
+ if isinstance(item, UploadResult):
162
+ dumped = item.dump(aggregate=False)
163
+ for key, value in dumped.items():
164
+ if key in ["name", "error_messages", "issues"]:
165
+ continue
166
+ lines.append(f"#### {key}")
167
+ if isinstance(value, list):
168
+ for v in value:
169
+ lines.append(f" * {v}")
170
+ else:
171
+ lines.append(f" * {value}")
172
+
173
+ display(Markdown("\n".join(lines)))
174
+
175
+ if return_dataframe:
176
+ return outcome.to_pandas()
177
+ return None
@@ -7,6 +7,7 @@ from cognite.neat._rules.models.dms._rules import DMSRules
7
7
  from cognite.neat._rules.models.information._rules import InformationRules
8
8
  from cognite.neat._rules.models.information._rules_input import InformationInputRules
9
9
  from cognite.neat._store import NeatGraphStore
10
+ from cognite.neat._utils.upload import UploadResultList
10
11
 
11
12
  from .exceptions import NeatSessionError
12
13
 
@@ -17,6 +18,7 @@ class SessionState:
17
18
  input_rules: list[ReadRules] = field(default_factory=list)
18
19
  verified_rules: list[VerifiedRules] = field(default_factory=list)
19
20
  issue_lists: list[IssueList] = field(default_factory=list)
21
+ outcome: list[UploadResultList] = field(default_factory=list)
20
22
  _store: NeatGraphStore | None = field(init=False, default=None)
21
23
 
22
24
  @property
@@ -34,6 +36,14 @@ class SessionState:
34
36
  raise NeatSessionError("No input data model available. Try using [bold].read[/bold] to load a data model.")
35
37
  return self.input_rules[-1]
36
38
 
39
+ @property
40
+ def last_outcome(self) -> UploadResultList:
41
+ if not self.outcome:
42
+ raise NeatSessionError(
43
+ "No outcome available. Try using [bold].to.cdf[/bold] to upload a data model/instances."
44
+ )
45
+ return self.outcome[-1]
46
+
37
47
  @property
38
48
  def information_input_rule(self) -> ReadRules | None:
39
49
  if self.input_rules:
@@ -4,8 +4,10 @@ from typing import Any, Literal, overload
4
4
  from cognite.client import CogniteClient
5
5
 
6
6
  from cognite.neat._graph import loaders
7
+ from cognite.neat._issues import IssueList, catch_warnings
7
8
  from cognite.neat._rules import exporters
8
9
  from cognite.neat._session._wizard import space_wizard
10
+ from cognite.neat._utils.upload import UploadResultCore
9
11
 
10
12
  from ._state import SessionState
11
13
  from .exceptions import intercept_session_exceptions
@@ -61,11 +63,19 @@ class CDFToAPI:
61
63
 
62
64
  return loader.load_into_cdf(self._client)
63
65
 
64
- def data_model(self, existing_handling: Literal["fail", "skip", "update", "force"] = "skip"):
66
+ def data_model(self, existing_handling: Literal["fail", "skip", "update", "force"] = "skip", dry_run: bool = False):
65
67
  """Export the verified DMS data model to CDF.
66
68
 
67
69
  Args:
68
70
  existing_handling: How to handle if component of data model exists. Defaults to "skip".
71
+ dry_run: If True, no changes will be made to CDF. Defaults to False.
72
+
73
+ ... note::
74
+
75
+ - "fail": If any component already exists, the export will fail.
76
+ - "skip": If any component already exists, it will be skipped.
77
+ - "update": If any component already exists, it will be updated.
78
+ - "force": If any component already exists, it will be deleted and recreated.
69
79
 
70
80
  """
71
81
  if not self._state.last_verified_dms_rules:
@@ -76,4 +86,10 @@ class CDFToAPI:
76
86
  if not self._client:
77
87
  raise ValueError("No client provided!")
78
88
 
79
- return exporter.export_to_cdf(self._state.last_verified_dms_rules, self._client)
89
+ conversion_issues = IssueList(action="to.cdf.data_model")
90
+ with catch_warnings(conversion_issues):
91
+ result = exporter.export_to_cdf(self._state.last_verified_dms_rules, self._client, dry_run)
92
+ result.insert(0, UploadResultCore(name="schema", issues=conversion_issues))
93
+ self._state.outcome.append(result)
94
+ print("You can inspect the details with the .inspect.outcome(...) method.")
95
+ return result
@@ -3,7 +3,7 @@ from dataclasses import dataclass, field
3
3
  from functools import total_ordering
4
4
  from typing import Any, Generic
5
5
 
6
- from cognite.neat._issues import NeatIssueList
6
+ from cognite.neat._issues import IssueList
7
7
  from cognite.neat._shared import T_ID, NeatList, NeatObject
8
8
 
9
9
 
@@ -12,7 +12,7 @@ from cognite.neat._shared import T_ID, NeatList, NeatObject
12
12
  class UploadResultCore(NeatObject, ABC):
13
13
  name: str
14
14
  error_messages: list[str] = field(default_factory=list)
15
- issues: NeatIssueList = field(default_factory=NeatIssueList)
15
+ issues: IssueList = field(default_factory=IssueList)
16
16
 
17
17
  def __lt__(self, other: object) -> bool:
18
18
  if isinstance(other, UploadResultCore):
@@ -27,10 +27,19 @@ class UploadResultCore(NeatObject, ABC):
27
27
  return NotImplemented
28
28
 
29
29
  def dump(self, aggregate: bool = True) -> dict[str, Any]:
30
- return {"name": self.name}
30
+ output: dict[str, Any] = {"name": self.name}
31
+ if self.error_messages:
32
+ output["error_messages"] = len(self.error_messages) if aggregate else self.error_messages
33
+ if self.issues:
34
+ output["issues"] = len(self.issues) if aggregate else [issue.dump() for issue in self.issues]
35
+ return output
31
36
 
32
37
 
33
- class UploadResultList(NeatList[UploadResultCore]): ...
38
+ class UploadResultList(NeatList[UploadResultCore]):
39
+ def _repr_html_(self) -> str:
40
+ df = self.to_pandas().fillna(0)
41
+ df = df.style.format({column: "{:,.0f}".format for column in df.select_dtypes(include="number").columns})
42
+ return df._repr_html_() # type: ignore[attr-defined]
34
43
 
35
44
 
36
45
  @dataclass
@@ -85,10 +94,12 @@ class UploadResult(UploadResultCore, Generic[T_ID]):
85
94
  output["failed_changed"] = len(self.failed_changed) if aggregate else list(self.failed_changed)
86
95
  if self.failed_deleted:
87
96
  output["failed_deleted"] = len(self.failed_deleted) if aggregate else list(self.failed_deleted)
88
- if self.error_messages:
89
- output["error_messages"] = len(self.error_messages) if aggregate else self.error_messages
90
- if self.issues:
91
- output["issues"] = len(self.issues) if aggregate else [issue.dump() for issue in self.issues]
97
+ if "error_messages" in output:
98
+ # Trick to move error_messages to the end of the dict
99
+ output["error_messages"] = output.pop("error_messages")
100
+ if "issues" in output:
101
+ # Trick to move issues to the end of the dict
102
+ output["issues"] = output.pop("issues")
92
103
  return output
93
104
 
94
105
  def __str__(self) -> str:
cognite/neat/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.96.2"
1
+ __version__ = "0.96.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.96.2
3
+ Version: 0.96.4
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -101,9 +101,9 @@ cognite/neat/_graph/extractors/_iodd.py,sha256=LNVkYOT1sqCz-fOqha3nsqLwjFWxgswVx
101
101
  cognite/neat/_graph/extractors/_mock_graph_generator.py,sha256=7ijAJniloWGMuldc-UsKZWxcXBV_OF-3o6v2RImzTW4,15415
102
102
  cognite/neat/_graph/extractors/_rdf_file.py,sha256=NknGs_sV183ZgY4BhxceikPPogwuoq0YA7QVoKSp6aY,1694
103
103
  cognite/neat/_graph/loaders/__init__.py,sha256=TbeJqifd16JLOglPVNOeb6pN_w060UYag50KquBM_r0,769
104
- cognite/neat/_graph/loaders/_base.py,sha256=6ZuJutmZSveGIpkBxd5k3tDvCBDY42JyZ98vEe_T84Q,3619
105
- cognite/neat/_graph/loaders/_rdf2asset.py,sha256=QJE4HfDedOmvaXKUxm0RkuZeEqWUsgNuDrOQx--fvz8,17556
106
- cognite/neat/_graph/loaders/_rdf2dms.py,sha256=kEB0mO27JSYycdJVzbSiCuIhp-YWek4hzIznWULT0_M,14987
104
+ cognite/neat/_graph/loaders/_base.py,sha256=ms_nntW7RKhO751yS2w9-zGIoAYDRecY9-RaE6Krrcw,3600
105
+ cognite/neat/_graph/loaders/_rdf2asset.py,sha256=OMfTVbVEx6yAUlds7c2mVcgnBV0Cq5DiQ7joW3-yy0Y,17525
106
+ cognite/neat/_graph/loaders/_rdf2dms.py,sha256=vJrigNekbxHM8IPctwgWAd26xvMsLAqrhJcowYaAjFw,14983
107
107
  cognite/neat/_graph/models.py,sha256=Z9aj825ZS_BCU6rwekyxKq7LL0QMh6i0DXGp7QQf_D4,182
108
108
  cognite/neat/_graph/queries/__init__.py,sha256=BgDd-037kvtWwAoGAy8eORVNMiZ5-E9sIV0txIpeaN4,50
109
109
  cognite/neat/_graph/queries/_base.py,sha256=2vXS9OcACLF__tyVM5WoaAo9-446tA4A6Xw1aL0h3js,12720
@@ -116,8 +116,8 @@ cognite/neat/_graph/transformers/_iodd.py,sha256=yH-BvVQUswM8RmV2VvOPQAgwudhBJdx
116
116
  cognite/neat/_graph/transformers/_prune_graph.py,sha256=fWZ4sMBf3XqoYC5nOU75Gl6XwscRe-wGYT-GiBFmcK8,5277
117
117
  cognite/neat/_graph/transformers/_rdfpath.py,sha256=a-KoFecFXcEAJoa8MgyNtBBARC6bW9Q5eUfp5YOdGfU,1864
118
118
  cognite/neat/_graph/transformers/_value_type.py,sha256=JorH-AgDXVZUkG_GCcwn51Mw0M2WIOV834t0kF_Nwvo,2614
119
- cognite/neat/_issues/__init__.py,sha256=KkBEO-0Lg3vdvjrQtxKR6Wy2iV2mooc9utSO8-_9UuI,405
120
- cognite/neat/_issues/_base.py,sha256=AYe0QXxbYgt1mGyS-1YUHQT4b0qx6QmMXyvGPNSX9Vs,16755
119
+ cognite/neat/_issues/__init__.py,sha256=BZu2sZ6SiAbvyzH4yGz87pAiVFpextgQCTPUx_Zti9E,480
120
+ cognite/neat/_issues/_base.py,sha256=EyJU2CtxH_ia8bcIBbW1uDYC8JR4h2iyFwHlGRLpl6U,17414
121
121
  cognite/neat/_issues/errors/__init__.py,sha256=0_rzFJa_fpF_OFyv1BTWm2Gejf-r3f-vuko5_hJ58-M,2078
122
122
  cognite/neat/_issues/errors/_external.py,sha256=AuV2PyJcGjYxEnuwmi3zfYWPCF-yr4w39Uy0lQpeoqo,1619
123
123
  cognite/neat/_issues/errors/_general.py,sha256=Afsp2OpP8lb5J9JrEDLlBWtU36Mx9AxtKaDxTFqRVKs,808
@@ -186,7 +186,7 @@ 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=u9lLHwa6DUsh-xlaSbuU1YV5-xvbXObAocWvsRphGfc,29438
189
- cognite/neat/_rules/models/dms/_rules.py,sha256=JCYss9Nqf2tloyZj4gZktaW_45gMCjw7aLf5XeD_kRk,19980
189
+ cognite/neat/_rules/models/dms/_rules.py,sha256=k0jCcfndWCJeBoA31wr2wBNCZkboEiAPbCfIreNo9vU,20139
190
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
@@ -195,7 +195,7 @@ cognite/neat/_rules/models/entities/__init__.py,sha256=QD-h79HhjqCsgscNU5kuf1ieR
195
195
  cognite/neat/_rules/models/entities/_constants.py,sha256=ToiLaaF-hGLPfn3AsKIIrfB4ZdTk4cY1RjM9gA1Qjkg,288
196
196
  cognite/neat/_rules/models/entities/_loaders.py,sha256=mb_iKnwGn1FOa4bcqIuvh4oy5tuUpOWF6pFOOB_9ndE,2693
197
197
  cognite/neat/_rules/models/entities/_multi_value.py,sha256=5RgZBrJfw7VSE-6F50-Lqtio_xVo4vbezKmoyiDdcw8,2692
198
- cognite/neat/_rules/models/entities/_single_value.py,sha256=JLX8t-Uft0qeY_honmv0GbIip59gtBvsaPQ9oNfZJis,17416
198
+ cognite/neat/_rules/models/entities/_single_value.py,sha256=tRu5jmCPnN35qxt0iJEVz_THcDUW6hShNCN_8DbREBE,17489
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
@@ -210,16 +210,16 @@ cognite/neat/_rules/transformers/_base.py,sha256=Q0cwHzFBxRp6srX7HFAvGzzIoQb07gW
210
210
  cognite/neat/_rules/transformers/_converters.py,sha256=rKWyNB_z0osidlTWjU7uq4pt-KAMhoo-nn-oPxFrKmI,42127
211
211
  cognite/neat/_rules/transformers/_mapping.py,sha256=RWHKPMaP3JdeCNvoDGu9ZGHxfyeIgapYEBRoargnd2Q,6797
212
212
  cognite/neat/_rules/transformers/_pipelines.py,sha256=-E5Hgitnr6ee8R9_3sqtjmWIPJ0w1xaLErG6Fo6ExVU,2603
213
- cognite/neat/_rules/transformers/_verification.py,sha256=330I1i3Va7Nau3DK3bTgEEGSHppmLvT-1yBMocDxV1A,4694
213
+ cognite/neat/_rules/transformers/_verification.py,sha256=Jdy9dpjVxu5Hz__4phXU-44fWbKvL0vLWaq4gm5dVI8,4466
214
214
  cognite/neat/_session/__init__.py,sha256=fxQ5URVlUnmEGYyB8Baw7IDq-uYacqkigbc4b-Pr9Fw,58
215
- cognite/neat/_session/_base.py,sha256=b4hEcSde7n8_bW3DQ8sdRTo77O5GI5RWEuZ4QbkMOgA,4596
216
- cognite/neat/_session/_inspect.py,sha256=bucP5w2LKhmzijT222Nm6t0JOZ9K0qOFbK94mCJOTGo,2809
215
+ cognite/neat/_session/_base.py,sha256=KGWzIRMCiIFcsOZwd41_mwzFKgSMNhOcqC0vTpZeG_A,4636
216
+ cognite/neat/_session/_inspect.py,sha256=NEekn2OGJeWNqVZ6cbUKKc7eB2tP8hZvuvlhIR_5Ays,6092
217
217
  cognite/neat/_session/_prepare.py,sha256=6mtJ6OkslSxWhe-xOIB569ml1RHeFUktuFWhrKzZ6Q8,4940
218
218
  cognite/neat/_session/_read.py,sha256=XVfns7ItV41znQQfEYLGi_U3eB2BtnIhkNXtcXte5b4,5563
219
219
  cognite/neat/_session/_set.py,sha256=DRvM5xAJLSs5DibdXFqs1h7yyepXSnHUwcPtfdsmx2w,874
220
220
  cognite/neat/_session/_show.py,sha256=eeS0XRaPtY3GzELWcAQEvQkuMqO706Fcbqgvmt94lFg,8506
221
- cognite/neat/_session/_state.py,sha256=U3zPbKvTDAz7rd1yXdkWayY1p_5FJ6-0DIEw6fTD_vA,3292
222
- cognite/neat/_session/_to.py,sha256=wz43PLhAR7FCntrhrIFr4e2jXhm9VKT7Qum3_IuELno,2536
221
+ cognite/neat/_session/_state.py,sha256=5IkEdFuPv_DfaZHY_q21YATg2XOgT-0G0TQEDr1hrsI,3693
222
+ cognite/neat/_session/_to.py,sha256=fEWgqnq62-4nd5UC0hFj8xGCj2gR1v66FuuzG8xVBuo,3441
223
223
  cognite/neat/_session/_wizard.py,sha256=Rdld2eZ-Q5BYbmAwW8FlfAYebdlw_P6L6V2WSDk-dHI,1306
224
224
  cognite/neat/_session/exceptions.py,sha256=tVearBcnz7gq0Wn5f7qssCUML_4oxrEvTCj6QnIcCxo,1265
225
225
  cognite/neat/_shared.py,sha256=RSaHm2eJceTlvb-hMMe4nHgoHdPYDfN3XcxDXo24k3A,1530
@@ -240,9 +240,9 @@ cognite/neat/_utils/rdf_.py,sha256=VXDBQUt86vRntiGhejK35PlsbvKCUkuQQa1cMYz4SIc,5
240
240
  cognite/neat/_utils/spreadsheet.py,sha256=LI0c7dlW0zXHkHw0NvB-gg6Df6cDcE3FbiaHBYLXdzQ,2714
241
241
  cognite/neat/_utils/text.py,sha256=PvTEsEjaTu8SE8yYaKUrce4msboMj933dK7-0Eey_rE,3652
242
242
  cognite/neat/_utils/time_.py,sha256=O30LUiDH9TdOYz8_a9pFqTtJdg8vEjC3qHCk8xZblG8,345
243
- cognite/neat/_utils/upload.py,sha256=X5GGWHswnW0BrL2ulmm5MnKKtn-t1C8Ps3gb9Byc914,4016
243
+ cognite/neat/_utils/upload.py,sha256=qd8NA46fMvhCIDh66WNj8MiXv1ewDiFjvy59pSFkmG0,4604
244
244
  cognite/neat/_utils/xml_.py,sha256=FQkq84u35MUsnKcL6nTMJ9ajtG9D5i1u4VBnhGqP2DQ,1710
245
- cognite/neat/_version.py,sha256=h03CgwGcpDkIDSAlWJ_jyHT6Sh8R1n3OUcU2J2058f0,23
245
+ cognite/neat/_version.py,sha256=-WRL9Kr5U8AJBJFauUkNo0TydWNSEsmomFHBDvlk0Uk,23
246
246
  cognite/neat/_workflows/__init__.py,sha256=S0fZq7kvoqDKodHu1UIPsqcpdvXoefUWRPt1lqeQkQs,420
247
247
  cognite/neat/_workflows/base.py,sha256=O1pcmfbme2gIVF2eOGrKZSUDmhZc8L9rI8UfvLN2YAM,26839
248
248
  cognite/neat/_workflows/cdf_store.py,sha256=3pebnATPo6In4-1srpa3wzstynTOi3T6hwFX5uaie4c,18050
@@ -271,8 +271,8 @@ cognite/neat/_workflows/tasks.py,sha256=dr2xuIb8P5e5e9p_fjzRlvDbKsre2xGYrkc3wnRx
271
271
  cognite/neat/_workflows/triggers.py,sha256=u69xOsaTtM8_WD6ZeIIBB-XKwvlZmPHAsZQh_TnyHcM,7073
272
272
  cognite/neat/_workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
273
273
  cognite/neat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
- cognite_neat-0.96.2.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
275
- cognite_neat-0.96.2.dist-info/METADATA,sha256=BMCBJIE-W3M9MnQGoSxVZ0v3Wg2O8DcErGcN-0irhIQ,9573
276
- cognite_neat-0.96.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
277
- cognite_neat-0.96.2.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
278
- cognite_neat-0.96.2.dist-info/RECORD,,
274
+ cognite_neat-0.96.4.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
275
+ cognite_neat-0.96.4.dist-info/METADATA,sha256=hQ8Xbxh2CawmdxuSiWPCFe9VhSc6A1uiT4wTuvoFNq4,9573
276
+ cognite_neat-0.96.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
277
+ cognite_neat-0.96.4.dist-info/entry_points.txt,sha256=SsQlnl8SNMSSjE3acBI835JYFtsIinLSbVmHmMEXv6E,51
278
+ cognite_neat-0.96.4.dist-info/RECORD,,