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

Files changed (36) hide show
  1. cognite/neat/_version.py +1 -1
  2. cognite/neat/graph/_tracking/__init__.py +4 -0
  3. cognite/neat/graph/_tracking/base.py +30 -0
  4. cognite/neat/graph/_tracking/log.py +27 -0
  5. cognite/neat/graph/extractors/__init__.py +17 -2
  6. cognite/neat/graph/extractors/_classic_cdf/{_asset_hierarchy.py → _assets.py} +29 -22
  7. cognite/neat/graph/extractors/_classic_cdf/_events.py +117 -0
  8. cognite/neat/graph/extractors/_classic_cdf/_files.py +131 -0
  9. cognite/neat/graph/extractors/_classic_cdf/_labels.py +72 -0
  10. cognite/neat/graph/extractors/_classic_cdf/_relationships.py +153 -0
  11. cognite/neat/graph/extractors/_classic_cdf/_sequences.py +92 -0
  12. cognite/neat/graph/extractors/_classic_cdf/_timeseries.py +118 -0
  13. cognite/neat/graph/issues/__init__.py +0 -0
  14. cognite/neat/graph/issues/loader.py +104 -0
  15. cognite/neat/graph/loaders/__init__.py +4 -0
  16. cognite/neat/graph/loaders/_base.py +109 -0
  17. cognite/neat/graph/loaders/_rdf2dms.py +280 -0
  18. cognite/neat/graph/stores/_base.py +19 -4
  19. cognite/neat/issues.py +150 -0
  20. cognite/neat/rules/exporters/_base.py +2 -3
  21. cognite/neat/rules/exporters/_rules2dms.py +5 -5
  22. cognite/neat/rules/importers/_base.py +1 -1
  23. cognite/neat/rules/issues/__init__.py +2 -3
  24. cognite/neat/rules/issues/base.py +9 -133
  25. cognite/neat/rules/issues/spreadsheet.py +3 -2
  26. cognite/neat/rules/models/_base.py +6 -0
  27. cognite/neat/rules/models/dms/_rules.py +3 -0
  28. cognite/neat/rules/models/dms/_schema.py +133 -3
  29. cognite/neat/rules/models/domain.py +3 -0
  30. cognite/neat/rules/models/information/_rules.py +4 -1
  31. cognite/neat/{rules/exporters/_models.py → utils/upload.py} +26 -6
  32. {cognite_neat-0.78.4.dist-info → cognite_neat-0.78.5.dist-info}/METADATA +2 -2
  33. {cognite_neat-0.78.4.dist-info → cognite_neat-0.78.5.dist-info}/RECORD +36 -21
  34. {cognite_neat-0.78.4.dist-info → cognite_neat-0.78.5.dist-info}/LICENSE +0 -0
  35. {cognite_neat-0.78.4.dist-info → cognite_neat-0.78.5.dist-info}/WHEEL +0 -0
  36. {cognite_neat-0.78.4.dist-info → cognite_neat-0.78.5.dist-info}/entry_points.txt +0 -0
@@ -1,87 +1,43 @@
1
- import sys
2
- import warnings
3
- from abc import ABC, abstractmethod
4
- from collections import UserList
5
- from collections.abc import Sequence
1
+ from abc import ABC
6
2
  from dataclasses import dataclass
7
- from functools import total_ordering
8
- from typing import Any, ClassVar
9
- from warnings import WarningMessage
3
+ from typing import Any
10
4
 
11
- import pandas as pd
12
5
  from pydantic_core import ErrorDetails
13
6
 
14
- if sys.version_info < (3, 11):
15
- from exceptiongroup import ExceptionGroup
16
- else:
17
- pass
7
+ from cognite.neat.issues import MultiValueError, NeatError, NeatIssue, NeatIssueList, NeatWarning
18
8
 
19
9
  __all__ = [
20
10
  "ValidationIssue",
21
11
  "NeatValidationError",
22
12
  "DefaultPydanticError",
23
13
  "ValidationWarning",
24
- "DefaultWarning",
25
14
  "IssueList",
26
15
  "MultiValueError",
27
16
  ]
28
17
 
29
18
 
30
- @total_ordering
31
19
  @dataclass(frozen=True)
32
- class ValidationIssue(ABC):
33
- description: ClassVar[str]
34
- fix: ClassVar[str]
35
-
36
- def message(self) -> str:
37
- """Return a human-readable message for the issue.
38
-
39
- This is the default implementation, which returns the description.
40
- It is recommended to override this method in subclasses with a more
41
- specific message.
42
- """
43
- return self.description
44
-
45
- @abstractmethod
46
- def dump(self) -> dict[str, Any]:
47
- """Return a dictionary representation of the issue."""
48
- raise NotImplementedError()
49
-
50
- def __lt__(self, other: "ValidationIssue") -> bool:
51
- if not isinstance(other, ValidationIssue):
52
- return NotImplemented
53
- return (type(self).__name__, self.message()) < (type(other).__name__, other.message())
54
-
55
- def __eq__(self, other: object) -> bool:
56
- if not isinstance(other, ValidationIssue):
57
- return NotImplemented
58
- return (type(self).__name__, self.message()) == (type(other).__name__, other.message())
20
+ class ValidationIssue(NeatIssue, ABC): ...
59
21
 
60
22
 
61
23
  @dataclass(frozen=True)
62
- class NeatValidationError(ValidationIssue, ABC):
63
- def dump(self) -> dict[str, Any]:
64
- return {"error": type(self).__name__}
65
-
24
+ class NeatValidationError(NeatError, ValidationIssue, ABC):
66
25
  @classmethod
67
26
  def from_pydantic_errors(cls, errors: list[ErrorDetails], **kwargs) -> "list[NeatValidationError]":
68
27
  """Convert a list of pydantic errors to a list of Error instances.
69
28
 
70
29
  This is intended to be overridden in subclasses to handle specific error types.
71
30
  """
72
- all_errors = []
31
+ all_errors: list[NeatValidationError] = []
73
32
  for error in errors:
74
33
  if isinstance(ctx := error.get("ctx"), dict) and isinstance(
75
34
  multi_error := ctx.get("error"), MultiValueError
76
35
  ):
77
- all_errors.extend(multi_error.errors)
36
+ all_errors.extend(multi_error.errors) # type: ignore[arg-type]
78
37
  else:
79
38
  all_errors.append(DefaultPydanticError.from_pydantic_error(error))
80
39
  return all_errors
81
40
 
82
- def as_exception(self) -> Exception:
83
- return ValueError(self.message())
84
-
85
41
 
86
42
  @dataclass(frozen=True)
87
43
  class DefaultPydanticError(NeatValidationError):
@@ -120,87 +76,7 @@ class DefaultPydanticError(NeatValidationError):
120
76
 
121
77
 
122
78
  @dataclass(frozen=True)
123
- class ValidationWarning(ValidationIssue, ABC, UserWarning):
124
- def dump(self) -> dict[str, Any]:
125
- return {"warning": type(self).__name__}
126
-
127
- @classmethod
128
- def from_warning(cls, warning: WarningMessage) -> "ValidationWarning":
129
- return DefaultWarning.from_warning_message(warning)
130
-
131
-
132
- @dataclass(frozen=True)
133
- class DefaultWarning(ValidationWarning):
134
- description = "A warning was raised during validation."
135
- fix = "No fix is available."
136
-
137
- warning: str | Warning
138
- category: type[Warning]
139
- source: str | None = None
140
-
141
- def dump(self) -> dict[str, Any]:
142
- output = super().dump()
143
- output["msg"] = str(self.warning)
144
- output["category"] = self.category.__name__
145
- output["source"] = self.source
146
- return output
147
-
148
- @classmethod
149
- def from_warning_message(cls, warning: WarningMessage) -> "ValidationWarning":
150
- if isinstance(warning.message, ValidationWarning):
151
- return warning.message
152
-
153
- return cls(
154
- warning=warning.message,
155
- category=warning.category,
156
- source=warning.source,
157
- )
158
-
159
- def message(self) -> str:
160
- return str(self.warning)
161
-
162
-
163
- class IssueList(UserList[ValidationIssue]):
164
- def __init__(self, issues: Sequence[ValidationIssue] | None = None, title: str | None = None):
165
- super().__init__(issues or [])
166
- self.title = title
167
-
168
- @property
169
- def errors(self) -> "IssueList":
170
- return IssueList([issue for issue in self if isinstance(issue, NeatValidationError)])
171
-
172
- @property
173
- def has_errors(self) -> bool:
174
- return any(isinstance(issue, NeatValidationError) for issue in self)
175
-
176
- @property
177
- def warnings(self) -> "IssueList":
178
- return IssueList([issue for issue in self if isinstance(issue, ValidationWarning)])
179
-
180
- def as_errors(self) -> ExceptionGroup:
181
- return ExceptionGroup(
182
- "Validation failed",
183
- [ValueError(issue.message()) for issue in self if isinstance(issue, NeatValidationError)],
184
- )
185
-
186
- def trigger_warnings(self) -> None:
187
- for warning in [issue for issue in self if isinstance(issue, ValidationWarning)]:
188
- warnings.warn(warning, stacklevel=2)
189
-
190
- def to_pandas(self) -> pd.DataFrame:
191
- return pd.DataFrame([issue.dump() for issue in self])
192
-
193
- def _repr_html_(self) -> str | None:
194
- return self.to_pandas()._repr_html_() # type: ignore[operator]
195
-
196
-
197
- class MultiValueError(ValueError):
198
- """This is a container for multiple errors.
199
-
200
- It is used in the pydantic field_validator/model_validator to collect multiple errors, which
201
- can then be caught in a try-except block and returned as an IssueList.
79
+ class ValidationWarning(NeatWarning, ValidationIssue, ABC): ...
202
80
 
203
- """
204
81
 
205
- def __init__(self, errors: Sequence[NeatValidationError]):
206
- self.errors = list(errors)
82
+ class IssueList(NeatIssueList[ValidationIssue]): ...
@@ -8,9 +8,10 @@ from cognite.client.data_classes import data_modeling as dm
8
8
  from cognite.client.data_classes.data_modeling import ContainerId, ViewId
9
9
  from pydantic_core import ErrorDetails
10
10
 
11
+ from cognite.neat.issues import MultiValueError
11
12
  from cognite.neat.utils.spreadsheet import SpreadsheetRead
12
13
 
13
- from .base import DefaultPydanticError, MultiValueError, NeatValidationError
14
+ from .base import DefaultPydanticError, NeatValidationError
14
15
 
15
16
  if sys.version_info >= (3, 11):
16
17
  from typing import Self
@@ -69,7 +70,7 @@ class InvalidSheetError(NeatValidationError, ABC):
69
70
  new_row = reader.adjusted_row_number(caught_error.row)
70
71
  # The error is frozen, so we have to use __setattr__ to change the row number
71
72
  object.__setattr__(caught_error, "row", new_row)
72
- output.append(caught_error)
73
+ output.append(caught_error) # type: ignore[arg-type]
73
74
  continue
74
75
 
75
76
  if len(error["loc"]) >= 4:
@@ -7,6 +7,7 @@ from __future__ import annotations
7
7
  import math
8
8
  import sys
9
9
  import types
10
+ from abc import abstractmethod
10
11
  from collections.abc import Callable, Iterator
11
12
  from functools import wraps
12
13
  from typing import Annotated, Any, ClassVar, Generic, Literal, TypeAlias, TypeVar
@@ -245,6 +246,11 @@ class BaseMetadata(RuleModel):
245
246
  def include_role(self, serializer: Callable) -> dict:
246
247
  return {"role": self.role.value, **serializer(self)}
247
248
 
