nominal 1.98.0__tar.gz → 1.99.0__tar.gz

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.
Files changed (107) hide show
  1. {nominal-1.98.0 → nominal-1.99.0}/CHANGELOG.md +7 -0
  2. {nominal-1.98.0 → nominal-1.99.0}/PKG-INFO +1 -1
  3. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/dataset.py +72 -0
  4. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/filetype.py +1 -0
  5. {nominal-1.98.0 → nominal-1.99.0}/pyproject.toml +1 -1
  6. {nominal-1.98.0 → nominal-1.99.0}/.gitignore +0 -0
  7. {nominal-1.98.0 → nominal-1.99.0}/LICENSE +0 -0
  8. {nominal-1.98.0 → nominal-1.99.0}/README.md +0 -0
  9. {nominal-1.98.0 → nominal-1.99.0}/nominal/__init__.py +0 -0
  10. {nominal-1.98.0 → nominal-1.99.0}/nominal/__main__.py +0 -0
  11. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/README.md +0 -0
  12. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/__init__.py +0 -0
  13. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/dataclass_tools.py +0 -0
  14. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/deprecation_tools.py +0 -0
  15. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/iterator_tools.py +0 -0
  16. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/streaming_tools.py +0 -0
  17. {nominal-1.98.0 → nominal-1.99.0}/nominal/_utils/timing_tools.py +0 -0
  18. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/__init__.py +0 -0
  19. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/__main__.py +0 -0
  20. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/attachment.py +0 -0
  21. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/auth.py +0 -0
  22. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/config.py +0 -0
  23. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/dataset.py +0 -0
  24. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/download.py +0 -0
  25. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/mis.py +0 -0
  26. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/run.py +0 -0
  27. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/util/__init__.py +0 -0
  28. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/util/click_log_handler.py +0 -0
  29. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/util/global_decorators.py +0 -0
  30. {nominal-1.98.0 → nominal-1.99.0}/nominal/cli/util/verify_connection.py +0 -0
  31. {nominal-1.98.0 → nominal-1.99.0}/nominal/config/__init__.py +0 -0
  32. {nominal-1.98.0 → nominal-1.99.0}/nominal/config/_config.py +0 -0
  33. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/__init__.py +0 -0
  34. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_clientsbunch.py +0 -0
  35. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_constants.py +0 -0
  36. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_stream/__init__.py +0 -0
  37. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_stream/batch_processor.py +0 -0
  38. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_stream/batch_processor_proto.py +0 -0
  39. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_stream/write_stream.py +0 -0
  40. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_stream/write_stream_base.py +0 -0
  41. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/README.md +0 -0
  42. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/__init__.py +0 -0
  43. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/api_tools.py +0 -0
  44. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/multipart.py +0 -0
  45. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/multipart_downloader.py +0 -0
  46. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/networking.py +0 -0
  47. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/pagination_tools.py +0 -0
  48. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/query_tools.py +0 -0
  49. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/_utils/queueing.py +0 -0
  50. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/asset.py +0 -0
  51. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/attachment.py +0 -0
  52. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/bounds.py +0 -0
  53. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/channel.py +0 -0
  54. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/checklist.py +0 -0
  55. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/client.py +0 -0
  56. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/connection.py +0 -0
  57. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/containerized_extractors.py +0 -0
  58. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/data_review.py +0 -0
  59. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/dataset_file.py +0 -0
  60. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/datasource.py +0 -0
  61. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/event.py +0 -0
  62. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/exceptions.py +0 -0
  63. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/log.py +0 -0
  64. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/run.py +0 -0
  65. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/secret.py +0 -0
  66. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/unit.py +0 -0
  67. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/user.py +0 -0
  68. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/video.py +0 -0
  69. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/video_file.py +0 -0
  70. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/workbook.py +0 -0
  71. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/workbook_template.py +0 -0
  72. {nominal-1.98.0 → nominal-1.99.0}/nominal/core/workspace.py +0 -0
  73. {nominal-1.98.0 → nominal-1.99.0}/nominal/exceptions/__init__.py +0 -0
  74. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/__init__.py +0 -0
  75. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/README.md +0 -0
  76. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/__init__.py +0 -0
  77. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/_buckets.py +0 -0
  78. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/__init__.py +0 -0
  79. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/_enum_expr_impls.py +0 -0
  80. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/_numeric_expr_impls.py +0 -0
  81. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/_range_expr_impls.py +0 -0
  82. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/exprs.py +0 -0
  83. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/compute/dsl/params.py +0 -0
  84. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/logging/__init__.py +0 -0
  85. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/logging/click_log_handler.py +0 -0
  86. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/logging/nominal_log_handler.py +0 -0
  87. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/logging/rich_log_handler.py +0 -0
  88. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/rust_streaming/__init__.py +0 -0
  89. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/rust_streaming/rust_write_stream.py +0 -0
  90. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/stream_v2/__init__.py +0 -0
  91. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/stream_v2/_serializer.py +0 -0
  92. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/stream_v2/_write_stream.py +0 -0
  93. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/video_processing/__init__.py +0 -0
  94. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/video_processing/resolution.py +0 -0
  95. {nominal-1.98.0 → nominal-1.99.0}/nominal/experimental/video_processing/video_conversion.py +0 -0
  96. {nominal-1.98.0 → nominal-1.99.0}/nominal/nominal.py +0 -0
  97. {nominal-1.98.0 → nominal-1.99.0}/nominal/py.typed +0 -0
  98. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/__init__.py +0 -0
  99. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/matlab/__init__.py +0 -0
  100. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/matlab/_matlab.py +0 -0
  101. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/pandas/__init__.py +0 -0
  102. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/pandas/_pandas.py +0 -0
  103. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/polars/__init__.py +0 -0
  104. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/polars/polars_export_handler.py +0 -0
  105. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/tdms/__init__.py +0 -0
  106. {nominal-1.98.0 → nominal-1.99.0}/nominal/thirdparty/tdms/_tdms.py +0 -0
  107. {nominal-1.98.0 → nominal-1.99.0}/nominal/ts/__init__.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.99.0](https://github.com/nominal-io/nominal-client/compare/v1.98.0...v1.99.0) (2025-12-04)
4
+
5
+
6
+ ### Features
7
+
8
+ * allow ingesting .avro files ([#544](https://github.com/nominal-io/nominal-client/issues/544)) ([f5c4561](https://github.com/nominal-io/nominal-client/commit/f5c4561e1db6174a56d6b32b388ed7ad94679fdf))
9
+
3
10
  ## [1.98.0](https://github.com/nominal-io/nominal-client/compare/v1.97.0...v1.98.0) (2025-12-04)
4
11
 
5
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nominal
3
- Version: 1.98.0
3
+ Version: 1.99.0
4
4
  Summary: Automate Nominal workflows in Python
5
5
  Project-URL: Homepage, https://nominal.io
6
6
  Project-URL: Documentation, https://docs.nominal.io
@@ -203,6 +203,78 @@ class Dataset(DataSource, RefreshableMixin[scout_catalog.EnrichedDataset]):
203
203
  # Backward compatibility
204
204
  add_to_dataset_from_io = add_from_io
205
205
 
206
+ def add_avro_stream(
207
+ self,
208
+ path: Path | str,
209
+ ) -> DatasetFile:
210
+ """Upload an avro stream file with a specific schema, described below.
211
+
212
+ This is a "stream-like" file format to support
213
+ use cases where a columnar/tabular format does not make sense. This closely matches Nominal's streaming
214
+ API, making it useful for use cases where network connection drops during streaming and a backup file needs
215
+ to be created.
216
+
217
+ If this schema is not used, will result in a failed ingestion.
218
+ {
219
+ "type": "record",
220
+ "name": "AvroStream",
221
+ "namespace": "io.nominal.ingest",
222
+ "fields": [
223
+ {
224
+ "name": "channel",
225
+ "type": "string",
226
+ "doc": "Channel/series name (e.g., 'vehicle_id', 'col_1', 'temperature')",
227
+ },
228
+ {
229
+ "name": "timestamps",
230
+ "type": {"type": "array", "items": "long"},
231
+ "doc": "Array of Unix timestamps in nanoseconds",
232
+ },
233
+ {
234
+ "name": "values",
235
+ "type": {"type": "array", "items": ["double", "string"]},
236
+ "doc": "Array of values. Can either be doubles or strings",
237
+ },
238
+ {
239
+ "name": "tags",
240
+ "type": {"type": "map", "values": "string"},
241
+ "default": {},
242
+ "doc": "Key-value metadata tags",
243
+ },
244
+ ],
245
+ }
246
+
247
+ Args:
248
+ path: Path to the .avro file to upload
249
+
250
+ Returns:
251
+ Reference to the ingesting DatasetFile
252
+
253
+ """
254
+ avro_path = Path(path)
255
+ s3_path = upload_multipart_file(
256
+ self._clients.auth_header,
257
+ self._clients.workspace_rid,
258
+ avro_path,
259
+ self._clients.upload,
260
+ file_type=FileTypes.AVRO_STREAM,
261
+ )
262
+ target = ingest_api.DatasetIngestTarget(
263
+ existing=ingest_api.ExistingDatasetIngestDestination(dataset_rid=self.rid)
264
+ )
265
+ resp = self._clients.ingest.ingest(
266
+ self._clients.auth_header,
267
+ ingest_api.IngestRequest(
268
+ options=ingest_api.IngestOptions(
269
+ avro_stream=ingest_api.AvroStreamOpts(
270
+ source=ingest_api.IngestSource(s3=ingest_api.S3IngestSource(s3_path)),
271
+ target=target,
272
+ )
273
+ )
274
+ ),
275
+ )
276
+ return self._handle_ingest_response(resp)
277
+
206
278
  def add_journal_json(
207
279
  self,
208
280
  path: Path | str,
@@ -111,6 +111,7 @@ class FileType(NamedTuple):
111
111
 
112
112
 
113
113
  class FileTypes:
114
+ AVRO_STREAM: FileType = FileType(".avro", "application/avro")
114
115
  BINARY: FileType = FileType("", "application/octet-stream")
115
116
  CSV: FileType = FileType(".csv", "text/csv")
116
117
  CSV_GZ: FileType = FileType(".csv.gz", "text/csv")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nominal"
3
- version = "1.98.0"
3
+ version = "1.99.0"
4
4
  description = "Automate Nominal workflows in Python"
5
5
  authors = [
6
6
  { name = "Alexander Reynolds", email = "alex.reynolds@nominal.io" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes