cognite-neat 1.0.26__py3-none-any.whl → 1.0.28__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.
cognite/neat/_config.py CHANGED
@@ -105,6 +105,7 @@ class AlphaFlagConfig(ConfigModel):
105
105
  default=False,
106
106
  description="If enabled, Neat will run experimental validators that are still in alpha stage.",
107
107
  )
108
+ enable_cdf_analysis: bool = Field(default=False, description="If enabled, neat.cdf endpoint will be available.")
108
109
 
109
110
  def __setattr__(self, key: str, value: Any) -> None:
110
111
  """Set attribute value or raise AttributeError."""
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Mapping
2
- from typing import Annotated, Literal, cast, get_args
2
+ from typing import Annotated, Any, Literal, cast, get_args
3
3
 
4
4
  from pydantic import (
5
5
  AliasGenerator,
@@ -12,7 +12,6 @@ from pydantic import (
12
12
  )
13
13
  from pydantic.alias_generators import to_camel
14
14
  from pydantic.fields import FieldInfo
15
- from traitlets import Any
16
15
 
17
16
  from cognite.neat._data_model.models.entities import ParsedEntity, parse_entities, parse_entity
18
17
  from cognite.neat._utils.text import title_case
@@ -9,6 +9,7 @@ class SpaceLimit(BaseModel):
9
9
  """Limits for spaces."""
10
10
 
11
11
  limit: int = 100
12
+ count: int = 0
12
13
 
13
14
 
14
15
  class ListablePropertyLimits(BaseModel):
@@ -51,6 +52,7 @@ class ContainerLimits(BaseModel):
51
52
  """Limits for containers."""
52
53
 
53
54
  limit: int = 1_000
55
+ count: int = 0
54
56
  properties: ContainerPropertyLimits = Field(default_factory=ContainerPropertyLimits)
55
57
 
56
58
 
@@ -58,6 +60,7 @@ class ViewLimits(BaseModel):
58
60
  """Limits for views."""
59
61
 
60
62
  limit: int = 2_000
63
+ count: int = 0
61
64
  versions: int = 100
62
65
  properties: int = 300
63
66
  implements: int = 10
@@ -68,6 +71,7 @@ class DataModelLimits(BaseModel):
68
71
  """Limits for data models."""
69
72
 
70
73
  limit: int = 500
74
+ count: int = 0
71
75
  versions: int = Field(100, description="Limit of versions per data model.")
72
76
  views: int = Field(100, description="Limit of views per data model.")
73
77
 
@@ -11,7 +11,7 @@ from cognite.neat._data_model.models.dms._view_property import (
11
11
  from cognite.neat._data_model.validation.dms._base import (
12
12
  DataModelValidator,
13
13
  )
14
- from cognite.neat._issues import ConsistencyError
14
+ from cognite.neat._issues import ConsistencyError, Recommendation
15
15
 
16
16
  BASE_CODE = "NEAT-DMS-LIMITS"
17
17
 
@@ -124,19 +124,19 @@ class ViewContainerCountIsOutOfLimits(DataModelValidator):
124
124
  Checks that the view references no more containers than the CDF limit allows.
125
125
 
126
126
  ## Why is this bad?
127
- CDF enforces limits on the number of containers per view to prevent overly complex view definitions, leading
128
- to too many joins and performance degradation.
127
+ Mapping too many containers to a single view can lead to performance issues to increasing number of joins
128
+ that need to be performed when querying data through the view.
129
129
 
130
130
  ## Example
131
131
  If a view references 20 containers and the CDF limit is 10 containers per view,
132
- this validator will raise a ConsistencyError issue.
132
+ this validator will raise a Recommendation.
133
133
  """
134
134
 
135
135
  code = f"{BASE_CODE}-VIEW-002"
136
- issue_type = ConsistencyError
136
+ issue_type = Recommendation
137
137
 
138
- def run(self) -> list[ConsistencyError]:
139
- errors: list[ConsistencyError] = []
138
+ def run(self) -> list[Recommendation]:
139
+ recommendations: list[Recommendation] = []
140
140
 
141
141
  # Single loop over all views
142
142
  for view_ref in self.validation_resources.merged_data_model.views or []:
@@ -152,18 +152,18 @@ class ViewContainerCountIsOutOfLimits(DataModelValidator):
152
152
  }
153
153
  )
154
154
  if count > self.validation_resources.limits.views.containers:
155
- errors.append(
156
- ConsistencyError(
155
+ recommendations.append(
156
+ Recommendation(
157
157
  message=(
158
158
  f"View {view_ref!s} references "
159
- f"{count} containers, which exceeds the limit of "
159
+ f"{count} containers, which exceeds a common sense limit of "
160
160
  f"{self.validation_resources.limits.views.containers} containers per view."
161
161
  ),
162
162
  code=self.code,
163
163
  )
164
164
  )
165
165
 
166
- return errors
166
+ return recommendations
167
167
 
168
168
 
169
169
  class ViewImplementsCountIsOutOfLimits(DataModelValidator):
@@ -0,0 +1,36 @@
1
+ # /Users/nikola/repos/neat/cognite/neat/_session/_cdf.py
2
+ import uuid
3
+
4
+ from cognite.neat._client import NeatClient
5
+ from cognite.neat._config import NeatConfig
6
+ from cognite.neat._store._store import NeatStore
7
+
8
+ from ._html._render import render
9
+
10
+
11
+ class CDF:
12
+ """Read from a data source into NeatSession graph store."""
13
+
14
+ def __init__(self, store: NeatStore, client: NeatClient, config: NeatConfig) -> None:
15
+ self._store = store
16
+ self._client = client
17
+ self._config = config
18
+
19
+ def _repr_html_(self) -> str:
20
+ """Generate HTML representation of CDF schema statistics."""
21
+ unique_id = str(uuid.uuid4())[:8]
22
+
23
+ return render(
24
+ "statistics",
25
+ {
26
+ "unique_id": unique_id,
27
+ "spaces_current": self._store.cdf_limits.spaces.count,
28
+ "spaces_limit": self._store.cdf_limits.spaces.limit,
29
+ "containers_current": self._store.cdf_limits.containers.count,
30
+ "containers_limit": self._store.cdf_limits.containers.limit,
31
+ "views_current": self._store.cdf_limits.views.count,
32
+ "views_limit": self._store.cdf_limits.views.limit,
33
+ "data_models_current": self._store.cdf_limits.data_models.count,
34
+ "data_models_limit": self._store.cdf_limits.data_models.limit,
35
+ },
36
+ )
@@ -4,13 +4,13 @@ from . import static, templates
4
4
 
5
5
  ENCODING = "utf-8"
6
6
 
7
- Template: TypeAlias = Literal["issues", "deployment"]
7
+ Template: TypeAlias = Literal["issues", "deployment", "statistics"]
8
8
 
9
9
 
10
- def render(template_name: Literal["issues", "deployment"], variables: dict[str, Any]) -> str:
10
+ def render(template_name: Literal["issues", "deployment", "statistics"], variables: dict[str, Any]) -> str:
11
11
  """Generate HTML content from a template and variables."""
12
12
 
13
- if template_name not in ["issues", "deployment"]:
13
+ if template_name not in ["issues", "deployment", "statistics"]:
14
14
  raise ValueError(f"Unknown template name: {template_name}")
15
15
 
16
16
  variables["SHARED_CSS"] = static.shared_style.read_text(encoding=ENCODING)
@@ -25,6 +25,11 @@ def render(template_name: Literal["issues", "deployment"], variables: dict[str,
25
25
  variables["SCRIPTS"] = static.deployment_scripts.read_text(encoding=ENCODING)
26
26
  variables["SPECIFIC_CSS"] = static.deployment_style.read_text(encoding=ENCODING)
27
27
 
28
+ elif template_name == "statistics":
29
+ template = templates.statistics.read_text(encoding=ENCODING)
30
+ variables["SCRIPTS"] = static.statistics_scripts.read_text(encoding=ENCODING)
31
+ variables["SPECIFIC_CSS"] = static.statistics_style.read_text(encoding=ENCODING)
32
+
28
33
  for key, value in variables.items():
29
34
  template = template.replace(f"{{{{{key}}}}}", str(value))
30
35
  return template
@@ -6,3 +6,6 @@ issues_scripts = Path(__file__).parent / "issues.js"
6
6
 
7
7
  deployment_style = Path(__file__).parent / "deployment.css"
8
8
  deployment_scripts = Path(__file__).parent / "deployment.js"
9
+
10
+ statistics_style = Path(__file__).parent / "statistics.css"
11
+ statistics_scripts = Path(__file__).parent / "statistics.js"
@@ -0,0 +1,163 @@
1
+ .statistics-container {
2
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
3
+ padding: 20px;
4
+ background: var(--bg-secondary);
5
+ border-radius: 8px;
6
+ color: var(--text-primary);
7
+ transition: all 0.3s ease;
8
+ }
9
+
10
+ .statistics-header {
11
+ margin-bottom: 24px;
12
+ position: relative;
13
+ }
14
+
15
+ .statistics-title {
16
+ margin: 0 0 8px 0;
17
+ font-size: 24px;
18
+ font-weight: 600;
19
+ color: var(--text-primary);
20
+ }
21
+
22
+ .statistics-subtitle {
23
+ margin: 0;
24
+ font-size: 14px;
25
+ color: var(--text-secondary);
26
+ }
27
+
28
+ .theme-toggle {
29
+ position: absolute;
30
+ top: 0;
31
+ right: 0;
32
+ padding: 8px 12px;
33
+ background: var(--bg-primary);
34
+ border: 2px solid var(--border-color);
35
+ border-radius: 6px;
36
+ color: var(--text-primary);
37
+ cursor: pointer;
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 6px;
41
+ font-size: 13px;
42
+ font-weight: 500;
43
+ transition: all 0.2s;
44
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
45
+ }
46
+
47
+ .theme-toggle:hover {
48
+ background: var(--hover-bg);
49
+ border-color: var(--text-secondary);
50
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
51
+ }
52
+
53
+ .theme-toggle:active {
54
+ transform: scale(0.98);
55
+ }
56
+
57
+ .statistics-grid {
58
+ display: grid;
59
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
60
+ gap: 16px;
61
+ margin-bottom: 20px;
62
+ }
63
+
64
+ .stat-card {
65
+ background: var(--bg-primary);
66
+ padding: 16px;
67
+ border-radius: 6px;
68
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
69
+ border: 1px solid var(--border-light);
70
+ transition: all 0.3s ease;
71
+ }
72
+
73
+ .stat-label {
74
+ margin: 0 0 12px 0;
75
+ font-size: 14px;
76
+ color: var(--text-secondary);
77
+ text-transform: uppercase;
78
+ letter-spacing: 0.5px;
79
+ font-weight: 600;
80
+ }
81
+
82
+ .stat-value {
83
+ display: flex;
84
+ align-items: baseline;
85
+ margin-bottom: 12px;
86
+ }
87
+
88
+ .stat-current {
89
+ font-size: 28px;
90
+ font-weight: bold;
91
+ color: var(--text-primary);
92
+ }
93
+
94
+ .stat-limit {
95
+ color: var(--text-muted);
96
+ margin-left: 8px;
97
+ font-size: 14px;
98
+ }
99
+
100
+ .stat-progress-bg {
101
+ background: var(--border-light);
102
+ border-radius: 4px;
103
+ height: 8px;
104
+ overflow: hidden;
105
+ margin-bottom: 8px;
106
+ }
107
+
108
+ .stat-progress-bar {
109
+ height: 100%;
110
+ transition: width 0.3s ease, background 0.3s ease;
111
+ background: #10b981;
112
+ }
113
+
114
+ .stat-usage {
115
+ font-size: 12px;
116
+ font-weight: 500;
117
+ color: #10b981;
118
+ transition: color 0.3s ease;
119
+ }
120
+
121
+ .statistics-additional {
122
+ background: var(--bg-primary);
123
+ padding: 16px;
124
+ border-radius: 6px;
125
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
126
+ border: 1px solid var(--border-light);
127
+ transition: all 0.3s ease;
128
+ }
129
+
130
+ .additional-title {
131
+ margin: 0 0 12px 0;
132
+ font-size: 14px;
133
+ color: var(--text-secondary);
134
+ text-transform: uppercase;
135
+ letter-spacing: 0.5px;
136
+ font-weight: 600;
137
+ }
138
+
139
+ .additional-content {
140
+ display: grid;
141
+ grid-template-columns: 1fr 1fr;
142
+ gap: 12px;
143
+ }
144
+
145
+ .component-item {
146
+ color: var(--text-primary);
147
+ transition: color 0.3s ease;
148
+ }
149
+
150
+ .component-item strong {
151
+ color: var(--text-primary);
152
+ }
153
+
154
+ .component-value {
155
+ color: #0066cc;
156
+ font-weight: 600;
157
+ margin-left: 8px;
158
+ transition: color 0.3s ease;
159
+ }
160
+
161
+ .dark-mode .component-value {
162
+ color: #60a5fa;
163
+ }
@@ -0,0 +1,108 @@
1
+ function initializeStatistics(uniqueId) {
2
+ /**
3
+ * Initialize stat cards with data from attributes and apply colors.
4
+ * Supports light/dark mode with color schema from shared CSS.
5
+ * Uses uniqueId to support multiple instances on the same page.
6
+ */
7
+
8
+ function getColor(percentage) {
9
+ if (percentage < 50) return '#10b981'; // green
10
+ if (percentage < 80) return '#f59e0b'; // amber
11
+ return '#ef4444'; // red
12
+ }
13
+
14
+ function renderCards() {
15
+ const container = document.getElementById('statisticsContainer-' + uniqueId);
16
+ if (!container) return;
17
+
18
+ const cards = container.querySelectorAll('.stat-card');
19
+
20
+ cards.forEach(card => {
21
+ // Skip if already rendered
22
+ if (card.querySelector('.stat-label')) return;
23
+
24
+ const current = parseInt(card.dataset.current);
25
+ const limit = parseInt(card.dataset.limit);
26
+ const label = card.dataset.label;
27
+ const percentage = (current / limit * 100) || 0;
28
+ const color = getColor(percentage);
29
+
30
+ // Build card HTML
31
+ card.innerHTML = `
32
+ <h3 class="stat-label">${label}</h3>
33
+ <div class="stat-value">
34
+ <span class="stat-current">${current}</span>
35
+ <span class="stat-limit">/ ${limit}</span>
36
+ </div>
37
+ <div class="stat-progress-bg">
38
+ <div class="stat-progress-bar" style="background: ${color}; width: ${Math.min(percentage, 100)}%;"></div>
39
+ </div>
40
+ <div class="stat-usage" style="color: ${color};">${percentage.toFixed(1)}% used</div>
41
+ `;
42
+ });
43
+ }
44
+
45
+ function setupThemeToggle() {
46
+ const container = document.getElementById('statisticsContainer-' + uniqueId);
47
+ if (!container) return;
48
+
49
+ // Check if theme toggle already exists
50
+ if (container.querySelector('.theme-toggle')) return;
51
+
52
+ // Create theme toggle button
53
+ const header = container.querySelector('.statistics-header');
54
+ if (!header) return;
55
+
56
+ const themeToggle = document.createElement('button');
57
+ themeToggle.className = 'theme-toggle';
58
+ themeToggle.id = 'themeToggleStats-' + uniqueId;
59
+ themeToggle.innerHTML = '<span id="themeIcon-' + uniqueId + '">🌙</span><span id="themeText-' + uniqueId + '">Dark</span>';
60
+
61
+ header.appendChild(themeToggle);
62
+
63
+ // Load saved theme preference
64
+ const storageKey = 'neat-statistics-theme-' + uniqueId;
65
+ const savedTheme = localStorage.getItem(storageKey) || 'light';
66
+
67
+ // Toggle theme on button click
68
+ themeToggle.addEventListener('click', () => {
69
+ const isDarkMode = container.classList.contains('dark-mode');
70
+ const newTheme = isDarkMode ? 'light' : 'dark';
71
+ applyTheme(newTheme);
72
+ localStorage.setItem(storageKey, newTheme);
73
+ });
74
+
75
+ function applyTheme(theme) {
76
+ const isDark = theme === 'dark';
77
+ const themeIcon = document.querySelector('#themeIcon-' + uniqueId);
78
+ const themeText = document.querySelector('#themeText-' + uniqueId);
79
+
80
+ if (isDark) {
81
+ container.classList.add('dark-mode');
82
+ if (themeIcon) themeIcon.textContent = '☀️';
83
+ if (themeText) themeText.textContent = 'Light';
84
+ } else {
85
+ container.classList.remove('dark-mode');
86
+ if (themeIcon) themeIcon.textContent = '🌙';
87
+ if (themeText) themeText.textContent = 'Dark';
88
+ }
89
+ }
90
+
91
+ // Apply initial theme
92
+ applyTheme(savedTheme);
93
+ }
94
+
95
+ // Render cards and setup theme toggle
96
+ renderCards();
97
+ setupThemeToggle();
98
+ }
99
+
100
+ // Call immediately with uniqueId for Jupyter notebooks
101
+ initializeStatistics(uniqueId);
102
+
103
+ // Also try on DOMContentLoaded for regular HTML pages
104
+ if (document.readyState === 'loading') {
105
+ document.addEventListener('DOMContentLoaded', function() {
106
+ initializeStatistics(uniqueId);
107
+ });
108
+ }
@@ -2,3 +2,4 @@ from pathlib import Path
2
2
 
3
3
  issues = Path(__file__).parent / "issues.html"
4
4
  deployment = Path(__file__).parent / "deployment.html"
5
+ statistics = Path(__file__).parent / "statistics.html"
@@ -0,0 +1,26 @@
1
+ <style>
2
+ {{SHARED_CSS}}
3
+ {{SPECIFIC_CSS}}
4
+ </style>
5
+
6
+ <div class="statistics-container" id="statisticsContainer-{{unique_id}}">
7
+ <div class="statistics-header">
8
+ <h2 class="statistics-title">CDF DMS Statistics</h2>
9
+ <p class="statistics-subtitle">Project usage and limits overview</p>
10
+ </div>
11
+
12
+ <div class="statistics-grid">
13
+ <div class="stat-card" data-current="{{spaces_current}}" data-limit="{{spaces_limit}}" data-label="Spaces"></div>
14
+ <div class="stat-card" data-current="{{containers_current}}" data-limit="{{containers_limit}}" data-label="Containers"></div>
15
+ <div class="stat-card" data-current="{{views_current}}" data-limit="{{views_limit}}" data-label="Views"></div>
16
+ <div class="stat-card" data-current="{{data_models_current}}" data-limit="{{data_models_limit}}" data-label="Data Models"></div>
17
+ </div>
18
+
19
+ </div>
20
+
21
+ <script>
22
+ (function() {
23
+ const uniqueId = '{{unique_id}}';
24
+ {{SCRIPTS}}
25
+ })();
26
+ </script>
@@ -10,6 +10,7 @@ from cognite.neat._state_machine import EmptyState, PhysicalState
10
10
  from cognite.neat._store import NeatStore
11
11
  from cognite.neat._utils.http_client import ParametersRequest, SuccessResponse
12
12
 
13
+ from ._cdf import CDF
13
14
  from ._issues import Issues
14
15
  from ._physical import PhysicalDataModel
15
16
  from ._result import Result
@@ -51,6 +52,9 @@ class NeatSession:
51
52
  self.issues = Issues(self._store)
52
53
  self.result = Result(self._store)
53
54
 
55
+ if self._config.alpha.enable_cdf_analysis:
56
+ self.cdf = CDF(self._store, self._client, self._config)
57
+
54
58
  collector = Collector()
55
59
  if collector.can_collect:
56
60
  collector.collect("initSession", {"mode": self._config.modeling.mode})
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from typing import IO, Any, TextIO
7
7
  from urllib.parse import urlparse
8
8
 
9
- import requests
9
+ import httpx
10
10
 
11
11
 
12
12
  class NeatReader(ABC):
@@ -124,24 +124,24 @@ class HttpFileReader(NeatReader):
124
124
  return self.path
125
125
 
126
126
  def read_text(self) -> str:
127
- response = requests.get(self._url)
127
+ response = httpx.get(self._url)
128
128
  response.raise_for_status()
129
129
  return response.text
130
130
 
131
131
  def read_bytes(self) -> bytes:
132
- response = requests.get(self._url)
132
+ response = httpx.get(self._url)
133
133
  response.raise_for_status()
134
134
  return response.content
135
135
 
136
136
  def size(self) -> int:
137
- response = requests.head(self._url)
137
+ response = httpx.head(self._url)
138
138
  response.raise_for_status()
139
139
  return int(response.headers["Content-Length"])
140
140
 
141
141
  def iterate(self, chunk_size: int) -> Iterable[str]:
142
- with requests.get(self._url, stream=True) as response:
142
+ with httpx.stream("GET", self._url) as response:
143
143
  response.raise_for_status()
144
- for chunk in response.iter_content(chunk_size):
144
+ for chunk in response.iter_bytes(chunk_size):
145
145
  yield chunk.decode("utf-8")
146
146
 
147
147
  def __enter__(self) -> IO:
@@ -151,7 +151,7 @@ class HttpFileReader(NeatReader):
151
151
  return self._url
152
152
 
153
153
  def exists(self) -> bool:
154
- response = requests.head(self._url)
154
+ response = httpx.head(self._url)
155
155
  return 200 <= response.status_code < 400
156
156
 
157
157
  def materialize_path(self) -> Path:
cognite/neat/_version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "1.0.26"
1
+ __version__ = "1.0.28"
2
2
  __engine__ = "^2.0.4"
cognite/neat/legacy.py CHANGED
@@ -1,3 +1,13 @@
1
+ import importlib
2
+
3
+ from cognite.neat._exceptions import NeatImportError
4
+
5
+ try:
6
+ importlib.import_module("rdflib")
7
+ except ImportError as e:
8
+ raise NeatImportError("legacy module", "legacy") from e
9
+
10
+
1
11
  from cognite.neat._v0.core._utils.auth import get_cognite_client
2
12
  from cognite.neat._v0.session._base import NeatSession
3
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognite-neat
3
- Version: 1.0.26
3
+ Version: 1.0.28
4
4
  Summary: Knowledge graph transformation
5
5
  Author: Nikola Vasiljevic, Anders Albert
6
6
  Author-email: Nikola Vasiljevic <nikola.vasiljevic@cognite.com>, Anders Albert <anders.albert@cognite.com>
@@ -17,22 +17,14 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Operating System :: OS Independent
20
- Requires-Dist: pandas>=1.5.3,<3.0.0
21
20
  Requires-Dist: cognite-sdk>=7.83.0,<8.0.0
22
- Requires-Dist: rdflib>=7.0.0,<8.0.0
23
21
  Requires-Dist: httpx>=0.28.1
24
22
  Requires-Dist: pydantic>=2.0.0,<3.0.0
25
23
  Requires-Dist: pyyaml>=6.0.1,<7.0.0
26
- Requires-Dist: requests>=2.28.1,<3.0.0
27
24
  Requires-Dist: urllib3>=1.26.15,<3.0.0
28
25
  Requires-Dist: openpyxl>=3.0.10,<4.0.0
29
26
  Requires-Dist: networkx>=3.4.2,<4.0.0
30
27
  Requires-Dist: mixpanel>=4.10.1,<5.0.0
31
- Requires-Dist: packaging>=22.0
32
- Requires-Dist: jsonpath-python>=1.0.6,<2.0.0
33
- Requires-Dist: elementpath>=4.0.0,<5.0.0
34
- Requires-Dist: pyvis>=0.3.2,<1.0.0
35
- Requires-Dist: rich[jupyter]>=13.7.1,<14.0.0
36
28
  Requires-Dist: exceptiongroup>=1.1.3,<2.0.0 ; python_full_version < '3.11'
37
29
  Requires-Dist: backports-strenum>=1.2,<2.0.0 ; python_full_version < '3.11'
38
30
  Requires-Dist: typing-extensions>=4.8.0,<5.0.0 ; python_full_version < '3.11'
@@ -51,6 +43,14 @@ Requires-Dist: mkdocs-autorefs>=0.5.0,<1.0.0 ; extra == 'docs'
51
43
  Requires-Dist: gspread>=5.0.0,<6.0.0 ; extra == 'google'
52
44
  Requires-Dist: google-api-python-client>=2.70.0,<3.0.0 ; extra == 'google'
53
45
  Requires-Dist: google-auth-oauthlib>=1.0.0,<2.0.0 ; extra == 'google'
46
+ Requires-Dist: rdflib>=7.0.0,<8.0.0 ; extra == 'legacy'
47
+ Requires-Dist: pandas>=1.5.3,<3.0.0 ; extra == 'legacy'
48
+ Requires-Dist: requests>=2.28.1,<3.0.0 ; extra == 'legacy'
49
+ Requires-Dist: packaging>=22.0 ; extra == 'legacy'
50
+ Requires-Dist: jsonpath-python>=1.0.6,<2.0.0 ; extra == 'legacy'
51
+ Requires-Dist: elementpath>=4.0.0,<5.0.0 ; extra == 'legacy'
52
+ Requires-Dist: pyvis>=0.3.2,<1.0.0 ; extra == 'legacy'
53
+ Requires-Dist: rich[jupyter]>=13.7.1,<14.0.0 ; extra == 'legacy'
54
54
  Requires-Dist: lxml>=5.3.0,<6.0.0 ; extra == 'lxml'
55
55
  Requires-Dist: oxrdflib>=0.4.0,<0.5.0 ; extra == 'oxi'
56
56
  Requires-Dist: pyoxigraph>=0.4.3,<0.5.0 ; extra == 'oxi'
@@ -61,6 +61,7 @@ Project-URL: GitHub, https://github.com/cognitedata/neat
61
61
  Project-URL: Changelog, https://github.com/cognitedata/neat/releases
62
62
  Provides-Extra: docs
63
63
  Provides-Extra: google
64
+ Provides-Extra: legacy
64
65
  Provides-Extra: lxml
65
66
  Provides-Extra: oxi
66
67
  Description-Content-Type: text/markdown
@@ -15,7 +15,7 @@ cognite/neat/_client/init/main.py,sha256=D-9bsor07T84iFnTZLnhIFA1Xey9zsooHaDhXVe
15
15
  cognite/neat/_client/spaces_api.py,sha256=yb26ju3sKbVgiduMEbN4LDGan6vsC3z_JaW3p4FUdr0,2929
16
16
  cognite/neat/_client/statistics_api.py,sha256=5meeh0v5mxC2SMB7xGdOwMh4KkaX3DtpUjbGEPhNBJo,913
17
17
  cognite/neat/_client/views_api.py,sha256=YMaw7IaxU4gmixpd_t1u9JK9BHfNerf5DMNinGPCAa0,3692
18
- cognite/neat/_config.py,sha256=ZvCkcaRVAvH4-ClvinoWaLWhRJpRByqdvncGFsf5gLk,9886
18
+ cognite/neat/_config.py,sha256=RVVV6qTkFlS88lJKShIcz9pcCV4OlCxFW8dUbSi50-4,10003
19
19
  cognite/neat/_data_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  cognite/neat/_data_model/_analysis.py,sha256=dN-udKm_5oD3217O4B_QIps2Hx4v50-Pu2fR0bQNQg0,23504
21
21
  cognite/neat/_data_model/_constants.py,sha256=E2axzdYjsIy7lTHsjW91wsv6r-pUwko8g6K8C_oRnxk,1707
@@ -41,7 +41,7 @@ cognite/neat/_data_model/importers/__init__.py,sha256=dHnKnC_AXk42z6wzEHK15dxIOh
41
41
  cognite/neat/_data_model/importers/_api_importer.py,sha256=H8Ow3Tt7utuAuBhC6s7yWvhGqunHAtE0r0XRsVAr6IE,7280
42
42
  cognite/neat/_data_model/importers/_base.py,sha256=NRB0FcEBj4GaethU68nRffBfTedBBA866A3zfJNfmiQ,433
43
43
  cognite/neat/_data_model/importers/_table_importer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- cognite/neat/_data_model/importers/_table_importer/data_classes.py,sha256=wnFMrzLRWAsPyMBMZ7W02JLMtjMJRG0VGsXDrj_Ww5Y,11487
44
+ cognite/neat/_data_model/importers/_table_importer/data_classes.py,sha256=_Hfub4GZNxiq01JcxijjeNFaecJXQmmMNoFe7apo0iM,11466
45
45
  cognite/neat/_data_model/importers/_table_importer/importer.py,sha256=lQ4_Gpv0haEwQEDYZJaxtR9dL6Y0ys9jbjFfWxH6s2o,8870
46
46
  cognite/neat/_data_model/importers/_table_importer/reader.py,sha256=5NkUvem9sR3WUM1vtfm6duu76oD3vQ0gi6UuBOcr3bo,50933
47
47
  cognite/neat/_data_model/importers/_table_importer/source.py,sha256=h7u5ur5oetmvBs3wgj7Ody5uPF21QwxeAceoIhJ5qzo,3300
@@ -61,7 +61,7 @@ cognite/neat/_data_model/models/dms/_data_model.py,sha256=tq_JGNN-1JxG46bhBhunZi
61
61
  cognite/neat/_data_model/models/dms/_data_types.py,sha256=FMt_d5aJD-o3s9VQWyyCVlHk7D_p3RlSNXBP1OACPs4,6424
62
62
  cognite/neat/_data_model/models/dms/_http.py,sha256=YIRRowqkphFAYkx3foTeLyPMe9fNnmzhUCBDXe0u9Kk,926
63
63
  cognite/neat/_data_model/models/dms/_indexes.py,sha256=ZtXe8ABuRcsAwRIZ9FCanS3uwZHpkOAhvDvjSXtx_Fs,900
64
- cognite/neat/_data_model/models/dms/_limits.py,sha256=x_X7T50SkwPNo_aHTGCr35hDXI8FRdZLYIB9HpFqnIk,3520
64
+ cognite/neat/_data_model/models/dms/_limits.py,sha256=-vwRutprJ7rPXLleSxCh_satR9AqRAvEMig5wSVBEXg,3596
65
65
  cognite/neat/_data_model/models/dms/_references.py,sha256=Mx_nxfvOrvAx7nvebhhbFw6eRm3nHqeFW5P5AqADUlM,3890
66
66
  cognite/neat/_data_model/models/dms/_schema.py,sha256=2JFLcm52smzPdtZ69Lf02UbYAD8I_hpRbI7ZAzdxJJs,641
67
67
  cognite/neat/_data_model/models/dms/_space.py,sha256=mj6gID4vcAGsHNtgfXm4_4FMOQbUOkMd3HaYEdy07XM,1895
@@ -82,23 +82,27 @@ cognite/neat/_data_model/validation/dms/_base.py,sha256=G_gMPTgKwyBW62UcCkKIBVHW
82
82
  cognite/neat/_data_model/validation/dms/_connections.py,sha256=-kUXf2_3V50ckxwXRwJoTHsKkS5zxiBKkkkHg8Dm4WI,30353
83
83
  cognite/neat/_data_model/validation/dms/_consistency.py,sha256=IKSUoRQfQQcsymviESW9VuTFX7jsZMXfsObeZHPdov4,2435
84
84
  cognite/neat/_data_model/validation/dms/_containers.py,sha256=8pVnmeX6G9tQaGzzwRB_40y7TYUm4guaNbRiFgoGILU,9895
85
- cognite/neat/_data_model/validation/dms/_limits.py,sha256=U7z8sN-kAyJsF5hYHPNBBg25Fvz1F8njhzYVSQOIiOU,14779
85
+ cognite/neat/_data_model/validation/dms/_limits.py,sha256=rAIh54DJBPi3J7d7eD-jMdldZS8R2vlkQ5MD9RxNsrI,14830
86
86
  cognite/neat/_data_model/validation/dms/_orchestrator.py,sha256=qiuUSUmNhekFyBARUUO2yhG-X9AeU_LL49UrJ65JXFA,2964
87
87
  cognite/neat/_data_model/validation/dms/_views.py,sha256=pRdnj5ZBnHNnbLKleXGbipteGma8_l5AYsDIfqgAil4,6345
88
88
  cognite/neat/_exceptions.py,sha256=mO19TEecZYDNqSvzuc6JmCLFQ70eniT1-Gb0AEbgbzE,2090
89
89
  cognite/neat/_issues.py,sha256=wH1mnkrpBsHUkQMGUHFLUIQWQlfJ_qMfdF7q0d9wNhY,1871
90
90
  cognite/neat/_session/__init__.py,sha256=owqW5Mml2DSZx1AvPvwNRTBngfhBNrQ6EH-7CKL7Jp0,61
91
+ cognite/neat/_session/_cdf.py,sha256=Ps49pc2tKriImpDkcIABnCgrfoX-L3QGmnXK8ceJ1Lc,1365
91
92
  cognite/neat/_session/_html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- cognite/neat/_session/_html/_render.py,sha256=fD8iee4ql50CrHGH41SSh9Tw1lM0tHt-NF0OnnxHosg,1193
93
- cognite/neat/_session/_html/static/__init__.py,sha256=ZLQFJMITBgbiyTRaVbFAm1l-Dhr5pXKKsfY8jjD3ZhY,305
93
+ cognite/neat/_session/_html/_render.py,sha256=ksauN5-lW9GFakPILfaql3CGXpVMwIuvaY8XaEjhFnE,1520
94
+ cognite/neat/_session/_html/static/__init__.py,sha256=VLqgkeITPLrR_WAbVkc_BtGOaHCHbreTHewkoCdgPgQ,427
94
95
  cognite/neat/_session/_html/static/deployment.css,sha256=wug_K8-h281UTrUJE2l4EbLSjZCO56yZBbP9iUwaYew,7823
95
96
  cognite/neat/_session/_html/static/deployment.js,sha256=mOVNWLgDAOdNUGFFJmI527pmMYHOAFFrpthFpO0w0-o,6969
96
97
  cognite/neat/_session/_html/static/issues.css,sha256=Egvqo2cnY8FKTtZp_v3rTWcIgb1vTJvToNCJJovWm70,3824
97
98
  cognite/neat/_session/_html/static/issues.js,sha256=NHx_iAsZTvpZjOoFsxFU_sxqjF4-F4EdHRmoc2DjpIE,6348
98
99
  cognite/neat/_session/_html/static/shared.css,sha256=uUm5fqK1zrMBWCuAWdUoBRaAj9AO611hUxuGvxMzbzc,4190
99
- cognite/neat/_session/_html/templates/__init__.py,sha256=hgufJuBxUZ2nLCMTCxGixmk5ztZF38HzPcvtBkWJwxw,128
100
+ cognite/neat/_session/_html/static/statistics.css,sha256=slVBqYfyX_kRw0jei07Okc3k0p7vjtv2pZ0wMoBXO8g,3174
101
+ cognite/neat/_session/_html/static/statistics.js,sha256=oJUcdZWRaMObuYh3I5mziHyC02va79t3j991LCIhbhY,4132
102
+ cognite/neat/_session/_html/templates/__init__.py,sha256=UrIzxTgHfe67CB0Q9nxi38gLpVxTkhoUYTdcjLw_zYk,183
100
103
  cognite/neat/_session/_html/templates/deployment.html,sha256=aLDXMbF3pcSqnCpUYVGmIWfqU2jyYUUTaGfpSHRLzdU,3715
101
104
  cognite/neat/_session/_html/templates/issues.html,sha256=zjhkJcPK0hMp_ZKJ9RCf88tuZxQyTYRPxzpqx33Nkt0,1661
105
+ cognite/neat/_session/_html/templates/statistics.html,sha256=C-ghoT8xzBehAJLOonNzCB418LW-FA60MaZBHlW1D5c,968
102
106
  cognite/neat/_session/_issues.py,sha256=E8UQeSJURg2dm4MF1pfD9dp-heSRT7pgQZgKlD1-FGs,2723
103
107
  cognite/neat/_session/_physical.py,sha256=e3i9xuLa4bMOa-mJxbf4AyLZ2UnPOPh05P-E7E0lRHY,12449
104
108
  cognite/neat/_session/_result/__init__.py,sha256=8A0BKgsqnjxkiHUlCpHBNl3mrFWtyjaWYnh0jssE6QU,50
@@ -108,7 +112,7 @@ cognite/neat/_session/_result/_deployment/_physical/_changes.py,sha256=CmFWxAMtV
108
112
  cognite/neat/_session/_result/_deployment/_physical/_statistics.py,sha256=aOXZTSOGmVggERB4mKaqQEUx40vrxiN9ZkwjKU1555A,6324
109
113
  cognite/neat/_session/_result/_deployment/_physical/serializer.py,sha256=BbCUb7_C75enMimGgTPg-ZW1QGcRhPDf5dNwpWdM790,1272
110
114
  cognite/neat/_session/_result/_result.py,sha256=OnjIJQSnIzYr-IE50rq7z3CVO0LpVE8tAaZN7XPjlKw,1188
111
- cognite/neat/_session/_session.py,sha256=SsPEYupMiW7zRFruTjC1Ga9yvvs5gkygdpI_tVyh1rA,3729
115
+ cognite/neat/_session/_session.py,sha256=hv7PgS34jrVqLpyXk7PNmmlwZQ8lG4eCMNTKKrS5AL0,3871
112
116
  cognite/neat/_session/_usage_analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
117
  cognite/neat/_session/_usage_analytics/_collector.py,sha256=8yVfzt8KFfZ-ldkVjDWazuQbs45Q3r6vWKcZEwU8i18,4734
114
118
  cognite/neat/_session/_usage_analytics/_constants.py,sha256=-tVdYrCTMKfuMlbO7AlzC29Nug41ug6uuX9DFuihpJg,561
@@ -121,7 +125,7 @@ cognite/neat/_store/__init__.py,sha256=TvM9CcFbtOSrxydPAuJi6Bv_iiGard1Mxfx42ZFoT
121
125
  cognite/neat/_store/_provenance.py,sha256=1zzRDWjR9twZu2jVyIG3UdYdIXtQKJ7uF8a0hV7LEuA,3368
122
126
  cognite/neat/_store/_store.py,sha256=jtJPBQ8PBG0UlgzSJJpzOIRkC2Np3fHNtV4omRC6H5A,9629
123
127
  cognite/neat/_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
- cognite/neat/_utils/_reader.py,sha256=9dXrODNNqWU0Gx1zXjRTOiiByFuDZlpQkQEzx3HAxYQ,5390
128
+ cognite/neat/_utils/_reader.py,sha256=pBAwGK_UMd-mGnAP3cXXj3SrORocR3lFKxn-WaVjqsY,5367
125
129
  cognite/neat/_utils/auxiliary.py,sha256=YQMpqCxccex_slmLYrR5icVX9aeLbD793ou7IrbNTFs,1654
126
130
  cognite/neat/_utils/collection.py,sha256=BIwRrFbUXNPvHhEVujLHgVoDJXzdPEMScrbSBhyCibk,446
127
131
  cognite/neat/_utils/http_client/__init__.py,sha256=qaCLLLhi7H3b_cmbknX0S66KILT7JSKX1YSgZjNdd1U,786
@@ -323,9 +327,9 @@ cognite/neat/_v0/session/_template.py,sha256=BNcvrW5y7LWzRM1XFxZkfR1Nc7e8UgjBClH
323
327
  cognite/neat/_v0/session/_to.py,sha256=AnsRSDDdfFyYwSgi0Z-904X7WdLtPfLlR0x1xsu_jAo,19447
324
328
  cognite/neat/_v0/session/_wizard.py,sha256=baPJgXAAF3d1bn4nbIzon1gWfJOeS5T43UXRDJEnD3c,1490
325
329
  cognite/neat/_v0/session/exceptions.py,sha256=jv52D-SjxGfgqaHR8vnpzo0SOJETIuwbyffSWAxSDJw,3495
326
- cognite/neat/_version.py,sha256=lZxKXnsRmb2ksFvFfpJkeZtX4W01ZenoMN457_FWsB0,45
327
- cognite/neat/legacy.py,sha256=eI2ecxOV8ilGHyLZlN54ve_abtoK34oXognkFv3yvF0,219
330
+ cognite/neat/_version.py,sha256=D8wnGH1r0wYJFo06cmkFVRH6v-0euoV5JeDvOyoYFfE,45
331
+ cognite/neat/legacy.py,sha256=DMFeLCSBLT2enk-nm1KfX1rKR2DQDpxY-w6ThY0y9c8,421
328
332
  cognite/neat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
- cognite_neat-1.0.26.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
330
- cognite_neat-1.0.26.dist-info/METADATA,sha256=jISdpgKdsL7q8pj6OfhnOzfV6VI40aR-iYoLlnTjAP0,6689
331
- cognite_neat-1.0.26.dist-info/RECORD,,
333
+ cognite_neat-1.0.28.dist-info/WHEEL,sha256=XV0cjMrO7zXhVAIyyc8aFf1VjZ33Fen4IiJk5zFlC3g,80
334
+ cognite_neat-1.0.28.dist-info/METADATA,sha256=i_1J8DaOFH5SdieuKec3Rp521-bBB0bWdPnO2NSgVZg,6872
335
+ cognite_neat-1.0.28.dist-info/RECORD,,