249
+ @abstractmethod
250
+ def as_identifier(self) -> str:
251
+ """Returns a unique identifier for the metadata."""
252
+ raise NotImplementedError()
253
+
248
254
 
249
255
  class BaseRules(RuleModel):
250
256
  """
@@ -132,6 +132,9 @@ class DMSMetadata(BaseMetadata):
132
132
  views=[],
133
133
  )
134
134
 
135
+ def as_identifier(self) -> str:
136
+ return repr(self.as_data_model_id())
137
+
135
138
  @classmethod
136
139
  def _get_description_and_creator(cls, description_raw: str | None) -> tuple[str | None, list[str]]:
137
140
  if description_raw and (description_match := re.search(r"Creator: (.+)", description_raw)):
@@ -2,17 +2,27 @@ import json
2
2
  import sys
3
3
  import warnings
4
4
  import zipfile
5
- from collections import Counter, defaultdict
5
+ from collections import ChainMap, Counter, defaultdict
6
+ from collections.abc import Iterable, MutableMapping
6
7
  from dataclasses import Field, dataclass, field, fields
7
8
  from pathlib import Path
8
- from typing import Any, ClassVar, cast
9
+ from typing import Any, ClassVar, Literal, cast
9
10
 
10
11
  import yaml
11
12
  from cognite.client import CogniteClient
12
13
  from cognite.client import data_modeling as dm
13
14
  from cognite.client.data_classes import DatabaseWrite, DatabaseWriteList, TransformationWrite, TransformationWriteList
14
15
  from cognite.client.data_classes.data_modeling import ViewApply
15
- from cognite.client.data_classes.data_modeling.views import ReverseDirectRelation
16
+ from cognite.client.data_classes.data_modeling.views import (
17
+ ReverseDirectRelation,
18
+ ReverseDirectRelationApply,
19
+ SingleEdgeConnection,
20
+ SingleEdgeConnectionApply,
21
+ SingleReverseDirectRelation,
22
+ SingleReverseDirectRelationApply,
23
+ ViewProperty,
24
+ ViewPropertyApply,
25
+ )
16
26
  from cognite.client.data_classes.transformations.common import Edges, EdgeType, Nodes, ViewInfo
17
27
 
18
28
  from cognite.neat.rules import issues
@@ -668,6 +678,126 @@ class DMSSchema:
668
678
  referenced_spaces |= {s.space for s in self.spaces.values()}
669
679
  return referenced_spaces
670
680
 
681
+ def as_read_model(self) -> dm.DataModel[dm.View]:
682
+ if self.data_model is None:
683
+ raise ValueError("Data model is not defined")
684
+ all_containers = self.containers.copy()
685
+ all_views = self.views.copy()
686
+ for other_schema in [self.reference, self.last]:
687
+ if other_schema:
688
+ all_containers |= other_schema.containers
689
+ all_views |= other_schema.views
690
+
691
+ views: list[dm.View] = []
692
+ for view in self.views.values():
693
+ referenced_containers = ContainerApplyDict()
694
+ properties: dict[str, ViewProperty] = {}
695
+ # ChainMap is used to merge properties from the view and its parents
696
+ # Note that the order of the ChainMap is important, as the first dictionary has the highest priority
697
+ # So if a child and parent have the same property, the child property will be used.
698
+ write_properties = ChainMap(view.properties, *(all_views[v].properties for v in view.implements or [])) # type: ignore[arg-type]
699
+ for prop_name, prop in write_properties.items():
700
+ read_prop = self._as_read_properties(prop, all_containers)
701
+ if isinstance(read_prop, dm.MappedProperty) and read_prop.container not in referenced_containers:
702
+ referenced_containers[read_prop.container] = all_containers[read_prop.container]
703
+ properties[prop_name] = read_prop
704
+
705
+ read_view = dm.View(
706
+ space=view.space,
707
+ external_id=view.external_id,
708
+ version=view.version,
709
+ description=view.description,
710
+ name=view.name,
711
+ filter=view.filter,
712
+ implements=view.implements.copy(),
713
+ used_for=self._used_for(referenced_containers.values()),
714
+ writable=self._writable(properties.values(), referenced_containers.values()),
715
+ properties=properties,
716
+ is_global=False,
717
+ last_updated_time=0,
718
+ created_time=0,
719
+ )
720
+ views.append(read_view)
721
+
722
+ return dm.DataModel(
723
+ space=self.data_model.space,
724
+ external_id=self.data_model.external_id,
725
+ version=self.data_model.version,
726
+ name=self.data_model.name,
727
+ description=self.data_model.description,
728
+ views=views,
729
+ is_global=False,
730
+ last_updated_time=0,
731
+ created_time=0,
732
+ )
733
+
734
+ @staticmethod
735
+ def _as_read_properties(
736
+ write: ViewPropertyApply, all_containers: MutableMapping[dm.ContainerId, dm.ContainerApply]
737
+ ) -> ViewProperty:
738
+ if isinstance(write, dm.MappedPropertyApply):
739
+ container_prop = all_containers[write.container].properties[write.container_property_identifier]
740
+ return dm.MappedProperty(
741
+ container=write.container,
742
+ container_property_identifier=write.container_property_identifier,
743
+ name=write.name,
744
+ description=write.description,
745
+ source=write.source,
746
+ type=container_prop.type,
747
+ nullable=container_prop.nullable,
748
+ auto_increment=container_prop.auto_increment,
749
+ # Likely bug in SDK.
750
+ default_value=container_prop.default_value, # type: ignore[arg-type]
751
+ )
752
+ if isinstance(write, dm.EdgeConnectionApply):
753
+ edge_cls = SingleEdgeConnection if isinstance(write, SingleEdgeConnectionApply) else dm.MultiEdgeConnection
754
+ return edge_cls(
755
+ type=write.type,
756
+ source=write.source,
757
+ name=write.name,
758
+ description=write.description,
759
+ edge_source=write.edge_source,
760
+ direction=write.direction,
761
+ )
762
+ if isinstance(write, ReverseDirectRelationApply):
763
+ relation_cls = (
764
+ SingleReverseDirectRelation
765
+ if isinstance(write, SingleReverseDirectRelationApply)
766
+ else dm.MultiReverseDirectRelation
767
+ )
768
+ return relation_cls(
769
+ source=write.source,
770
+ through=write.through,
771
+ name=write.name,
772
+ description=write.description,
773
+ )
774
+ raise ValueError(f"Cannot convert {write} to read format")
775
+
776
+ @staticmethod
777
+ def _used_for(containers: Iterable[dm.ContainerApply]) -> Literal["node", "edge", "all"]:
778
+ used_for = {container.used_for for container in containers}
779
+ if used_for == {"node"}:
780
+ return "node"
781
+ if used_for == {"edge"}:
782
+ return "edge"
783
+ return "all"
784
+
785
+ @staticmethod
786
+ def _writable(properties: Iterable[ViewProperty], containers: Iterable[dm.ContainerApply]) -> bool:
787
+ used_properties = {
788
+ (prop.container, prop.container_property_identifier)
789
+ for prop in properties
790
+ if isinstance(prop, dm.MappedProperty)
791
+ }
792
+ required_properties = {
793
+ (container.as_id(), prop_id)
794
+ for container in containers
795
+ for prop_id, prop in container.properties.items()
796
+ if not prop.nullable
797
+ }
798
+ # If a container has a required property that is not used by the view, the view is not writable
799
+ return not bool(required_properties - used_properties)
800
+
671
801
 
672
802
  @dataclass
673
803
  class PipelineSchema(DMSSchema):
@@ -21,6 +21,9 @@ class DomainMetadata(BaseMetadata):
21
21
  role: ClassVar[RoleTypes] = RoleTypes.domain_expert
22
22
  creator: StrOrListType
23
23
 
24
+ def as_identifier(self) -> str:
25
+ return "DomainRules"
26
+
24
27
 
25
28
  class DomainProperty(SheetEntity):
26
29
  class_: ClassEntity = Field(alias="Class")
@@ -8,8 +8,8 @@ from pydantic.main import IncEx
8
8
  from rdflib import Namespace
9
9
 
10
10
  from cognite.neat.constants import PREFIXES
11
+ from cognite.neat.issues import MultiValueError
11
12
  from cognite.neat.rules import exceptions, issues
12
- from cognite.neat.rules.issues.base import MultiValueError
13
13
  from cognite.neat.rules.models._base import (
14
14
  BaseMetadata,
15
15
  BaseRules,
@@ -116,6 +116,9 @@ class InformationMetadata(BaseMetadata):
116
116
  def as_enum_model_type(cls, value: str) -> DataModelType:
117
117
  return DataModelType(value)
118
118
 
119
+ def as_identifier(self) -> str:
120
+ return f"{self.prefix}:{self.name}"
121
+
119
122
 
120
123
  class InformationClass(SheetEntity):
121
124
  """
