nominal 1.111.0__tar.gz → 1.111.2__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 (118) hide show
  1. {nominal-1.111.0 → nominal-1.111.2}/CHANGELOG.md +14 -0
  2. {nominal-1.111.0 → nominal-1.111.2}/PKG-INFO +2 -2
  3. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/dataset.py +2 -2
  4. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/polars/polars_export_handler.py +27 -2
  5. {nominal-1.111.0 → nominal-1.111.2}/pyproject.toml +3 -3
  6. {nominal-1.111.0 → nominal-1.111.2}/.gitignore +0 -0
  7. {nominal-1.111.0 → nominal-1.111.2}/LICENSE +0 -0
  8. {nominal-1.111.0 → nominal-1.111.2}/README.md +0 -0
  9. {nominal-1.111.0 → nominal-1.111.2}/nominal/__init__.py +0 -0
  10. {nominal-1.111.0 → nominal-1.111.2}/nominal/__main__.py +0 -0
  11. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/README.md +0 -0
  12. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/__init__.py +0 -0
  13. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/dataclass_tools.py +0 -0
  14. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/deprecation_tools.py +0 -0
  15. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/iterator_tools.py +0 -0
  16. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/streaming_tools.py +0 -0
  17. {nominal-1.111.0 → nominal-1.111.2}/nominal/_utils/timing_tools.py +0 -0
  18. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/__init__.py +0 -0
  19. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/__main__.py +0 -0
  20. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/attachment.py +0 -0
  21. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/auth.py +0 -0
  22. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/config.py +0 -0
  23. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/dataset.py +0 -0
  24. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/download.py +0 -0
  25. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/mis.py +0 -0
  26. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/run.py +0 -0
  27. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/util/__init__.py +0 -0
  28. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/util/click_log_handler.py +0 -0
  29. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/util/global_decorators.py +0 -0
  30. {nominal-1.111.0 → nominal-1.111.2}/nominal/cli/util/verify_connection.py +0 -0
  31. {nominal-1.111.0 → nominal-1.111.2}/nominal/config/__init__.py +0 -0
  32. {nominal-1.111.0 → nominal-1.111.2}/nominal/config/_config.py +0 -0
  33. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/__init__.py +0 -0
  34. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_checklist_types.py +0 -0
  35. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_clientsbunch.py +0 -0
  36. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_constants.py +0 -0
  37. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_event_types.py +0 -0
  38. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_stream/__init__.py +0 -0
  39. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_stream/batch_processor.py +0 -0
  40. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_stream/batch_processor_proto.py +0 -0
  41. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_stream/write_stream.py +0 -0
  42. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_stream/write_stream_base.py +0 -0
  43. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_types.py +0 -0
  44. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/README.md +0 -0
  45. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/__init__.py +0 -0
  46. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/api_tools.py +0 -0
  47. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/multipart.py +0 -0
  48. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/multipart_downloader.py +0 -0
  49. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/networking.py +0 -0
  50. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/pagination_tools.py +0 -0
  51. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/query_tools.py +0 -0
  52. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_utils/queueing.py +0 -0
  53. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/_video_types.py +0 -0
  54. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/asset.py +0 -0
  55. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/attachment.py +0 -0
  56. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/bounds.py +0 -0
  57. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/channel.py +0 -0
  58. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/checklist.py +0 -0
  59. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/client.py +0 -0
  60. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/connection.py +0 -0
  61. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/containerized_extractors.py +0 -0
  62. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/data_review.py +0 -0
  63. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/dataset_file.py +0 -0
  64. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/datasource.py +0 -0
  65. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/event.py +0 -0
  66. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/exceptions.py +0 -0
  67. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/filetype.py +0 -0
  68. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/log.py +0 -0
  69. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/run.py +0 -0
  70. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/secret.py +0 -0
  71. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/streaming_checklist.py +0 -0
  72. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/unit.py +0 -0
  73. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/user.py +0 -0
  74. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/video.py +0 -0
  75. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/video_file.py +0 -0
  76. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/workbook.py +0 -0
  77. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/workbook_template.py +0 -0
  78. {nominal-1.111.0 → nominal-1.111.2}/nominal/core/workspace.py +0 -0
  79. {nominal-1.111.0 → nominal-1.111.2}/nominal/exceptions/__init__.py +0 -0
  80. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/__init__.py +0 -0
  81. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/README.md +0 -0
  82. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/__init__.py +0 -0
  83. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/_buckets.py +0 -0
  84. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/__init__.py +0 -0
  85. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/_enum_expr_impls.py +0 -0
  86. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/_numeric_expr_impls.py +0 -0
  87. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/_range_expr_impls.py +0 -0
  88. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/exprs.py +0 -0
  89. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/compute/dsl/params.py +0 -0
  90. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/dataset_utils/__init__.py +0 -0
  91. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/dataset_utils/_dataset_utils.py +0 -0
  92. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/logging/__init__.py +0 -0
  93. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/logging/click_log_handler.py +0 -0
  94. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/logging/nominal_log_handler.py +0 -0
  95. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/logging/rich_log_handler.py +0 -0
  96. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/migration/__init__.py +0 -0
  97. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/migration/migration_data_config.py +0 -0
  98. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/migration/migration_resources.py +0 -0
  99. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/migration/migration_utils.py +0 -0
  100. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/rust_streaming/__init__.py +0 -0
  101. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/rust_streaming/rust_write_stream.py +0 -0
  102. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/stream_v2/__init__.py +0 -0
  103. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/stream_v2/_serializer.py +0 -0
  104. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/stream_v2/_write_stream.py +0 -0
  105. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/video_processing/__init__.py +0 -0
  106. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/video_processing/resolution.py +0 -0
  107. {nominal-1.111.0 → nominal-1.111.2}/nominal/experimental/video_processing/video_conversion.py +0 -0
  108. {nominal-1.111.0 → nominal-1.111.2}/nominal/nominal.py +0 -0
  109. {nominal-1.111.0 → nominal-1.111.2}/nominal/py.typed +0 -0
  110. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/__init__.py +0 -0
  111. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/matlab/__init__.py +0 -0
  112. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/matlab/_matlab.py +0 -0
  113. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/pandas/__init__.py +0 -0
  114. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/pandas/_pandas.py +0 -0
  115. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/polars/__init__.py +0 -0
  116. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/tdms/__init__.py +0 -0
  117. {nominal-1.111.0 → nominal-1.111.2}/nominal/thirdparty/tdms/_tdms.py +0 -0
  118. {nominal-1.111.0 → nominal-1.111.2}/nominal/ts/__init__.py +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.111.2](https://github.com/nominal-io/nominal-client/compare/v1.111.1...v1.111.2) (2026-02-04)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * prevent decimated exports from bricking polars export handler ([#596](https://github.com/nominal-io/nominal-client/issues/596)) ([8106f74](https://github.com/nominal-io/nominal-client/commit/8106f74dbc985c3f62946dbc4861eefa8e064964))
9
+
10
+ ## [1.111.1](https://github.com/nominal-io/nominal-client/compare/v1.111.0...v1.111.1) (2026-01-29)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * update bounds on dataset ([#598](https://github.com/nominal-io/nominal-client/issues/598)) ([9d57d3a](https://github.com/nominal-io/nominal-client/commit/9d57d3ae515359dce3ae4c102ffe230e3bf91faf))
16
+
3
17
  ## [1.111.0](https://github.com/nominal-io/nominal-client/compare/v1.110.0...v1.111.0) (2026-01-29)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nominal
3
- Version: 1.111.0
3
+ Version: 1.111.2
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
@@ -21,7 +21,7 @@ Requires-Dist: click<9,>=8
21
21
  Requires-Dist: conjure-python-client<4,>=3.1.0
22
22
  Requires-Dist: ffmpeg-python>=0.2.0
23
23
  Requires-Dist: nominal-api==0.1079.0
24
- Requires-Dist: nominal-streaming==0.5.8; platform_python_implementation == 'CPython' and python_version >= '3.10' and ((sys_platform == 'win32' and platform_machine == 'AMD64') or (sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'armv7l')))
24
+ Requires-Dist: nominal-streaming==0.7.12; platform_python_implementation == 'CPython' and python_version >= '3.10' and ((sys_platform == 'win32' and platform_machine == 'AMD64') or (sys_platform == 'darwin' and platform_machine == 'arm64') or (sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'armv7l' or platform_machine == 'aarch64' or platform_machine == 'arm64')))
25
25
  Requires-Dist: openpyxl>=0.0.0
