cognite-toolkit 0.6.86__py3-none-any.whl → 0.6.88__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-toolkit might be problematic. Click here for more details.

Files changed (26) hide show
  1. cognite_toolkit/_cdf_tk/cdf_toml.py +13 -9
  2. cognite_toolkit/_cdf_tk/commands/_base.py +2 -1
  3. cognite_toolkit/_cdf_tk/commands/_upload.py +11 -4
  4. cognite_toolkit/_cdf_tk/commands/build_cmd.py +5 -7
  5. cognite_toolkit/_cdf_tk/commands/deploy.py +11 -0
  6. cognite_toolkit/_cdf_tk/commands/modules.py +16 -12
  7. cognite_toolkit/_cdf_tk/data_classes/__init__.py +2 -0
  8. cognite_toolkit/_cdf_tk/data_classes/_config_yaml.py +7 -1
  9. cognite_toolkit/_cdf_tk/data_classes/_module_directories.py +8 -0
  10. cognite_toolkit/_cdf_tk/data_classes/_tracking_info.py +43 -0
  11. cognite_toolkit/_cdf_tk/storageio/_asset_centric.py +15 -2
  12. cognite_toolkit/_cdf_tk/storageio/_base.py +35 -0
  13. cognite_toolkit/_cdf_tk/storageio/_raw.py +15 -2
  14. cognite_toolkit/_cdf_tk/storageio/selectors/_raw.py +1 -0
  15. cognite_toolkit/_cdf_tk/tracker.py +3 -13
  16. cognite_toolkit/_cdf_tk/utils/fileio/__init__.py +2 -0
  17. cognite_toolkit/_cdf_tk/utils/fileio/_readers.py +13 -2
  18. cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml +1 -1
  19. cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml +1 -1
  20. cognite_toolkit/_resources/cdf.toml +1 -1
  21. cognite_toolkit/_version.py +1 -1
  22. {cognite_toolkit-0.6.86.dist-info → cognite_toolkit-0.6.88.dist-info}/METADATA +1 -1
  23. {cognite_toolkit-0.6.86.dist-info → cognite_toolkit-0.6.88.dist-info}/RECORD +26 -25
  24. {cognite_toolkit-0.6.86.dist-info → cognite_toolkit-0.6.88.dist-info}/WHEEL +0 -0
  25. {cognite_toolkit-0.6.86.dist-info → cognite_toolkit-0.6.88.dist-info}/entry_points.txt +0 -0
  26. {cognite_toolkit-0.6.86.dist-info → cognite_toolkit-0.6.88.dist-info}/licenses/LICENSE +0 -0
@@ -78,17 +78,13 @@ class Library:
78
78
  url: str
79
79
  checksum: str
80
80
 
81
- @classmethod
82
- def load(cls, raw: dict[str, Any]) -> Self:
83
- if "url" not in raw:
84
- raise ValueError("Library configuration must contain 'url' field.")
81
+ def __post_init__(self) -> None:
82
+ self._validate()
85
83
 
86
- if "checksum" not in raw:
87
- raise ValueError("Library configuration must contain 'checksum' field.")
84
+ def _validate(self) -> None:
85
+ parsed_url = urllib.parse.urlparse(self.url)
88
86
 
89
- parsed_url = urllib.parse.urlparse(raw["url"])
90
-
91
- if not all([parsed_url.scheme, parsed_url.netloc]):
87
+ if not (parsed_url.scheme and parsed_url.netloc):
92
88
  raise ValueError("URL is missing scheme or network location (e.g., 'https://domain.com')")
93
89
 
94
90
  if parsed_url.scheme != "https":
@@ -97,6 +93,14 @@ class Library:
97
93
  if not parsed_url.path.casefold().endswith(".zip"):
98
94
  raise ValueError("URL must point to a .zip file.")
99
95
 
96
+ @classmethod
97
+ def load(cls, raw: dict[str, Any]) -> Self:
98
+ if "url" not in raw:
99
+ raise ValueError("Library configuration must contain 'url' field.")
100
+
101
+ if "checksum" not in raw:
102
+ raise ValueError("Library configuration must contain 'checksum' field.")
103
+
100
104
  return cls(**raw)
101
105
 
102
106
 
@@ -5,6 +5,7 @@ from typing import Any
5
5
  from rich import print
6
6
  from rich.console import Console
7
7
 