@@ -2,29 +2,31 @@ from abc import ABC
2
2
  from dataclasses import dataclass, field
3
3
  from functools import total_ordering
4
4
 
5
- from cognite.neat.rules.issues import IssueList
5
+ from cognite.neat.issues import NeatIssueList
6
6
 
7
7
 
8
8
  @total_ordering
9
9
  @dataclass
10
10
  class UploadResultCore(ABC):
11
11
  name: str
12
+ error_messages: list[str] = field(default_factory=list)
13
+ issues: NeatIssueList = field(default_factory=NeatIssueList)
12
14
 
13
15
  def __lt__(self, other: object) -> bool:
14
- if isinstance(other, UploadResult):
16
+ if isinstance(other, UploadDiffsCount):
15
17
  return self.name < other.name
16
18
  else:
17
19
  return NotImplemented
18
20
 
19
21
  def __eq__(self, other: object) -> bool:
20
- if isinstance(other, UploadResult):
22
+ if isinstance(other, UploadDiffsCount):
21
23
  return self.name == other.name
22
24
  else:
23
25
  return NotImplemented
24
26
 
25
27
 
26
28
  @dataclass
27
- class UploadResult(UploadResultCore):
29
+ class UploadDiffsCount(UploadResultCore):
28
30
  created: int = 0
29
31
  deleted: int = 0
30
32
  changed: int = 0
@@ -33,8 +35,6 @@ class UploadResult(UploadResultCore):
33
35
  failed_created: int = 0
34
36
  failed_changed: int = 0
35
37
  failed_deleted: int = 0
36
- error_messages: list[str] = field(default_factory=list)
37
- issues: IssueList = field(default_factory=IssueList)
38
38
 
39
39
  @property
40
40
  def total(self) -> int:
@@ -64,3 +64,23 @@ class UploadResult(UploadResultCore):
64
64
  line.append(f"failed to delete {self.failed_deleted}")
65
65
 
66
66
  return f"{self.name.title()}: {', '.join(line)}"
67
+
68
+
69
+ @dataclass
70
+ class UploadResultIDs(UploadResultCore):
71
+ success: list[str] = field(default_factory=list)
72
+ failed: list[str] = field(default_factory=list)
73
+
74
+
75
+ @dataclass
76
+ class UploadDiffsID(UploadResultCore):
77
+ created: list[str] = field(default_factory=list)
78
+ changed: list[str] = field(default_factory=list)
79
+ unchanged: list[str] = field(default_factory=list)
80
+ failed: list[str] = field(default_factory=list)
81
+
82
+ def as_upload_result_ids(self) -> UploadResultIDs:
83
+ result = UploadResultIDs(name=self.name, error_messages=self.error_messages, issues=self.issues)
84
+ result.success = self.created + self.changed + self.unchanged
85
+ result.failed = self.failed
86
+ return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cognite-neat
3
- Version: 0.78.4
3
+ Version: 0.78.5
4
4
  Summary: Knowledge graph transformation
