cognite-neat 0.127.21__py3-none-any.whl → 0.127.22__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.
@@ -4,12 +4,13 @@ let currentFilters = {
4
4
  severity: 'all',
5
5
  };
6
6
  let currentSearch = '';
7
- let isDarkMode = localStorage.getItem('neat-deployment-theme') === 'dark';
7
+ const storageKey = 'neat-deployment-theme-' + uniqueId;
8
+ let isDarkMode = localStorage.getItem(storageKey) === 'dark';
8
9
 
9
- const container = document.getElementById('deploymentContainer');
10
- const themeToggle = document.getElementById('themeToggle');
11
- const themeIcon = document.getElementById('themeIcon');
12
- const themeText = document.getElementById('themeText');
10
+ const container = document.getElementById('deploymentContainer-' + uniqueId);
11
+ const themeToggle = document.getElementById('themeToggle-' + uniqueId);
12
+ const themeIcon = document.getElementById('themeIcon-' + uniqueId);
13
+ const themeText = document.getElementById('themeText-' + uniqueId);
13
14
 
14
15
  // Status configuration
15
16
  const STATUS_CONFIG = {
@@ -21,9 +22,9 @@ const STATUS_CONFIG = {
21
22
 
22
23
  // Initialize status badge
23
24
  function initializeStatus() {
24
- const statusBadge = document.getElementById('statusBadge');
25
- const statusIcon = document.getElementById('statusIcon');
26
- const statusText = document.getElementById('statusText');
25
+ const statusBadge = document.getElementById('statusBadge-' + uniqueId);
26
+ const statusIcon = document.getElementById('statusIcon-' + uniqueId);
27
+ const statusText = document.getElementById('statusText-' + uniqueId);
27
28
 
28
29
  const statusConfig = STATUS_CONFIG[stats.status] || STATUS_CONFIG.pending;
29
30
  statusIcon.textContent = statusConfig.icon;
@@ -47,12 +48,12 @@ initializeStatus();
47
48
 
48
49
  themeToggle.addEventListener('click', function() {
49
50
  isDarkMode = !isDarkMode;
50
- localStorage.setItem('neat-deployment-theme', isDarkMode ? 'dark' : 'light');
51
+ localStorage.setItem(storageKey, isDarkMode ? 'dark' : 'light');
51
52
  updateTheme();
52
53
  });
53
54
 
54
55
  function renderChanges() {
55
- const listContainer = document.getElementById('deploymentList');
56
+ const listContainer = document.getElementById('deploymentList-' + uniqueId);
56
57
  const filtered = changes.filter(change => {
57
58
  const matchesChangeType = currentFilters.changeType === 'all' ||
58
59
  change.change_type === currentFilters.changeType;
@@ -97,9 +98,9 @@ function renderChanges() {
97
98
  }
98
99
 
99
100
  // Change type filters (stat items)
100
- document.querySelectorAll('.stat-item').forEach(item => {
101
+ document.querySelectorAll('#deploymentContainer-' + uniqueId + ' .stat-item').forEach(item => {
101
102
  item.addEventListener('click', function() {
102
- document.querySelectorAll('.stat-item').forEach(i => i.classList.remove('active'));
103
+ document.querySelectorAll('#deploymentContainer-' + uniqueId + ' .stat-item').forEach(i => i.classList.remove('active'));
103
104
  this.classList.add('active');
104
105
  currentFilters.changeType = this.dataset.filter;
105
106
  renderChanges();
@@ -107,10 +108,10 @@ document.querySelectorAll('.stat-item').forEach(item => {
107
108
  });
108
109
 
109
110
  // Other filters
110
- document.querySelectorAll('.filter-btn').forEach(btn => {
111
+ document.querySelectorAll('#deploymentContainer-' + uniqueId + ' .filter-btn').forEach(btn => {
111
112
  btn.addEventListener('click', function() {
112
113
  const filterType = this.dataset.filterType;
113
- document.querySelectorAll(`[data-filter-type="${filterType}"]`).forEach(b =>
114
+ document.querySelectorAll('#deploymentContainer-' + uniqueId + ` [data-filter-type="${filterType}"]`).forEach(b =>
114
115
  b.classList.remove('active')
115
116
  );
116
117
  this.classList.add('active');
@@ -120,13 +121,13 @@ document.querySelectorAll('.filter-btn').forEach(btn => {
120
121
  });
121
122
 
122
123
  // Search
123
- document.getElementById('searchInput').addEventListener('input', function(e) {
124
+ document.getElementById('searchInput-' + uniqueId).addEventListener('input', function(e) {
124
125
  currentSearch = e.target.value;
125
126
  renderChanges();
126
127
  });
127
128
 
128
129
  // Export function
129
- window.exportDeployment = function() {
130
+ window['exportDeployment_' + uniqueId] = function() {
130
131
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
131
132
  const report = {
132
133
  status: stats.status,
@@ -3,17 +3,17 @@
3
3
  {{SPECIFIC_CSS}}
4
4
  </style>
5
5
 
6
- <div class="issues-container deployment-container" id="deploymentContainer">
6
+ <div class="issues-container deployment-container" id="deploymentContainer-{{unique_id}}">
7
7
  <div class="issues-header deployment-header">
8
- <button class="theme-toggle" id="themeToggle">
9
- <span id="themeIcon">🌙</span>
10
- <span id="themeText">Dark</span>
8
+ <button class="theme-toggle" id="themeToggle-{{unique_id}}">
9
+ <span id="themeIcon-{{unique_id}}">🌙</span>
10
+ <span id="themeText-{{unique_id}}">Dark</span>
11
11
  </button>
12
12
  <h2 class="deployment-title issues-title">
13
13
  <span>Deployment Result</span>
14
- <span class="status-badge status-{{status}}" id="statusBadge">
15
- <span id="statusIcon"></span>
16
- <span id="statusText"></span>
14
+ <span class="status-badge status-{{status}}" id="statusBadge-{{unique_id}}">
15
+ <span id="statusIcon-{{unique_id}}"></span>
16
+ <span id="statusText-{{unique_id}}"></span>
17
17
  </span>
18
18
  </h2>
19
19
  <div class="deployment-stats issues-stats">
@@ -35,7 +35,7 @@
35
35
  <div class="stat-item" data-filter="unchanged">
36
36
  <span class="stat-number">{{unchanged}}</span> Unchanged
37
37
  </div>
38
- <button class="export-btn" onclick="exportDeployment()">Export Report</button>
38
+ <button class="export-btn" onclick="exportDeployment_{{unique_id}}()">Export Report</button>
39
39
  </div>
40
40
  </div>
41
41
 
@@ -58,17 +58,18 @@
58
58
  </div>
59
59
 
60
60
  <div class="control-group">
61
- <input type="text" class="search-input" placeholder="🔍 Search resource IDs, changes..." id="searchInput">
61
+ <input type="text" class="search-input" placeholder="🔍 Search resource IDs, changes..." id="searchInput-{{unique_id}}">
62
62
  </div>
63
63
  </div>
64
64
 
65
- <div class="deployment-list issues-list" id="deploymentList"></div>
65
+ <div class="deployment-list issues-list" id="deploymentList-{{unique_id}}"></div>
66
66
  </div>
67
67
 
68
68
  <script>
69
69
  (function() {
70
70
  const changes = {{CHANGES_JSON}};
71
71
  const stats = {{STATS_JSON}};
72
+ const uniqueId = '{{unique_id}}';
72
73
  {{SCRIPTS}}
73
74
  })();
74
75
  </script>
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import uuid
2
3
  from typing import Any, get_args
3
4
 
4
5
  from pydantic import BaseModel, Field
@@ -203,6 +204,9 @@ class Result:
203
204
 
204
205
  def _build_template_vars(self, stats: DeploymentStatistics) -> dict[str, Any]:
205
206
  """Build template variables from statistics."""
207
+ # Generate unique ID for this render to avoid conflicts in Jupyter
208
+ unique_id = uuid.uuid4().hex[:8]
209
+
206
210
  # Convert Pydantic models to dicts for JSON serialization
207
211
  serialized_changes = [change.model_dump() for change in self._serialized_changes]
208
212
 
@@ -216,6 +220,7 @@ class Result:
216
220
  "deleted": stats.by_change_type.delete,
217
221
  "skipped": stats.by_change_type.skip,
218
222
  "unchanged": stats.by_change_type.unchanged,
223
+ "unique_id": unique_id,
219
224
  }
220
225
 
221
226
  def _repr_html_(self) -> str:
cognite/neat/_version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "0.127.21"
1
+ __version__ = "0.127.22"
2
2
  __engine__ = "^2.0.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognite-neat
3
- Version: 0.127.21
3
+ Version: 0.127.22
4
4
  Summary: Knowledge graph transformation
5
5
  Project-URL: Documentation, https://cognite-neat.readthedocs-hosted.com/
6
6
  Project-URL: Homepage, https://cognite-neat.readthedocs-hosted.com/
@@ -1,7 +1,7 @@
1
1
  cognite/neat/__init__.py,sha256=Lo4DbjDOwnhCYUoAgPp5RG1fDdF7OlnomalTe7n1ydw,211
2
2
  cognite/neat/_exceptions.py,sha256=ox-5hXpee4UJlPE7HpuEHV2C96aLbLKo-BhPDoOAzhA,1650
3
3
  cognite/neat/_issues.py,sha256=wH1mnkrpBsHUkQMGUHFLUIQWQlfJ_qMfdF7q0d9wNhY,1871
4
- cognite/neat/_version.py,sha256=6TSmw-RWqsWG5I8-dNbvOb-gEQhv4rs3V4jd6qB5P8s,47
4
+ cognite/neat/_version.py,sha256=Lln5aX0eKRyzYKw67isIIefxhPXDVBWcCGy6IFleQUM,47
5
5
  cognite/neat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  cognite/neat/v1.py,sha256=owqW5Mml2DSZx1AvPvwNRTBngfhBNrQ6EH-7CKL7Jp0,61
7
7
  cognite/neat/_client/__init__.py,sha256=75Bh7eGhaN4sOt3ZcRzHl7pXaheu1z27kmTHeaI05vo,114
@@ -86,19 +86,19 @@ cognite/neat/_session/__init__.py,sha256=owqW5Mml2DSZx1AvPvwNRTBngfhBNrQ6EH-7CKL
86
86
  cognite/neat/_session/_issues.py,sha256=E8UQeSJURg2dm4MF1pfD9dp-heSRT7pgQZgKlD1-FGs,2723
87
87
  cognite/neat/_session/_opt.py,sha256=QcVK08JMmVzJpD0GKHelbljMOQi6CMD1w-maQOlbyZQ,1350
88
88
  cognite/neat/_session/_physical.py,sha256=VyMvvPyN9khR_26rMS0kVuZg23k5c8Hfs7XDeMrkF_w,10526
89
- cognite/neat/_session/_result.py,sha256=P_7d92OSSJAusjKMTTdsc67CKnPDGUSitlGxSk0KB_A,7714
89
+ cognite/neat/_session/_result.py,sha256=po2X4s-Tioe0GQAGCfK862hKXNRX5YjJZsEzNcTC8nI,7879
90
90
  cognite/neat/_session/_session.py,sha256=rezw1MEMN8DPA6waULt5-mdeMuwq3ZNnSb1CSsKM0ko,2584
91
91
  cognite/neat/_session/_wrappers.py,sha256=9t_MnJ0Sw_v-f6oTIh8dtAT-3oEbqumGuND97aPCC3M,3581
92
92
  cognite/neat/_session/_html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  cognite/neat/_session/_html/_render.py,sha256=fD8iee4ql50CrHGH41SSh9Tw1lM0tHt-NF0OnnxHosg,1193
94
94
  cognite/neat/_session/_html/static/__init__.py,sha256=ZLQFJMITBgbiyTRaVbFAm1l-Dhr5pXKKsfY8jjD3ZhY,305
95
95
  cognite/neat/_session/_html/static/deployment.css,sha256=wRv2G0NKIxSq4kyOqd3ajZY60KeT4D6-D3lG-TmzURY,4894
96
- cognite/neat/_session/_html/static/deployment.js,sha256=3pcQYaW9NAGfeMotZIUIvA6PsWCyrMkJkz3ykNB5lh4,5490
96
+ cognite/neat/_session/_html/static/deployment.js,sha256=0fNAIYYtDJR6RhvZvnRSN6UvgvnWTXb_UFUSDxsI9JU,5795
97
97
  cognite/neat/_session/_html/static/issues.css,sha256=Egvqo2cnY8FKTtZp_v3rTWcIgb1vTJvToNCJJovWm70,3824
98
98
  cognite/neat/_session/_html/static/issues.js,sha256=NHx_iAsZTvpZjOoFsxFU_sxqjF4-F4EdHRmoc2DjpIE,6348
99
99
  cognite/neat/_session/_html/static/shared.css,sha256=uUm5fqK1zrMBWCuAWdUoBRaAj9AO611hUxuGvxMzbzc,4190
100
100
  cognite/neat/_session/_html/templates/__init__.py,sha256=hgufJuBxUZ2nLCMTCxGixmk5ztZF38HzPcvtBkWJwxw,128
101
- cognite/neat/_session/_html/templates/deployment.html,sha256=COETMP0EEA46xzPlY-RTHo5TdtonV-dscZr15GAY0fs,3309
101
+ cognite/neat/_session/_html/templates/deployment.html,sha256=rhqcBI5no8h0BEiwTIQy5A3wvBygytCUolpc50yFiTE,3487
102
102
  cognite/neat/_session/_html/templates/issues.html,sha256=k9Ml3LLeWGhpMfqSoCl6QuNRRy__E6Sa5S_I1Kc33NU,1659
103
103
  cognite/neat/_session/_usage_analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
104
  cognite/neat/_session/_usage_analytics/_collector.py,sha256=XRyeIW7Att3pIgLpNxQ2joGdIDijfgrPfX7G13OKz-o,4786
@@ -312,7 +312,7 @@ cognite/neat/v0/session/engine/__init__.py,sha256=D3MxUorEs6-NtgoICqtZ8PISQrjrr4
312
312
  cognite/neat/v0/session/engine/_import.py,sha256=1QxA2_EK613lXYAHKQbZyw2yjo5P9XuiX4Z6_6-WMNQ,169
313
313
  cognite/neat/v0/session/engine/_interface.py,sha256=3W-cYr493c_mW3P5O6MKN1xEQg3cA7NHR_ev3zdF9Vk,533
314
314
  cognite/neat/v0/session/engine/_load.py,sha256=u0x7vuQCRoNcPt25KJBJRn8sJabonYK4vtSZpiTdP4k,5201
315
- cognite_neat-0.127.21.dist-info/METADATA,sha256=B9N21gWYbuIj-g0hT8DstCeNKA-QQ838OHJ-c1Ws1FM,9150
316
- cognite_neat-0.127.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
317
- cognite_neat-0.127.21.dist-info/licenses/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
318
- cognite_neat-0.127.21.dist-info/RECORD,,
315
+ cognite_neat-0.127.22.dist-info/METADATA,sha256=Z7803rtujMVrtcXDwv6nG-sVhmPaEM7WBZhK-41Lryk,9150
316
+ cognite_neat-0.127.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
317
+ cognite_neat-0.127.22.dist-info/licenses/LICENSE,sha256=W8VmvFia4WHa3Gqxq1Ygrq85McUNqIGDVgtdvzT-XqA,11351
318
+ cognite_neat-0.127.22.dist-info/RECORD,,