8
+ from cognite_toolkit._cdf_tk.data_classes import CommandTrackingInfo
8
9
  from cognite_toolkit._cdf_tk.tk_warnings import (
9
10
  ToolkitWarning,
10
11
  WarningList,
@@ -20,7 +21,7 @@ class ToolkitCommand:
20
21
  self.silent = silent
21
22
  self.warning_list = WarningList[ToolkitWarning]()
22
23
  self.tracker = Tracker(skip_tracking)
23
- self._additional_tracking_info: dict[str, Any] = {}
24
+ self._additional_tracking_info = CommandTrackingInfo()
24
25
 
25
26
  @property
26
27
  def print_warning(self) -> bool:
@@ -8,15 +8,16 @@ from rich.console import Console
8
8
 
9
9
  from cognite_toolkit._cdf_tk.client import ToolkitClient
10
10
  from cognite_toolkit._cdf_tk.constants import DATA_MANIFEST_STEM, DATA_RESOURCE_DIR
11
+ from cognite_toolkit._cdf_tk.exceptions import ToolkitValueError
11
12
  from cognite_toolkit._cdf_tk.storageio import T_Selector, UploadableStorageIO, are_same_kind, get_upload_io
12
- from cognite_toolkit._cdf_tk.storageio._base import T_WriteCogniteResource, UploadItem
13
+ from cognite_toolkit._cdf_tk.storageio._base import T_WriteCogniteResource, TableUploadableStorageIO, UploadItem
13
14
  from cognite_toolkit._cdf_tk.storageio.selectors import Selector, SelectorAdapter
14
15
  from cognite_toolkit._cdf_tk.tk_warnings import HighSeverityWarning, MediumSeverityWarning
15
16
  from cognite_toolkit._cdf_tk.tk_warnings.fileread import ResourceFormatWarning
16
17
  from cognite_toolkit._cdf_tk.utils.auth import EnvironmentVariables
17
18
  from cognite_toolkit._cdf_tk.utils.collection import chunker
18
19
  from cognite_toolkit._cdf_tk.utils.file import read_yaml_file
19
- from cognite_toolkit._cdf_tk.utils.fileio import FileReader
20
+ from cognite_toolkit._cdf_tk.utils.fileio import TABLE_READ_CLS_BY_FORMAT, FileReader
20
21
  from cognite_toolkit._cdf_tk.utils.http_client import HTTPClient, ItemMessage, SuccessResponseItems
21
22
  from cognite_toolkit._cdf_tk.utils.producer_worker import ProducerWorkerExecutor
22
23
  from cognite_toolkit._cdf_tk.utils.progress_tracker import ProgressTracker
@@ -178,13 +179,19 @@ class UploadCommand(ToolkitCommand):
178
179
  if verbose:
179
180
  console.print(f"{action} {selector.display_name} from {file_display.as_posix()!r}")
180
181
  reader = FileReader.from_filepath(data_file)
182
+ is_table = reader.format in TABLE_READ_CLS_BY_FORMAT
183
+ if is_table and not isinstance(io, TableUploadableStorageIO):
184
+ raise ToolkitValueError(f"{selector.display_name} does not support {reader.format!r} files.")
181
185
  tracker = ProgressTracker[str]([self._UPLOAD])
186
+ data_name = "row" if is_table else "line"
182
187
  executor = ProducerWorkerExecutor[list[tuple[str, dict[str, JsonVal]]], Sequence[UploadItem]](
183
188
  download_iterable=chunker(
184
- ((f"line {line_no}", item) for line_no, item in enumerate(reader.read_chunks(), 1)),
189
+ ((f"{data_name} {line_no}", item) for line_no, item in enumerate(reader.read_chunks(), 1)),
185
190
  io.CHUNK_SIZE,
186
191
  ),
187
- process=io.json_chunk_to_data,
192
+ process=partial(io.rows_to_data, selector=selector)
193
+ if is_table and isinstance(io, TableUploadableStorageIO)
194
+ else io.json_chunk_to_data,
188
195
  write=partial(
189
196
  self._upload_items,
190
197
  upload_client=upload_client,
@@ -143,7 +143,9 @@ class BuildCommand(ToolkitCommand):
143
143
  config.environment.selected = parse_user_selected_modules(selected, organization_dir)
144
144
 
145
145
  # tracking which project the module is being built for to trace promotion
146
- self._additional_tracking_info["project"] = config.environment.project
146
+ if client:
147
+ self._additional_tracking_info.project = client.config.project
148
+ self._additional_tracking_info.cluster = client.config.cdf_cluster
147
149
 
148
150
  directory_name = "current directory" if organization_dir == Path(".") else f"project '{organization_dir!s}'"
149
151
  root_modules = [
@@ -331,15 +333,11 @@ class BuildCommand(ToolkitCommand):
331
333
  build.append(built_module)
332
334
 
333
335
  if module.package_id:
334
- package_ids = self._additional_tracking_info.setdefault("packageId", [])
335
- if module.package_id not in package_ids:
336
- package_ids.append(module.package_id)
336
+ self._additional_tracking_info.package_ids.add(module.package_id)
337
337
 
338
338
  if module.module_id:
339
- module_ids = self._additional_tracking_info.setdefault("moduleIds", [])
340
- module_ids.append(module.module_id)
339
+ self._additional_tracking_info.module_ids.add(module.module_id)
341
340
 
342
- self.tracker.track_module_build(built_module)
343
341
  return build
344
342
 
345
343
  def _build_module_resources(
@@ -79,6 +79,17 @@ class DeployCommand(ToolkitCommand):
79
79
  build = self._load_build(build_dir, build_env_name)
80
80
 
81
81
  client = env_vars.get_client(build.is_strict_validation)
82
+
83
+ self._additional_tracking_info.project = client.config.project
84
+ self._additional_tracking_info.cluster = client.config.cdf_cluster
85
+
86
+ if not dry_run:
87
+ for module in build.read_modules:
88
+ if module.module_id:
89
+ self._additional_tracking_info.module_ids.add(module.module_id)
90
+ if module.package_id:
91
+ self._additional_tracking_info.package_ids.add(module.package_id)
92
+
82
93
  selected_loaders = self._clean_command.get_selected_loaders(build_dir, build.read_resource_folders, include)
83
94
  ordered_loaders = self._order_loaders(selected_loaders, build_dir)
84
95
  self._start_message(build_dir, dry_run, env_vars)
@@ -95,11 +95,14 @@ class ModulesCommand(ToolkitCommand):
95
95
  print_warning: bool = True,
96
96
  skip_tracking: bool = False,
97
97
  silent: bool = False,
98
+ temp_dir_suffix: str | None = None,
98
99
  module_source_dir: Path | None = None,
99
100
  ):
100
101
  super().__init__(print_warning, skip_tracking, silent)
101
102
  self._module_source_dir: Path | None = module_source_dir
102
- self._temp_download_dir = Path(tempfile.gettempdir()) / MODULES
103
+ # Use suffix to make temp directory unique (useful for parallel test execution)
104
+ modules_dir_name = f"{MODULES}.{temp_dir_suffix}" if temp_dir_suffix else MODULES
105
+ self._temp_download_dir = Path(tempfile.gettempdir()) / modules_dir_name
103
106
  if not self._temp_download_dir.exists():
104
107
  self._temp_download_dir.mkdir(parents=True, exist_ok=True)
105
108
 
@@ -170,6 +173,11 @@ class ModulesCommand(ToolkitCommand):
170
173
  print(f"{INDENT}[{'yellow' if mode == 'clean' else 'green'}]Creating {package_name}[/]")
171
174
 
172
175
  for module in package.modules:
176
+ if module.module_id:
177
+ self._additional_tracking_info.installed_module_ids.add(module.module_id)
178
+ if module.package_id:
179
+ self._additional_tracking_info.installed_package_ids.add(module.package_id)
180
+
173
181
  if module.dir in seen_modules:
174
182
  # A module can be part of multiple packages
175
183
  continue
@@ -769,7 +777,6 @@ default_organization_dir = "{organization_dir.name}"''',
769
777
  def _get_available_packages(self, user_library: Library | None = None) -> tuple[Packages, Path]:
770
778
  """
771
779
  Returns a list of available packages, either from the CDF TOML file or from external libraries if the feature flag is enabled.
772
- If the feature flag is not enabled and no libraries are specified, it returns the built-in modules.
773
780
  """
774
781
 
775
782
  cdf_toml = CDFToml.load()
@@ -778,9 +785,8 @@ default_organization_dir = "{organization_dir.name}"''',
778
785
 
779
786
  for library_name, library in libraries.items():
780
787
  try:
781
- additional_tracking_info = self._additional_tracking_info.setdefault("downloadedLibraryIds", [])
782
- if library_name not in additional_tracking_info:
783
- additional_tracking_info.append(library_name)
788
+ if library_name:
789
+ self._additional_tracking_info.downloaded_library_ids.add(library_name)
784
790
 
785
791
  print(f"[green]Adding library {library_name} from {library.url}[/]")
786
792
  # Extract filename from URL, fallback to library_name.zip if no filename found
@@ -802,14 +808,12 @@ default_organization_dir = "{organization_dir.name}"''',
802
808
 
803
809
  # Track deployment pack download for each package and module
804
810
  for package in packages.values():
805
- downloaded_package_ids = self._additional_tracking_info.setdefault("downloadedPackageIds", [])
806
- if package.id and package.id not in downloaded_package_ids:
807
- downloaded_package_ids.append(package.id)
811
+ if package.id:
812
+ self._additional_tracking_info.downloaded_package_ids.add(package.id)
808
813
 
809
- downloaded_module_ids = self._additional_tracking_info.setdefault("downloadedModuleIds", [])
810
814
  for module in package.modules:
811
- if module.module_id and module.module_id not in downloaded_module_ids:
812
- downloaded_module_ids.append(module.module_id)
815
+ if module.module_id:
816
+ self._additional_tracking_info.downloaded_module_ids.add(module.module_id)
813
817
 
814
818
  return packages, file_path.parent
815
819
  except Exception as e:
@@ -821,7 +825,7 @@ default_organization_dir = "{organization_dir.name}"''',
821
825
  ) from e
822
826
 
823
827
  raise ToolkitError(f"Failed to add library {library_name}, {e}")
824
- # If no libraries are specified or the flag is not enabled, load the built-in modules
828
+ # If no libraries are specified or the flag is not enabled, raise an error
825
829
  raise ValueError("No valid libraries found.")
826
830
  else:
827
831
  if user_library:
@@ -32,6 +32,7 @@ from ._deploy_results import (
32
32
  from ._module_directories import ModuleDirectories, ModuleLocation
33
33
  from ._module_resources import ModuleResources
34
34
  from ._packages import Package, Packages
35
+ from ._tracking_info import CommandTrackingInfo
35
36
  from ._yaml_comments import YAMLComments
36
37
 
37
38
  __all__ = [
@@ -47,6 +48,7 @@ __all__ = [
47
48
  "BuiltResource",
48
49
  "BuiltResourceFull",
49
50
  "BuiltResourceList",
51
+ "CommandTrackingInfo",
50
52
  "ConfigEntry",
51
53
  "ConfigYAMLs",
52
54
  "DatapointDeployResult",
@@ -496,7 +496,9 @@ class InitConfigYAML(YAMLWithComments[tuple[str, ...], ConfigEntry], ConfigYAMLC
496
496
  adds them to the config.yaml file.
497
497
 
498
498
  Args:
499
- cognite_root_module: The root module for all cognite modules.
499
+ cognite_root_module: Path to the root directory containing all Cognite modules.
500
+ defaults_files: List of paths to default.config.yaml files to load.
501
+ ignore_patterns: Optional list of tuples containing patterns to ignore when loading defaults.
500
502
 
501
503
  Returns:
502
504
  self
@@ -509,6 +511,10 @@ class InitConfigYAML(YAMLWithComments[tuple[str, ...], ConfigEntry], ConfigYAMLC
509
511
  raw_file = safe_read(default_config)
510
512
  file_comments = self._extract_comments(raw_file, key_prefix=tuple(parts))
511
513
  file_data = cast(dict, read_yaml_content(raw_file))
514
+
515
+ # a file may exist, but contain just comments, thus the file_data is None
516
+ if file_data is None:
517
+ continue
512
518
  for key, value in file_data.items():
513
519
  if len(parts) >= 1 and parts[0] in ROOT_MODULES:
514
520
  key_path = (self._variables, *parts, key)
@@ -164,6 +164,8 @@ class ModuleLocation:
164
164
  return ReadModule(
165
165
  dir=self.dir,
166
166
  resource_directories=tuple(self.resource_directories),
167
+ module_id=self.module_id,
168
+ package_id=self.package_id,
167
169
  )
168
170
 
169
171
 
@@ -178,6 +180,8 @@ class ReadModule:
178
180
 
179
181
  dir: Path
180
182
  resource_directories: tuple[str, ...]
183
+ module_id: str | None
184
+ package_id: str | None
181
185
 
182
186
  def resource_dir_path(self, resource_folder: str) -> Path | None:
183
187
  """Returns the path to a resource in the module.
@@ -198,12 +202,16 @@ class ReadModule:
198
202
  return cls(
199
203
  dir=Path(data["dir"]),
200
204
  resource_directories=tuple(data["resource_directories"]),
205
+ module_id=data.get("module_id"),
206
+ package_id=data.get("package_id"),
201
207
  )
202
208
 
203
209
  def dump(self) -> dict[str, Any]:
204
210
  return {
205
211
  "dir": self.dir.as_posix(),
206
212
  "resource_directories": list(self.resource_directories),
213
+ "module_id": self.module_id,
214
+ "package_id": self.package_id,
207
215
  }
208
216
 
209
217
 
@@ -0,0 +1,43 @@
1
+ """Data class for command tracking information."""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ class CommandTrackingInfo(BaseModel):
9
+ """Structured tracking information for CLI commands.
10
+
11
+ This model provides type-safe tracking information that can be collected
12
+ during command execution and sent to Mixpanel for analytics.
13
+
14
+ Attributes:
15
+ project: The CDF project name.
16
+ cluster: The CDF cluster name.
17
+ module_ids: List of module IDs that were deployed or built.
18
+ package_ids: List of package IDs that were deployed or built.
19
+ installed_module_ids: List of module IDs that were installed.
20
+ installed_package_ids: List of package IDs that were installed.
21
+ downloaded_library_ids: List of library IDs that were downloaded.
22
+ downloaded_package_ids: List of package IDs that were downloaded.
23
+ downloaded_module_ids: List of module IDs that were downloaded.
24
+ """
25
+
26
+ project: str | None = Field(default=None)
27
+ cluster: str | None = Field(default=None)
28
+ module_ids: set[str] = Field(default_factory=set, alias="moduleIds")
29
+ package_ids: set[str] = Field(default_factory=set, alias="packageIds")
30
+ installed_module_ids: set[str] = Field(default_factory=set, alias="installedModuleIds")
31
+ installed_package_ids: set[str] = Field(default_factory=set, alias="installedPackageIds")
32
+ downloaded_library_ids: set[str] = Field(default_factory=set, alias="downloadedLibraryIds")
33
+ downloaded_package_ids: set[str] = Field(default_factory=set, alias="downloadedPackageIds")
34
+ downloaded_module_ids: set[str] = Field(default_factory=set, alias="downloadedModuleIds")
35
+
36
+ def to_dict(self) -> dict[str, Any]:
37
+ """Convert the tracking info to a dictionary for Mixpanel.
38
+
39
+ Returns:
40
+ A dictionary with camelCase keys matching Mixpanel's expected format.
41
+ Default values are excluded.
42
+ """
43
+ return self.model_dump(by_alias=True, exclude_defaults=True)
@@ -72,7 +72,7 @@ from ._base import (
72
72
  Page,
73
73
  StorageIOConfig,
74
74
  TableStorageIO,
75
- UploadableStorageIO,
75
+ TableUploadableStorageIO,
76
76
  UploadItem,
77
77
  )
78
78
  from .selectors import AssetCentricSelector, AssetSubtreeSelector, DataSetSelector
@@ -82,7 +82,7 @@ class BaseAssetCentricIO(
82
82
  Generic[T_ID, T_WriteClass, T_WritableCogniteResource, T_CogniteResourceList, T_WritableCogniteResourceList],
83
83
  TableStorageIO[AssetCentricSelector, T_WritableCogniteResource],
84
84
  ConfigurableStorageIO[AssetCentricSelector, T_WritableCogniteResource],
85
- UploadableStorageIO[AssetCentricSelector, T_WritableCogniteResource, T_WriteClass],
85
+ TableUploadableStorageIO[AssetCentricSelector, T_WritableCogniteResource, T_WriteClass],
86
86
  ABC,
87
87
  ):
88
88
  RESOURCE_TYPE: ClassVar[AssetCentricType]
@@ -199,6 +199,19 @@ class BaseAssetCentricIO(
199
199
  rows.append(chunk)
200
200
  return rows
201
201
 
202
+ def row_to_resource(self, row: dict[str, JsonVal], selector: AssetCentricSelector | None = None) -> T_WriteClass:
203
+ metadata: dict[str, JsonVal] = {}
204
+ cleaned_row: dict[str, JsonVal] = {}
205
+ for key, value in row.items():
206
+ if key.startswith("metadata."):
207
+ metadata_key = key[len("metadata.") :]
208
+ metadata[metadata_key] = value
209
+ else:
210
+ cleaned_row[key] = value
211
+ if metadata:
212
+ cleaned_row["metadata"] = metadata
213
+ return self.json_to_resource(cleaned_row)
214
+
202
215
 
203
216
  class AssetIO(BaseAssetCentricIO[str, AssetWrite, Asset, AssetWriteList, AssetList]):
204
217
  KIND = "Assets"
@@ -206,6 +206,41 @@ class UploadableStorageIO(
206
206
  raise NotImplementedError()
207
207
 
208
208
 
209
+ class TableUploadableStorageIO(UploadableStorageIO[T_Selector, T_CogniteResource, T_WriteCogniteResource], ABC):
210
+ """A base class for storage items that support uploading data with table schemas."""
211
+
212
+ def rows_to_data(
213
+ self, rows: list[tuple[str, dict[str, JsonVal]]], selector: T_Selector | None = None
214
+ ) -> Sequence[UploadItem[T_WriteCogniteResource]]:
215
+ """Convert a row-based JSON-compatible chunk of data back to a writable Cognite resource list.
216
+
217
+ Args:
218
+ rows: A list of tuples, each containing a source ID and a dictionary representing
219
+ the data in a JSON-compatible format.
220
+ selector: Optional selection criteria to identify where to upload the data. This is required for some storage types.
221
+
222
+ Returns:
223
+ A writable Cognite resource list representing the data.
224
+ """
225
+ result: list[UploadItem[T_WriteCogniteResource]] = []
226
+ for source_id, row in rows:
227
+ item = self.row_to_resource(row, selector=selector)
228
+ result.append(UploadItem(source_id=source_id, item=item))
229
+ return result
230
+
231
+ @abstractmethod
232
+ def row_to_resource(self, row: dict[str, JsonVal], selector: T_Selector | None = None) -> T_WriteCogniteResource:
233
+ """Convert a row-based JSON-compatible dictionary back to a writable Cognite resource.
234
+
235
+ Args:
236
+ row: A dictionary representing the data in a JSON-compatible format.
237
+ selector: Optional selection criteria to identify where to upload the data. This is required for some storage types.
238
+ Returns:
239
+ A writable Cognite resource representing the data.
240
+ """
241
+ raise NotImplementedError()
242
+
243
+
209
244
  class ConfigurableStorageIO(StorageIO[T_Selector, T_CogniteResource], ABC):
210
245
  """A base class for storage items that support configurations for different storage items."""
211
246
 
@@ -1,4 +1,5 @@
1
1
  from collections.abc import Iterable, Sequence
2
+ from uuid import uuid4
2
3
 
3
4
  from cognite.client.data_classes import Row, RowWrite
4
5
 
@@ -8,13 +9,19 @@ from cognite_toolkit._cdf_tk.utils import sanitize_filename
8
9
  from cognite_toolkit._cdf_tk.utils.http_client import HTTPClient, HTTPMessage, ItemsRequest
9
10
  from cognite_toolkit._cdf_tk.utils.useful_types import JsonVal
10
11
 
11
- from ._base import ConfigurableStorageIO, Page, StorageIOConfig, UploadableStorageIO, UploadItem
12
+ from ._base import (
13
+ ConfigurableStorageIO,
14
+ Page,
15
+ StorageIOConfig,
16
+ TableUploadableStorageIO,
17
+ UploadItem,
18
+ )
12
19
  from .selectors import RawTableSelector
13
20
 
14
21
 
15
22
  class RawIO(
16
23
  ConfigurableStorageIO[RawTableSelector, Row],
17
- UploadableStorageIO[RawTableSelector, Row, RowWrite],
24
+ TableUploadableStorageIO[RawTableSelector, Row, RowWrite],
18
25
  ):
19
26
  KIND = "RawRows"
20
27
  DISPLAY_NAME = "Raw Rows"
@@ -81,3 +88,9 @@ class RawIO(
81
88
  yield StorageIOConfig(
82
89
  kind=RawTableCRUD.kind, folder_name=RawTableCRUD.folder_name, value=selector.table.model_dump(by_alias=True)
83
90
  )
91
+
92
+ def row_to_resource(self, row: dict[str, JsonVal], selector: RawTableSelector | None = None) -> RowWrite:
93
+ key = str(uuid4())
94
+ if selector is not None and selector.key is not None and selector.key in row:
95
+ key = str(row.pop(selector.key))
96
+ return RowWrite(key=key, columns=row)
@@ -14,6 +14,7 @@ class RawTableSelector(DataSelector):
14
14
  type: Literal["rawTable"] = "rawTable"
15
15
  kind: Literal["RawRows"] = "RawRows"
16
16
  table: SelectedTable
17
+ key: str | None = None
17
18
 
18
19
  @property
19
20
  def group(self) -> str:
@@ -14,7 +14,7 @@ from mixpanel import Consumer, Mixpanel, MixpanelException
14
14
 
15
15
  from cognite_toolkit._cdf_tk.cdf_toml import CDFToml
16
16
  from cognite_toolkit._cdf_tk.constants import IN_BROWSER
17
- from cognite_toolkit._cdf_tk.data_classes._built_modules import BuiltModule
17
+ from cognite_toolkit._cdf_tk.data_classes import CommandTrackingInfo
18
18
  from cognite_toolkit._cdf_tk.tk_warnings import ToolkitWarning, WarningList
19
19
  from cognite_toolkit._cdf_tk.utils import get_cicd_environment
20
20
  from cognite_toolkit._version import __version__
@@ -49,7 +49,7 @@ class Tracker:
49
49
  warning_list: WarningList[ToolkitWarning],
50
50
  result: str | Exception,
51
51
  cmd: str,
52
- additional_tracking_info: dict[str, Any] | None = None,
52
+ additional_tracking_info: CommandTrackingInfo | None = None,
53
53
  ) -> bool:
54
54
  warning_count = Counter([type(w).__name__ for w in warning_list])
55
55
 
@@ -76,20 +76,10 @@ class Tracker:
76
76
  }
77
77
 
78
78
  if additional_tracking_info:
79
- event_information.update(additional_tracking_info)
79
+ event_information.update(additional_tracking_info.to_dict())
80
80
 
81
81
  return self._track(f"command{cmd.capitalize()}", event_information)
82
82
 
83
- def track_module_build(self, module: BuiltModule) -> bool:
84
- event_information = {
85
- "module": module.name,
86
- "location_path": module.location.path.as_posix(),
87
- "warning_count": module.warning_count,
88
- "status": module.status,
89
- **{resource_type: len(resource_build) for resource_type, resource_build in module.resources.items()},
90
- }
91
- return self._track("moduleBuild", event_information)
92
-
93
83
  def _track(self, event_name: str, event_information: dict[str, Any]) -> bool:
94
84
  if self.skip_tracking or not self.opted_in or "PYTEST_CURRENT_TEST" in os.environ:
95
85
  return False
@@ -8,6 +8,7 @@ from ._compression import (
8
8
  )
9
9
  from ._readers import (
10
10
  FILE_READ_CLS_BY_FORMAT,
11
+ TABLE_READ_CLS_BY_FORMAT,
11
12
  CSVReader,
12
13
  FailedParsing,
13
14
  FileReader,
@@ -32,6 +33,7 @@ __all__ = [
32
33
  "COMPRESSION_BY_SUFFIX",
33
34
  "FILE_READ_CLS_BY_FORMAT",
34
35
  "FILE_WRITE_CLS_BY_FORMAT",
36
+ "TABLE_READ_CLS_BY_FORMAT",
35
37
  "TABLE_WRITE_CLS_BY_FORMAT",
36
38
  "CSVReader",
37
39
  "CSVWriter",
@@ -87,7 +87,10 @@ class FailedParsing:
87
87
  error: str
88
88
 
89
89
 
90
- class CSVReader(FileReader):
90
+ class TableReader(FileReader, ABC): ...
91
+
92
+
93
+ class CSVReader(TableReader):
91
94
  """Reads CSV files and yields each row as a dictionary.
92
95
 
93
96
  Args:
@@ -229,7 +232,7 @@ class CSVReader(FileReader):
229
232
  yield from csv.DictReader(file)
230
233
 
231
234
 
232
- class ParquetReader(FileReader):
235
+ class ParquetReader(TableReader):
233
236
  format = ".parquet"
234
237
 
235
238
  def read_chunks(self) -> Iterator[dict[str, JsonVal]]:
@@ -257,6 +260,7 @@ class ParquetReader(FileReader):
257
260
 
258
261
 
259
262
  FILE_READ_CLS_BY_FORMAT: Mapping[str, type[FileReader]] = {}
263
+ TABLE_READ_CLS_BY_FORMAT: Mapping[str, type[TableReader]] = {}
260
264
  for subclass in get_concrete_subclasses(FileReader): # type: ignore[type-abstract]
261
265
  if not getattr(subclass, "format", None):
262
266
  continue
@@ -267,3 +271,10 @@ for subclass in get_concrete_subclasses(FileReader): # type: ignore[type-abstra
267
271
  )
268
272
  # We know we have a dict, but we want to expose FILE_READ_CLS_BY_FORMAT as a Mapping
269
273
  FILE_READ_CLS_BY_FORMAT[subclass.format] = subclass # type: ignore[index]
274
+ if issubclass(subclass, TableReader):
275
+ if subclass.format in TABLE_READ_CLS_BY_FORMAT:
276
+ raise TypeError(
277
+ f"Duplicate table file format {subclass.format!r} found for classes "
278
+ f"{TABLE_READ_CLS_BY_FORMAT[subclass.format].__name__!r} and {subclass.__name__!r}."
279
+ )
280
+ TABLE_READ_CLS_BY_FORMAT[subclass.format] = subclass # type: ignore[index]
@@ -12,7 +12,7 @@ jobs:
12
12
  environment: dev
13
13
  name: Deploy
14
14
  container:
15
- image: cognite/toolkit:0.6.86
15
+ image: cognite/toolkit:0.6.88
16
16
  env:
17
17
  CDF_CLUSTER: ${{ vars.CDF_CLUSTER }}
18
18
  CDF_PROJECT: ${{ vars.CDF_PROJECT }}
@@ -10,7 +10,7 @@ jobs:
10
10
  environment: dev
11
11
  name: Deploy Dry Run
12
12
  container:
13
- image: cognite/toolkit:0.6.86
13
+ image: cognite/toolkit:0.6.88
14
14
  env:
15
15
  CDF_CLUSTER: ${{ vars.CDF_CLUSTER }}
16
16
  CDF_PROJECT: ${{ vars.CDF_PROJECT }}
@@ -4,7 +4,7 @@ default_env = "<DEFAULT_ENV_PLACEHOLDER>"
4
4
  [modules]
5
5
  # This is the version of the modules. It should not be changed manually.
6
6
  # It will be updated by the 'cdf modules upgrade' command.
7
- version = "0.6.86"
7
+ version = "0.6.88"
8
8
 
9
9
  [alpha_flags]
10
10
  external-libraries = true
@@ -1 +1 @@
1
- __version__ = "0.6.86"
1
+ __version__ = "0.6.88"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cognite_toolkit
3
- Version: 0.6.86
3
+ Version: 0.6.88
4
4
  Summary: Official Cognite Data Fusion tool for project templates and configuration deployment
5
5
  Project-URL: Homepage, https://docs.cognite.com/cdf/deploy/cdf_toolkit/
6
6
  Project-URL: Changelog, https://github.com/cognitedata/toolkit/releases
@@ -1,14 +1,14 @@
1
1
  cognite_toolkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  cognite_toolkit/_cdf.py,sha256=1OSAvbOeuIrnsczEG2BtGqRP3L3sq0VMPthmugnqCUw,5821
3
- cognite_toolkit/_version.py,sha256=y8yiu6qqknI_Tf_P0-H0xuN1S1fZ-IRju7amwCqQF3E,23
3
+ cognite_toolkit/_version.py,sha256=EgTgWpmRuWXg6fwc6D-LGpiAVF4TwDefD9KxLpZLYlU,23
4
4
  cognite_toolkit/_cdf_tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- cognite_toolkit/_cdf_tk/cdf_toml.py,sha256=DAUmHf19ByVIGH4MDPdXKHZ0G97CxdD5J-EzHTq66C8,8025
5
+ cognite_toolkit/_cdf_tk/cdf_toml.py,sha256=IjmzNVLxsOV6tsMDgmJmXsy-LQru-8IEQdFzGW5DxVk,8117
6
6
  cognite_toolkit/_cdf_tk/constants.py,sha256=e9XmGvQCqGq7zYQrNoopU5e2KnYZYBPyUC5raGShK7k,6364
7
7
  cognite_toolkit/_cdf_tk/exceptions.py,sha256=xG0jMwi5A20nvPvyo6sCyz_cyKycynPyIzpYiGR4gcU,6064
8
8
  cognite_toolkit/_cdf_tk/feature_flags.py,sha256=oKvUHcNTtt8zp31eZ1eSCxfSIelm0L5B0xAQOskr1hc,2892
9
9
  cognite_toolkit/_cdf_tk/hints.py,sha256=UI1ymi2T5wCcYOpEbKbVaDnlyFReFy8TDtMVt-5E1h8,6493
10
10
  cognite_toolkit/_cdf_tk/plugins.py,sha256=yL7Q4k9UGnoHP9Ucrno02_qi1L3DrE6ggBiQI-wQKiU,783
11
- cognite_toolkit/_cdf_tk/tracker.py,sha256=NNyaLcQ-E7fNjmeOejT7OALGZid27wTj8u-FcbEWxHk,6472
11
+ cognite_toolkit/_cdf_tk/tracker.py,sha256=_j8gWlqwfD0eCbRW4XKB1kAixjCwau9-o4rPvFvouNY,6016
12
12
  cognite_toolkit/_cdf_tk/validation.py,sha256=KFdPgnNIbVM0yjFF0cqmpBB8MI8e-U-YbBYrP4IiClE,8441
13
13
  cognite_toolkit/_cdf_tk/apps/__init__.py,sha256=nNQymHhwxjXNpY9N9xDmnvSPLCMwQkn_t9oRkgDWofI,659
14
14
  cognite_toolkit/_cdf_tk/apps/_auth_app.py,sha256=ER7uYb3ViwsHMXiQEZpyhwU6TIjKaB9aEy32VI4MPpg,3397
@@ -92,25 +92,25 @@ cognite_toolkit/_cdf_tk/client/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
92
92
  cognite_toolkit/_cdf_tk/client/utils/_concurrency.py,sha256=3GtQbKDaosyKHEt-KzxKK9Yie4TvZPdoou2vUk6dUa8,2298
93
93
  cognite_toolkit/_cdf_tk/client/utils/_http_client.py,sha256=oXNKrIaizG4WiSAhL_kSCHAuL4aaaEhCU4pOJGxh6Xs,483
94
94
  cognite_toolkit/_cdf_tk/commands/__init__.py,sha256=OJYtHiERtUBXm3cjUTyPVaYIMVQpu9HJv1QNGPL-AIQ,1418
95
- cognite_toolkit/_cdf_tk/commands/_base.py,sha256=m2hnXo_AAHhsoSayHZO_zUa4xEt5w5oMB4WCHmJr-AY,2595
95
+ cognite_toolkit/_cdf_tk/commands/_base.py,sha256=1gl8Y-yqfedRMfdbwM3iPTIUIZriX1UvC1deLsJSJwM,2667
96
96
  cognite_toolkit/_cdf_tk/commands/_changes.py,sha256=DIwuiRpDhWBDpsW3R3yqj0eWLAE3c_kPbmCaUkxjFuo,24852
97
97
  cognite_toolkit/_cdf_tk/commands/_cli_commands.py,sha256=TK6U_rm6VZT_V941kTyHMoulWgJzbDC8YIIQDPJ5x3w,1011
98
98
  cognite_toolkit/_cdf_tk/commands/_download.py,sha256=OBKPM_HGGA1i32th1SAgkQM_81CUFvm39kGqBuOeeTs,6816
99
99
  cognite_toolkit/_cdf_tk/commands/_profile.py,sha256=_4iX3AHAI6eLmRVUlWXCSvVHx1BZW2yDr_i2i9ECg6U,43120
100
100
  cognite_toolkit/_cdf_tk/commands/_purge.py,sha256=RadQHsmkPez3fZ5HCP9b82o2_fBx8P_-bTo7prkvWXU,32525
101
- cognite_toolkit/_cdf_tk/commands/_upload.py,sha256=kXYmP1YMg-JvsuN1iYaMuZH1qZfapya2j-RABGhqGHo,11860
101
+ cognite_toolkit/_cdf_tk/commands/_upload.py,sha256=Y0k0q4Iu4F7g3Ax3slSrpll3AHxmODYNq55waHw4mzc,12473
102
102
  cognite_toolkit/_cdf_tk/commands/_utils.py,sha256=ARlbqA_5ZWlgN3-xF-zanzSx4B0-9ULnguA5QgHmKGA,1225
103
103
  cognite_toolkit/_cdf_tk/commands/_virtual_env.py,sha256=GFAid4hplixmj9_HkcXqU5yCLj-fTXm4cloGD6U2swY,2180
104
104
  cognite_toolkit/_cdf_tk/commands/auth.py,sha256=N6JgtF0_Qoh-xM8VlBb_IK1n0Lo5I7bIkIHmXm1l7ug,31638
105
- cognite_toolkit/_cdf_tk/commands/build_cmd.py,sha256=wamXGF6Sa6G8LSmfm4uJtlxsFL5fs0fihmCKe-Zj7TI,30685
105
+ cognite_toolkit/_cdf_tk/commands/build_cmd.py,sha256=HTxklCGg6pcnoi7yImQrCjpBXHIw2mFojmZmgDQAsGk,30523
106
106
  cognite_toolkit/_cdf_tk/commands/clean.py,sha256=2VWZKp_AZ49AaUCCpvc1kezFA_je6y--zjglccqxsjQ,14346
107
107
  cognite_toolkit/_cdf_tk/commands/collect.py,sha256=zBMKhhvjOpuASMnwP0eeHRI02tANcvFEZgv0CQO1ECc,627
108
- cognite_toolkit/_cdf_tk/commands/deploy.py,sha256=_zBlcHd2keVx0Rh1sIzB9iesTcHgIyCnAC-G3l6Q5mA,22619
108
+ cognite_toolkit/_cdf_tk/commands/deploy.py,sha256=QkPe3AGWIYKA-ju1rOyv9WWdwCGWyZFW5M_jc12Apxo,23083
109
109
  cognite_toolkit/_cdf_tk/commands/dump_data.py,sha256=8l4M2kqV4DjiV5js5s7EbFVNxV0Np4ld8ogw19vaJp0,21804
110
110
  cognite_toolkit/_cdf_tk/commands/dump_resource.py,sha256=ylAFST3GgkWT1Qa-JIzmQXbrQgNCB1UrptrBf3WsyvY,39658
111
111
  cognite_toolkit/_cdf_tk/commands/featureflag.py,sha256=lgLMwuNIwFjvvKn1sNMunkq4VTwdNqXtrZfdGFTrNcI,968
112
112
  cognite_toolkit/_cdf_tk/commands/init.py,sha256=OuAVPI_tAJrwFO81EwzKXAA8m6ne44wXsJ0KZyKwPAE,239
113
- cognite_toolkit/_cdf_tk/commands/modules.py,sha256=hy2PV4NBo-ZlIwzsmnaJtLm4JIpanf3mbntHhC0nSbI,42557
113
+ cognite_toolkit/_cdf_tk/commands/modules.py,sha256=gR4pLje6tSiWeW0glto0pb7BhlLee4jOv6YBNFsL_0g,42537
114
114
  cognite_toolkit/_cdf_tk/commands/pull.py,sha256=2Zf6IOXxSxZ-5XkNE80FlrXBuNejAWrApAocu-kTrNw,39253
115
115
  cognite_toolkit/_cdf_tk/commands/repo.py,sha256=MNy8MWphTklIZHvQOROCweq8_SYxGv6BaqnLpkFFnuk,3845
116
116
  cognite_toolkit/_cdf_tk/commands/run.py,sha256=JyX9jLEQej9eRrHVCCNlw4GuF80qETSol3-T5CCofgw,37331
@@ -155,18 +155,19 @@ cognite_toolkit/_cdf_tk/cruds/_resource_cruds/three_d_model.py,sha256=YmzIQp1cjU
155
155
  cognite_toolkit/_cdf_tk/cruds/_resource_cruds/timeseries.py,sha256=VUvg6geF8d7N6PY1kMXs6v2xbWReiSbbRhQNqlAlhUM,23518
156
156
  cognite_toolkit/_cdf_tk/cruds/_resource_cruds/transformation.py,sha256=fFQNauXAz7zOYcwiN8gFvFtOIaXnulM4AeLgXWxoS48,33141
157
157
  cognite_toolkit/_cdf_tk/cruds/_resource_cruds/workflow.py,sha256=OMHOxFY2ZLi0RTw0LmE_dTeOmFUh9LDIEDykyiCOCIw,26773
158
- cognite_toolkit/_cdf_tk/data_classes/__init__.py,sha256=Z7ODYLcqrRpo0Cmfx79DDhsA6eEK4hvNST_Qko1vRv0,1645
158
+ cognite_toolkit/_cdf_tk/data_classes/__init__.py,sha256=4zL-zR3lgQTCWfcy28LK0HEcukQOndPEFXVqfYfdKHU,1720
159
159
  cognite_toolkit/_cdf_tk/data_classes/_base.py,sha256=0jy9VrYIO6iRgOZIcRASv-xIQjU3QbMICffEEIqzx6A,2673
160
160
  cognite_toolkit/_cdf_tk/data_classes/_build_files.py,sha256=ARZpzcpmcbtG5Jg391d7A-7MJCFeUqqiDfJlO14cvvI,953
161
161
  cognite_toolkit/_cdf_tk/data_classes/_build_variables.py,sha256=XSp9_tHWXSNt4cph5OGJvRGeQBtWuvR49vWgub5s8P8,9086
162
162
  cognite_toolkit/_cdf_tk/data_classes/_built_modules.py,sha256=Rak0-f0GgyQp_BwEW84YJ3N00F5_Be3twHuWb17Buq8,4724
163
163
  cognite_toolkit/_cdf_tk/data_classes/_built_resources.py,sha256=Rx6Pl4mSuCRwKUmiuXtOW3H0bT5uspcLdDhVVeJt4zU,8515
164
- cognite_toolkit/_cdf_tk/data_classes/_config_yaml.py,sha256=Bqxl34tOoxcwOdDFCwPBnfz2GXsgdsjhaB9ZMQ8qe5c,31216
164
+ cognite_toolkit/_cdf_tk/data_classes/_config_yaml.py,sha256=XIFFvW-7SdFPSoD0J2fhcr6gSo9B2CF90G-76A-MsSM,31566
165
165
  cognite_toolkit/_cdf_tk/data_classes/_deploy_results.py,sha256=NKxJFHiLlKW-5odWs_fQcyHmsysd6VzZHtJXJ3JlOQA,8693
166
- cognite_toolkit/_cdf_tk/data_classes/_module_directories.py,sha256=EnZTAs7KPRoAdw2_7UJp4emTPaPKeaO5-z1rMRsxRxw,11952
166
+ cognite_toolkit/_cdf_tk/data_classes/_module_directories.py,sha256=7XB0vdvMSJq7MyXjzNwlbv2Zd3i-OyyvgcOvoO4_GFQ,12259
167
167
  cognite_toolkit/_cdf_tk/data_classes/_module_resources.py,sha256=9I_2IGNbaiWGWDv7907TWYLTOJog6BdM65l3VihOsiA,9199
168
168
  cognite_toolkit/_cdf_tk/data_classes/_module_toml.py,sha256=aIJAszILhevbBsd-MPdNKwlkAXO3LttozC0SlryvR0Y,2735
169
169
  cognite_toolkit/_cdf_tk/data_classes/_packages.py,sha256=RPAi54GCBwMZFAA4XgIa1rGoQY4LiCC3ICl9GQpF8lI,4837
170
+ cognite_toolkit/_cdf_tk/data_classes/_tracking_info.py,sha256=tBWC_SVu87BRwgSmK3KWtlh03KuDIaAt09f7iYwwfX4,2001
170
171
  cognite_toolkit/_cdf_tk/data_classes/_yaml_comments.py,sha256=zfuDu9aAsb1ExeZBAJIqVaoqIZ050tO_oh3dApzlDwY,4937
171
172
  cognite_toolkit/_cdf_tk/prototypes/import_app.py,sha256=7dy852cBlHI2RQF1MidSmxl0jPBxekGWXnd2VtI7QFI,1899
172
173
  cognite_toolkit/_cdf_tk/prototypes/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -227,18 +228,18 @@ cognite_toolkit/_cdf_tk/resource_classes/robotics/location.py,sha256=dbc9HT-bc2Q
227
228
  cognite_toolkit/_cdf_tk/resource_classes/robotics/map.py,sha256=j77z7CzCMiMj8r94BdUKCum9EuZRUjaSlUAy9K9DL_Q,942
228
229
  cognite_toolkit/_cdf_tk/storageio/__init__.py,sha256=aM-skaPnKTH1B7HG0faeTUNf7u1b-sT8l7hh5JRZ1E8,2288
229
230
  cognite_toolkit/_cdf_tk/storageio/_applications.py,sha256=bhyG1d2_9duPkX-otC2brVcpChvdXSPkYhBHS5T_72g,4343
230
- cognite_toolkit/_cdf_tk/storageio/_asset_centric.py,sha256=d7WfCjuauIyUBfNJTgV5ZN-xSUmLGuuvLB0yPYnEg08,27734
231
- cognite_toolkit/_cdf_tk/storageio/_base.py,sha256=BQPueVpmxIYtSZ53W4cwp7pFEzvvpBd7Bz_L7Anw8hc,9308
231
+ cognite_toolkit/_cdf_tk/storageio/_asset_centric.py,sha256=Rhy64zUW4oxacq_vYomDeTRPmF6Vx-1mkYAFAqJE9vk,28312
232
+ cognite_toolkit/_cdf_tk/storageio/_base.py,sha256=NWXPdgzUnpBiav5Hi8XGHkWU9QiMjNzBQTxMcuxF-LA,11017
232
233
  cognite_toolkit/_cdf_tk/storageio/_data_classes.py,sha256=s3TH04BJ1q7rXndRhEbVMEnoOXjxrGg4n-w9Z5uUL-o,3480
233
234
  cognite_toolkit/_cdf_tk/storageio/_instances.py,sha256=_tKOdlo7tMJoh7y-47o7sySfDMRa-G-AFVprmzjn3EQ,9311
234
- cognite_toolkit/_cdf_tk/storageio/_raw.py,sha256=5UkIk5MkyyCyGRYmyD6qTIsEDKbI2EulPesYbqM8qAA,3466
235
+ cognite_toolkit/_cdf_tk/storageio/_raw.py,sha256=gU4muTo5MGOu2FrxwQz5XX21m1rGS_ZsUwWOC8KDrkY,3839
235
236
  cognite_toolkit/_cdf_tk/storageio/selectors/__init__.py,sha256=fXzR99mN8wDVkaH9fstoiyIfYajXxeM8x3ZFeQdkIUI,1333
236
237
  cognite_toolkit/_cdf_tk/storageio/selectors/_asset_centric.py,sha256=7Iv_ccVX6Vzt3ZLFZ0Er3hN92iEsFTm9wgF-yermOWE,1467
237
238
  cognite_toolkit/_cdf_tk/storageio/selectors/_base.py,sha256=FsHF63HIcVstvXPGLJ2WeDiEIC7JUVHXfhBtbJk-dF8,2440
238
239
  cognite_toolkit/_cdf_tk/storageio/selectors/_canvas.py,sha256=fs0i5rI13x6IStOPFQ3E-n8ey1eoV_QORD1-RtPF4A4,182
239
240
  cognite_toolkit/_cdf_tk/storageio/selectors/_charts.py,sha256=vcSjubTSd6_x3bA72vqk-9enp35V_opk6ZtzV2ZE_UQ,602
240
241
  cognite_toolkit/_cdf_tk/storageio/selectors/_instances.py,sha256=NCFSJrAw52bNX6UTfOali8PvNjlqHnvxzL0hYBr7ZmA,4934
241
- cognite_toolkit/_cdf_tk/storageio/selectors/_raw.py,sha256=AlzUNXldZ_iRBH_95ATS5n9SIXUTJC_06N6rlxpr2T4,476
242
+ cognite_toolkit/_cdf_tk/storageio/selectors/_raw.py,sha256=sZq9C4G9DMe3S46_usKet0FphQ6ow7cWM_PfXrEAakk,503
242
243
  cognite_toolkit/_cdf_tk/tk_warnings/__init__.py,sha256=U9bT-G2xKrX6mmtZ7nZ1FfQeCjNKfKP_p7pev90dwOE,2316
243
244
  cognite_toolkit/_cdf_tk/tk_warnings/base.py,sha256=cX8TCmb56gqx3lc7dankXuqpm5HGASJ4wTb07-MCJWs,4401
244
245
  cognite_toolkit/_cdf_tk/tk_warnings/fileread.py,sha256=d2Kx6YyLmCkyFNjK8MO6eKGceCIEaFLZ4LYcG-EjnuM,8947
@@ -269,10 +270,10 @@ cognite_toolkit/_cdf_tk/utils/text.py,sha256=EpIXjaQ5C5q5fjbUjAW7tncXpdJfiQeV7CY
269
270
  cognite_toolkit/_cdf_tk/utils/thread_safe_dict.py,sha256=NbRHcZvWpF9xHP5OkOMGFpxrPNbi0Q3Eea6PUNbGlt4,3426
270
271
  cognite_toolkit/_cdf_tk/utils/useful_types.py,sha256=tPZOcK1PR1hNogMCgF863APMK6p3528t5kKaKbVl0-s,1352
271
272
  cognite_toolkit/_cdf_tk/utils/validate_access.py,sha256=1puswcpgEDNCwdk91dhLqCBSu_aaUAd3Hsw21d-YVFs,21955
272
- cognite_toolkit/_cdf_tk/utils/fileio/__init__.py,sha256=_rZp6E2HaqixzPC57XQGaSm6xm1pFNXNJ4hBAnvGx1c,1137
273
+ cognite_toolkit/_cdf_tk/utils/fileio/__init__.py,sha256=ts5kYu_1Ks7xjnM6pIrVUrZe0nkYI6euYXeE4ox34xk,1199
273
274
  cognite_toolkit/_cdf_tk/utils/fileio/_base.py,sha256=MpWaD3lR9vrJ-kGzTiDOtChXhvFD7-xrP-Pzp7vjnLY,756
274
275
  cognite_toolkit/_cdf_tk/utils/fileio/_compression.py,sha256=8BAPgg5OKc3vkEEkqOvYsuyh12iXVNuEmC0omWwyJNQ,2355
275
- cognite_toolkit/_cdf_tk/utils/fileio/_readers.py,sha256=d6TdQlous0TnfzpsDjaLd6inHhUkh2TEdrlBrMayaCs,11094
276
+ cognite_toolkit/_cdf_tk/utils/fileio/_readers.py,sha256=77Uq5r0pnD8gXLDVPzLT-1VPfzyOK7TZk85BtWxW7DQ,11613
276
277
  cognite_toolkit/_cdf_tk/utils/fileio/_writers.py,sha256=ghNGBZjkISAlbxe8o5YWWloLXG9QKOtF_qGA9JkvYss,17712
277
278
  cognite_toolkit/_cdf_tk/utils/http_client/__init__.py,sha256=H1T-cyIoVaPL4MvN1IuG-cHgj-cqB7eszu2kIN939lw,813
278
279
  cognite_toolkit/_cdf_tk/utils/http_client/_client.py,sha256=zsN5eP1spgMkIRN6qeQ-djAohJVVuacpD2fnQh5QYx0,10916
@@ -284,13 +285,13 @@ cognite_toolkit/_repo_files/.gitignore,sha256=ip9kf9tcC5OguF4YF4JFEApnKYw0nG0vPi
284
285
  cognite_toolkit/_repo_files/AzureDevOps/.devops/README.md,sha256=OLA0D7yCX2tACpzvkA0IfkgQ4_swSd-OlJ1tYcTBpsA,240
285
286
  cognite_toolkit/_repo_files/AzureDevOps/.devops/deploy-pipeline.yml,sha256=brULcs8joAeBC_w_aoWjDDUHs3JheLMIR9ajPUK96nc,693
286
287
  cognite_toolkit/_repo_files/AzureDevOps/.devops/dry-run-pipeline.yml,sha256=OBFDhFWK1mlT4Dc6mDUE2Es834l8sAlYG50-5RxRtHk,723
287
- cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml,sha256=SKpoFkXR8f0H7AhoDJHmdN-vNkVqmpXzzbhzzNSFGtc,667
288
- cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml,sha256=BiHNR_3PtLFgSH-Uz7KtKzDkywcsiA_oOjJ4M2it9lg,2430
289
- cognite_toolkit/_resources/cdf.toml,sha256=vN6PvToANrJEjhUYpEzDdjUa1cSXa9NMgv1mp8iOb2I,487
288
+ cognite_toolkit/_repo_files/GitHub/.github/workflows/deploy.yaml,sha256=3sYDml0HnE0_ryoemce1AIr0skHCm5i4SthSM_3BRDA,667
289
+ cognite_toolkit/_repo_files/GitHub/.github/workflows/dry-run.yaml,sha256=2IMERh0DGL37Fs0X4P4wuiEN2y29gGqtDX704zitNi0,2430
290
+ cognite_toolkit/_resources/cdf.toml,sha256=mpGJ2GDQJB63ZDiAsHxrRrrgpNjD-HLIUIf8zJRJjaw,487
290
291
  cognite_toolkit/demo/__init__.py,sha256=-m1JoUiwRhNCL18eJ6t7fZOL7RPfowhCuqhYFtLgrss,72
291
292
  cognite_toolkit/demo/_base.py,sha256=6xKBUQpXZXGQ3fJ5f7nj7oT0s2n7OTAGIa17ZlKHZ5U,8052
292
- cognite_toolkit-0.6.86.dist-info/METADATA,sha256=gVYv6ykmqx89FtC_aWVCshPWVQ3B7LcpBUy1x8y17uQ,4501
293
- cognite_toolkit-0.6.86.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
294
- cognite_toolkit-0.6.86.dist-info/entry_points.txt,sha256=JlR7MH1_UMogC3QOyN4-1l36VbrCX9xUdQoHGkuJ6-4,83
295
- cognite_toolkit-0.6.86.dist-info/licenses/LICENSE,sha256=CW0DRcx5tL-pCxLEN7ts2S9g2sLRAsWgHVEX4SN9_Mc,752
296
- cognite_toolkit-0.6.86.dist-info/RECORD,,
293
+ cognite_toolkit-0.6.88.dist-info/METADATA,sha256=Ubje2tHMnCHTWlxk6Vdg2WJP8ocjbOGL4Tkoy-44QDY,4501
294
+ cognite_toolkit-0.6.88.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
295
+ cognite_toolkit-0.6.88.dist-info/entry_points.txt,sha256=JlR7MH1_UMogC3QOyN4-1l36VbrCX9xUdQoHGkuJ6-4,83
296
+ cognite_toolkit-0.6.88.dist-info/licenses/LICENSE,sha256=CW0DRcx5tL-pCxLEN7ts2S9g2sLRAsWgHVEX4SN9_Mc,752
297
+ cognite_toolkit-0.6.88.dist-info/RECORD,,