5
5
  Home-page: https://cognite-neat.readthedocs-hosted.com/
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ Requires-Dist: backports.strenum (>=1.2,<2.0) ; python_version < "3.11"
22
22
  Requires-Dist: cognite-sdk (>=7.37.0,<8.0.0)
23
23
  Requires-Dist: deepdiff
24
24
  Requires-Dist: exceptiongroup (>=1.1.3,<2.0.0) ; python_version < "3.11"
25
- Requires-Dist: fastapi (>=0.110,<0.111)
25
+ Requires-Dist: fastapi (>=0,<1)
26
26
  Requires-Dist: google-api-python-client ; extra == "google" or extra == "all"
27
27
  Requires-Dist: google-auth-oauthlib ; extra == "google" or extra == "all"
28
28
  Requires-Dist: gspread ; extra == "google" or extra == "all"
@@ -1,5 +1,5 @@
1
1
  cognite/neat/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
- cognite/neat/_version.py,sha256=4qUludpNixgmhGKESx2FYWVdHE0dHtestyzPDEVZ-iA,23
2
+ cognite/neat/_version.py,sha256=2uubg0ZmASu9ykJZHeQzJ7RUMWo2b-kKPcvmMJ5XS4A,23
3
3
  cognite/neat/app/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cognite/neat/app/api/asgi/metrics.py,sha256=nxFy7L5cChTI0a-zkCiJ59Aq8yLuIJp5c9Dg0wRXtV0,152
5
5
  cognite/neat/app/api/configuration.py,sha256=2U5M6M252swvQPQyooA1EBzFUZNtcTmuSaywfJDgckM,4232
@@ -44,24 +44,39 @@ cognite/neat/config.py,sha256=oBrWw-KEo0YMbfjVeW6A1FBW7HpP2Pq2ByIq2vlJ10M,6145
44
44
  cognite/neat/constants.py,sha256=GYVcrFrvqcznYgB_0jAyykIIiIamxyOpv4dTZWj4K4U,1300
45
45
  cognite/neat/exceptions.py,sha256=CM7aCvbek9klOgjTsJ9bfEA8t7KTAL6dc7Mviu4NvSI,4268
46
46
  cognite/neat/graph/__init__.py,sha256=31uTeejWOSd-I8iUG8GOZFhHZcQCsBitJ6X8vu2r1nU,73
47
+ cognite/neat/graph/_tracking/__init__.py,sha256=pYj7c-YAUIP4hvN-4mlWnwaeZFerzL9_gM-oZhex7cE,91
48
+ cognite/neat/graph/_tracking/base.py,sha256=8JmaDhlFhSkdBe4SOvFnrdDvMmfTZkHhZxWWWTYkMOQ,820
49
+ cognite/neat/graph/_tracking/log.py,sha256=dBSINd8Tn92hBl8APMD8r6j15g2SlaX1tsDLCmHvaU4,927
47
50
  cognite/neat/graph/examples/Knowledge-Graph-Nordic44-dirty.xml,sha256=ujJip6XBs5n8enVDPzNnuGkMBwv8g21tIr1sEVJpK5M,1439359
48
51
  cognite/neat/graph/examples/Knowledge-Graph-Nordic44.xml,sha256=U2Ns-M4LRjT1fBkhmRj63ur7jDzlRtHK9yOLf_npZ_g,1437996
49
52
  cognite/neat/graph/examples/__init__.py,sha256=yAjHVY3b5jOjmbW-iLbhvu7BG014TpGi3K4igkDqW5I,368
50
53
  cognite/neat/graph/examples/skos-capturing-sheet-wind-topics.xlsx,sha256=CV_yK5ZSbYS_ktfIZUPD8Sevs47zpswLXQUDFkGE4Gw,45798
51
54
  cognite/neat/graph/exceptions.py,sha256=R6pyOH774n9w2x_X_nrUr8OMAdjJMf_XPIqAvxIQaWo,3401
52
- cognite/neat/graph/extractors/__init__.py,sha256=YpoCBdmRyn3Pjav2cAYBi5beEnyJBHu-jB7rh9XpgVE,182
55
+ cognite/neat/graph/extractors/__init__.py,sha256=0Mv7iTBwOdMHgqkINh0V2hnDxeC9fIDpBmmnW5Q1lyQ,645
53
56
  cognite/neat/graph/extractors/_base.py,sha256=TOXDnlqske8DgnJwA0THDVRgmR79Acjm56yF0E-2w7I,356
54
57
  cognite/neat/graph/extractors/_classic_cdf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- cognite/neat/graph/extractors/_classic_cdf/_asset_hierarchy.py,sha256=p9jrHSxMsqPbkHBnstvktIF4lRgHvxpKvcgxY22YS2k,3851
58
+ cognite/neat/graph/extractors/_classic_cdf/_assets.py,sha256=S5QB_38ysVodGRMqr_SWYYaUtkUCS6a6L2b5D1T-888,3812
59
+ cognite/neat/graph/extractors/_classic_cdf/_events.py,sha256=cYd-A7bvRw2S-FDvvE58PPDNE7uhoq2Lhu9En2i6E58,3961
60
+ cognite/neat/graph/extractors/_classic_cdf/_files.py,sha256=8CpqZl8pLBRNJ6oxxp2YLfCupxlXJQ6h0ymUlI1GzH8,4783
61
+ cognite/neat/graph/extractors/_classic_cdf/_labels.py,sha256=GcMPoecniy3g59enKD71F3fghvnN4K3uj1Z9bo2ZKIE,2367
62
+ cognite/neat/graph/extractors/_classic_cdf/_relationships.py,sha256=5kClA5zBlhyPT6hfanLP-upLvMcE6mLU4AhkRp49NYQ,4985
63
+ cognite/neat/graph/extractors/_classic_cdf/_sequences.py,sha256=ov-n8cBEC73AMO1xam2GUDHv-7SyOEWXWRxLXh9flyY,3298
64
+ cognite/neat/graph/extractors/_classic_cdf/_timeseries.py,sha256=xlnJ4fKvCJawZO6l6EHpx36RRAafd3BdYWS0ajNnGVM,4449
56
65
  cognite/neat/graph/extractors/_mock_graph_generator.py,sha256=gziG2FFsLk-HmA9uxAeT9RCjVpFxjkCTLiC4tq2zgvw,14961