26
26
  Requires-Dist: pandas>=0.0.0
27
27
  Requires-Dist: polars>=0.0.0
@@ -118,8 +118,8 @@ class Dataset(DataSource, RefreshableMixin[scout_catalog.EnrichedDataset]):
118
118
  end=_SecondsNanos.from_flexible(end).to_nanoseconds(),
119
119
  )
120
120
  request = scout_catalog.UpdateBoundsRequest(bounds=bounds._to_conjure())
121
- updated_dataset = self._clients.catalog.update_bounds(self._clients.auth_header, request, self.rid)
122
- return self._refresh_from_api(updated_dataset)
121
+ self._clients.catalog.update_global_dataset_bounds(self._clients.auth_header, request, self.rid)
122
+ return self.refresh()
123
123
 
124
124
  def _handle_ingest_response(self, response: ingest_api.IngestResponse) -> DatasetFile:
125
125
  if response.details.dataset is None:
@@ -42,6 +42,10 @@ DEFAULT_POINTS_PER_DATAFRAME = 25_000_000
42
42
  # Maximum number of channels to get data for within a single request to Nominal
43
43
  DEFAULT_CHANNELS_PER_REQUEST = 25
44
44
 
45
+ # Maximum number of buckets / decimated points exported per compute query.
46
+ # TODO(drake) raise 1000 limit once backend limit is raised
47
+ MAX_NUM_BUCKETS = 1000
48
+
45
49
  DEFAULT_EXPORTED_TIMESTAMP_COL_NAME = "timestamp"
46
50
  _INTERNAL_TS_COL = "__nmnl_ts__" # internal join key, chosen to avoid collision with channel names
47
51
 
@@ -133,8 +137,8 @@ def _batch_channel_points_per_second(
133
137
  if not channels:
134
138
  logger.warning("No channels given!")
135
139
  return {}
136
- elif num_buckets > 1000:
137
- raise ValueError("num_buckets must be <=1000")
140
+ elif num_buckets > MAX_NUM_BUCKETS:
141
+ raise ValueError(f"num_buckets ({num_buckets}) must be <= {MAX_NUM_BUCKETS}")
138
142
 
139
143
  # For each channel that has data with the given tags within the provided time range, add a
140
144
  # compute expression to later retrieve decimated bucket stats
@@ -683,6 +687,27 @@ class PolarsExportHandler:
683
687
  if None not in (buckets, resolution):
684
688
  raise ValueError("Cannot export data decimated with both buckets and resolution")
685
689
 
690
+ if resolution is not None:
691
+ # If the batch duration is higher than this number, and data is actually downsampled with the
692
+ # given resolution, then it would error today if the batch duration is any larger than this.
693
+ computed_batch_duration = datetime.timedelta(seconds=(resolution * MAX_NUM_BUCKETS) / 1e9)
694
+ if batch_duration is None:
695
+ logger.info(
696
+ "Manually setting batch_duration to %fs (resolution=%dns)",
697
+ computed_batch_duration.total_seconds(),
698
+ resolution,
699
+ )
700
+ batch_duration = computed_batch_duration
701
+ elif computed_batch_duration < batch_duration:
702
+ logger.warning(
703
+ "Configured batch_duration of %fs would result in failing exports with resolution=%dns. "
704
+ "Setting batch_duration to %fs instead.",
705
+ batch_duration.total_seconds(),
706
+ resolution,
707
+ computed_batch_duration.total_seconds(),
708
+ )
709
+ batch_duration = computed_batch_duration
710
+
686
711
  # Determine download schedule
687
712
  export_jobs = self._compute_export_jobs(
688
713
  channels, _TimeRange(start, end), timestamp_type, tags or {}, buckets, resolution, batch_duration
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nominal"
3
- version = "1.111.0"
3
+ version = "1.111.2"
4
4
  description = "Automate Nominal workflows in Python"
5
5
  authors = [
6
6
  { name = "Alexander Reynolds", email = "alex.reynolds@nominal.io" },
@@ -44,11 +44,11 @@ dependencies = [
44
44
  # nominal-streaming wheels exist for:
45
45
  # - Windows x86_64 (AMD64)
46
46
  # - macOS arm64
47
- # - Linux x86_64 and armv7l
47
+ # - Linux x86_64, arm64, and armv7l
48
48
  # To be conservative and prevent installation of the rest of the package on exotic architectures, we explicitly
49
49
  # list only the exact platforms supported
50
50
  # TODO(drake): support more architectures and clean up dependency markers.
51
- "nominal-streaming==0.5.8; platform_python_implementation=='CPython' and python_version>='3.10' and ((sys_platform=='win32' and platform_machine=='AMD64') or (sys_platform=='darwin' and platform_machine=='arm64') or (sys_platform=='linux' and (platform_machine=='x86_64' or platform_machine=='armv7l')))",
51
+ "nominal-streaming==0.7.12; platform_python_implementation=='CPython' and python_version>='3.10' and ((sys_platform=='win32' and platform_machine=='AMD64') or (sys_platform=='darwin' and platform_machine=='arm64') or (sys_platform=='linux' and (platform_machine=='x86_64' or platform_machine=='armv7l' or platform_machine=='aarch64' or platform_machine=='arm64')))",
52
52
  # Explicitly specifying urllib3 version to handle CVE present in earlier versions
53
53
  "urllib3==2.6.3",
54
54
  ]
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