66
+ cognite/neat/graph/issues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ cognite/neat/graph/issues/loader.py,sha256=v8YDsehkUT1QUG61JM9BDV_lqowMUnDmGmbay0aFzN4,3085
68
+ cognite/neat/graph/loaders/__init__.py,sha256=hHC9sfFfbnGSVFTYeuNTIEu4tdLSJ2mWV07fereLelo,125
69
+ cognite/neat/graph/loaders/_base.py,sha256=VOCRIee9ms6FuBlT3mwBV_mQnI6bO53mrardqiMf-Hk,4045
70
+ cognite/neat/graph/loaders/_rdf2dms.py,sha256=bVFLjukCwEUGVoyQ6YnmdRXV945fhX3SiHR6yHLXO2k,12873
57
71
  cognite/neat/graph/models.py,sha256=AtLgZh2qyRP6NRetjQCy9qLMuTQB0CH52Zsev-qa2sk,149
58
72
  cognite/neat/graph/stores/__init__.py,sha256=ivvk7STSo-4wuP_CpizKUCPKmt_ufpNWRJUN9Bv5gdY,543
59
- cognite/neat/graph/stores/_base.py,sha256=_39ZoiSed7U-OdOKhiuT8dOS3u7HNfSIkLQp3a0B0GQ,13473
73
+ cognite/neat/graph/stores/_base.py,sha256=ZrPDfWjmO3nJwpLS6r0ru7LZAhMtOcA76-v5akHq-kQ,14226
60
74
  cognite/neat/graph/stores/_graphdb_store.py,sha256=8QM8I4srDKNsR0PddN6htCYUhfkoqlyy-c232Os7C0A,1776
61
75
  cognite/neat/graph/stores/_memory_store.py,sha256=GQq19xiyAWU0WQU5txmWnLXBuyP6ywd8plR21UtD3Uw,1420
62
76
  cognite/neat/graph/stores/_oxigraph_store.py,sha256=Xj69oE4M-9aqd8bq5CpLCMAhwNjJQAP1AC7lxzDsCn0,5448
63
77
  cognite/neat/graph/stores/_oxrdflib.py,sha256=A5zeRm5_e8ui_ihGpgstRDg_N7qcLZ3QZBRGrOXSGI0,9569
64
78
  cognite/neat/graph/stores/_rdf_to_graph.py,sha256=1ezWHTPn9UkIsAlxZcYRlqWvj3ixlmB5GGG9NN0ls2Q,1244
79
+ cognite/neat/issues.py,sha256=pxQfqfBseMDE8JM0iqZnkLXngeyeFfT0TFtu1UuAd4c,4629
65
80
  cognite/neat/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
81
  cognite/neat/legacy/graph/__init__.py,sha256=31uTeejWOSd-I8iUG8GOZFhHZcQCsBitJ6X8vu2r1nU,73
67
82
  cognite/neat/legacy/graph/examples/Knowledge-Graph-Nordic44-dirty.xml,sha256=ujJip6XBs5n8enVDPzNnuGkMBwv8g21tIr1sEVJpK5M,1439359
@@ -165,15 +180,14 @@ cognite/neat/rules/examples/__init__.py,sha256=nxIwueAcHgZhkYriGxnDLQmIyiT8PByPH
165
180
  cognite/neat/rules/examples/wind-energy.owl,sha256=NuomCA9FuuLF0JlSuG3OKqD4VBcHgSjDKFLV17G1zV8,65934
166
181
  cognite/neat/rules/exceptions.py,sha256=YLnsbXXJdDSr_szQoioEtOdqDV8PR7RdQjpMP2SWeCs,123868
167
182
  cognite/neat/rules/exporters/__init__.py,sha256=Gn3CjkVKHJF9Po1ZPH4wAJ-sRW9up7b2CpXm-eReV3Q,413
168
- cognite/neat/rules/exporters/_base.py,sha256=m63iw8xjlZbZAxGL8mn7pjGf1pW3rVv8C20_RSiu4t0,1511
169
- cognite/neat/rules/exporters/_models.py,sha256=vRd0P_YsrZ1eaAGGHfdTeFunaqHdaa0ZtnWiVZBR1nc,1976
170
- cognite/neat/rules/exporters/_rules2dms.py,sha256=US2IO4YTJSF_CDzau1dTpXyeHntJWVSPkMCQoUoKeC0,13688
183
+ cognite/neat/rules/exporters/_base.py,sha256=3eLIzZ3ddVVQGV7qQn-hKV0U_lPMBQzC4AblTKYzaEA,1535
184
+ cognite/neat/rules/exporters/_rules2dms.py,sha256=e9veycUKfZ5NFDC_ar08hNd-LWrZAva_bRFa9VfI8AA,13725
171
185
  cognite/neat/rules/exporters/_rules2excel.py,sha256=HvUdXYHxfLMijYWdTnfqCsw3Izf8S-XDSve-2ZbqF8Y,14248
172
186
  cognite/neat/rules/exporters/_rules2ontology.py,sha256=Od53uLdcC2Q7UiF5PA2P0gw3O14eTD3MeJ1-trd64ZM,20388
173
187
  cognite/neat/rules/exporters/_rules2yaml.py,sha256=GA8eUYRxUfIU6IMvlyGO5JidkOD5eUKSbH3qAiFiaCg,3026
174
188
  cognite/neat/rules/exporters/_validation.py,sha256=OlKIyf4nhSDehJwFHDQ8Zdf6HpNfW7dSe2s67eywHu4,4078
175
189
  cognite/neat/rules/importers/__init__.py,sha256=gR6_TAEa3iO5NCLKRztHg-FMiLdBnx47Z3iSzbwLfcE,481
176
- cognite/neat/rules/importers/_base.py,sha256=GUiJrYwJ25thI71iS9hCeP_iSZ0Vv8ou3z6MfD07FAk,4274
190
+ cognite/neat/rules/importers/_base.py,sha256=RoPovpuIvIr18xFBt-txz8OsIHqyMfMcMHOBivyQqHs,4296
177
191
  cognite/neat/rules/importers/_dms2rules.py,sha256=5yJGYkM7lAMu-QfO0_r59WE4RGtMu2smMqLm16ohgLQ,18994
178
192
  cognite/neat/rules/importers/_dtdl2rules/__init__.py,sha256=CNR-sUihs2mnR1bPMKs3j3L4ds3vFTsrl6YycExZTfU,68
179
193
  cognite/neat/rules/importers/_dtdl2rules/_unit_lookup.py,sha256=wW4saKva61Q_i17guY0dc4OseJDQfqHy_QZBtm0OD6g,12134
@@ -188,16 +202,16 @@ cognite/neat/rules/importers/_owl2rules/_owl2properties.py,sha256=eKr-e-ZTTV54PJ
188
202
  cognite/neat/rules/importers/_owl2rules/_owl2rules.py,sha256=41_wZFvt0A6TI55zlT04oQkvU7V73li4aGLgc4T4Lxo,6358
189
203
  cognite/neat/rules/importers/_spreadsheet2rules.py,sha256=nKSJyZGoTho0bqQ_5_1XB9Z1C-MwovRgkVrC-AhOuzs,12438
190
204
  cognite/neat/rules/importers/_yaml2rules.py,sha256=F0uksSz1A3po5OlRM2152_w5j8D9oYTLB9NFTkSMlWI,4275
191
- cognite/neat/rules/issues/__init__.py,sha256=Ms6jgCxCezc5IgTOwCFtXQPtoVFfOvdcXj84_rs917I,563
192
- cognite/neat/rules/issues/base.py,sha256=i2aTC-wq3UVW2bj_7wKeuhYxCpMD06Bd9-m00bWcTBs,6438
205
+ cognite/neat/rules/issues/__init__.py,sha256=c12m0HAHHzF6oR8lKbULE3TxOPimTi9s1O9IIrtgh0g,549
206
+ cognite/neat/rules/issues/base.py,sha256=x2YLCfmqtPlFLoURq3qHaprXCpFaQdf0iWkql-EMyps,2446
193
207
  cognite/neat/rules/issues/dms.py,sha256=CKztcpNu9E_ygbAmiODOhaYKPX6o9eaXeiod7Ak-kNY,23617
194
208
  cognite/neat/rules/issues/fileread.py,sha256=ao199mtvhPSW0IA8ZQZ0RzuLIIipYtL0jp6fLqxb4_c,5748
195
209
  cognite/neat/rules/issues/formatters.py,sha256=_ag2bJ9hncOj8pAGJvTTEPs9kTtxbD7vkqvS9Zcnizc,3385
196
210
  cognite/neat/rules/issues/importing.py,sha256=uSk4TXo_CO3bglBZkaiWekXLXXd31UWIZE95clVSLz4,13417
197
- cognite/neat/rules/issues/spreadsheet.py,sha256=1NZQ3a_zCtErAoMKzEt5UMJsukaysoOVmW7WUF6JK1s,15825
211
+ cognite/neat/rules/issues/spreadsheet.py,sha256=jBEczqon1G0H_mCfdCCffWdRLHO5ER8SnGKuR4q4eKs,15882
198
212
  cognite/neat/rules/issues/spreadsheet_file.py,sha256=YCp0Pk_TsiqYuOPdWpjUpre-zvi2c5_MvrC_dxw10YY,4964
199
213
  cognite/neat/rules/models/__init__.py,sha256=aqhQUidHYgOk5_iqdi6s72s2g8qyMRFXShYzh-ctNpw,782
200
- cognite/neat/rules/models/_base.py,sha256=oQ8f0bvdythJ2m54K1jl2OXEuEZ4N8JqHDXyhCPBVbY,11010
214
+ cognite/neat/rules/models/_base.py,sha256=7GUCflYZ7CDVyRZTYd4CYQJr7tPnMefd-1B9UktaWpY,11194
201
215
  cognite/neat/rules/models/_rdfpath.py,sha256=RoHnfWufjnDtwJh7UUzWKoJz8luvX7Gb5SDQORfkQTE,11030
202
216
  cognite/neat/rules/models/_types/__init__.py,sha256=l1tGxzE7ezNHIL72AoEvNHN2IFuitxOLxiHJG__s6t4,305
203
217
  cognite/neat/rules/models/_types/_base.py,sha256=2GhLUE1ukV8X8SGL_JDxpbWGZyAvOnSqAE6JmDh5wbI,929
@@ -206,16 +220,16 @@ cognite/neat/rules/models/data_types.py,sha256=lanwkhwG8iHKfjYfia4v2SBTJrMeXOsqa
206
220
  cognite/neat/rules/models/dms/__init__.py,sha256=Wzyqzz2ZIjpUbDg04CMuuIAw-f2A02DayNeqO9R-2Hw,491
207
221
  cognite/neat/rules/models/dms/_converter.py,sha256=QaJT0z0Yo4gkG9tHPZkU8idF8PK7c-tDahbyIT-WJQU,5959
208
222
  cognite/neat/rules/models/dms/_exporter.py,sha256=pWUt3z8qk71eZ-YO8NdKbVOaWaIKl8bSdEuRU591gU4,24486
209
- cognite/neat/rules/models/dms/_rules.py,sha256=iqoPilY3tov3GvJ9N3K3go6xy9kiiMt9vEZ2hQK5_V8,16070
223
+ cognite/neat/rules/models/dms/_rules.py,sha256=XTIEWG49VjNs_bICGlgMd6uk4hseY1H6UVe2KMfHAWQ,16152
210
224
  cognite/neat/rules/models/dms/_rules_input.py,sha256=apDDTQll9UAyYL5gS2vDxHsujWrGBilTp7lK2kzJWO8,13467
211
- cognite/neat/rules/models/dms/_schema.py,sha256=A4z8CINmLQgWzHoScxejRPMRo40ngKlyp1gOdPto8yU,43808
225
+ cognite/neat/rules/models/dms/_schema.py,sha256=byMG67i80a4sSQS_0k8YGrDvh7whio4iLbmPEIy_P44,49514
212
226
  cognite/neat/rules/models/dms/_serializer.py,sha256=iqp2zyyf8jEcU-R3PERuN8nu248xIqyxiWj4owAn92g,6406
213
227
  cognite/neat/rules/models/dms/_validation.py,sha256=nPSyfM1vGZ7d9Uv_2vF2HvMetygtehXW7eNtPD6eW8E,13937
214
- cognite/neat/rules/models/domain.py,sha256=tkKcHvDXnZ5IkOr1wHiuNBtE1h8OCFmf6GZSqzHzxjI,2814
228
+ cognite/neat/rules/models/domain.py,sha256=wZ-DeIPFnacbNlxSrRuLzUpnhHdTpzNc22z0sDfisi4,2880
215
229
  cognite/neat/rules/models/entities.py,sha256=lkLsKg8U3Xto30PCB85ScDpv2SPRVq1ukVEQHzH53_g,18868
216
230
  cognite/neat/rules/models/information/__init__.py,sha256=HR6g8xgyU53U7Ck8pPdbT70817Q4NC1r1pCRq5SA8iw,291
217
231
  cognite/neat/rules/models/information/_converter.py,sha256=JN63_G5bygdL5WCz-q0_ygiU0NHkzUxm5mZ3WD8yUes,11029
218
- cognite/neat/rules/models/information/_rules.py,sha256=bUzDzwFyWK9EH0FKCQPH9DCfKG3AUtBHaOshTW7VMRY,13476
232
+ cognite/neat/rules/models/information/_rules.py,sha256=ZVTOn5fEB-AbrXL8A6SN9DwOmF9FhgyS7FzibrkT6ZM,13546
219
233
  cognite/neat/rules/models/information/_rules_input.py,sha256=xmcQQl2vBYSG_IbxOwb6x4CdN3nIg_TY2-3RAeGDYic,10418
220
234
  cognite/neat/rules/models/information/_serializer.py,sha256=yti9I_xJruxrib66YIBInhze___Io-oPTQH6uWDumPE,3503
221
235
  cognite/neat/rules/models/information/_validation.py,sha256=Is2GzL2lZU3A5zPu3NjvlXfmIU2_Y10C5Nxi5Denz4g,7528
@@ -232,6 +246,7 @@ cognite/neat/utils/cdf_loaders/data_classes.py,sha256=0apspfwVlFltYOZfmk_PNknS3Z
232
246
  cognite/neat/utils/exceptions.py,sha256=-w4cAcvcoWLf-_ZwAl7QV_NysfqtQzIOd1Ti-mpxJgM,981
233
247
  cognite/neat/utils/spreadsheet.py,sha256=LI0c7dlW0zXHkHw0NvB-gg6Df6cDcE3FbiaHBYLXdzQ,2714
234
248
  cognite/neat/utils/text.py,sha256=4bg1_Q0lg7KsoxaDOvXrVyeY78BJN8i-27BlyDzUCls,3082
249
+ cognite/neat/utils/upload.py,sha256=XaAKqyMhz6qXbUrttGNIXZxFRPJvrnbMpDRF8GEiK2g,2707
235
250
  cognite/neat/utils/utils.py,sha256=OOuL0l-pv_8gDJCpXGBx-U9CEYDKQffP9dt8Dbg5kdU,13807
236
251
  cognite/neat/utils/xml.py,sha256=ppLT3lQKVp8wOP-m8-tFY8uB2P4R76l7R_-kUtsABng,992
237
252
  cognite/neat/workflows/__init__.py,sha256=oiKub_U9f5cA0I1nKl5dFkR4BD8_6Be9eMzQ_50PwP0,396
@@ -278,8 +293,8 @@ cognite/neat/workflows/steps_registry.py,sha256=fkTX14ZA7_gkUYfWIlx7A1XbCidvqR23
278
293
  cognite/neat/workflows/tasks.py,sha256=dqlJwKAb0jlkl7abbY8RRz3m7MT4SK8-7cntMWkOYjw,788
279
294
  cognite/neat/workflows/triggers.py,sha256=_BLNplzoz0iic367u1mhHMHiUrCwP-SLK6_CZzfODX0,7071
280
295
  cognite/neat/workflows/utils.py,sha256=gKdy3RLG7ctRhbCRwaDIWpL9Mi98zm56-d4jfHDqP1E,453
281
- cognite_neat-0.78.4.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
282
- cognite_neat-0.78.4.dist-info/METADATA,sha256=rCJxBd0usi6z7qKES5e_B3x6vTLxlXGQNraOAuXaOIs,9306
283
- cognite_neat-0.78.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
284
- cognite_neat-0.78.4.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
285
- cognite_neat-0.78.4.dist-info/RECORD,,
296
+ cognite_neat-0.78.5.dist-info/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
297
+ cognite_neat-0.78.5.dist-info/METADATA,sha256=cndbsOaHg6ndd8FtHUJVa5ojU6kQvr_ikXsByBRloW8,9298
298
+ cognite_neat-0.78.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
299
+ cognite_neat-0.78.5.dist-info/entry_points.txt,sha256=61FPqiWb25vbqB0KI7znG8nsg_ibLHBvTjYnkPvNFso,50
300
+ cognite_neat-0.78.5.dist-info/RECORD,,