UncountablePythonSDK 0.0.176__py3-none-any.whl → 0.0.178__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.
docs/conf.py CHANGED
@@ -7,6 +7,8 @@
7
7
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
8
8
 
9
9
  import datetime
10
+ import importlib
11
+ import inspect
10
12
 
11
13
  from docutils import nodes # type: ignore[import-untyped]
12
14
  from sphinx.addnodes import pending_xref # type: ignore[import-not-found]
@@ -63,6 +65,20 @@ favicons = [
63
65
  ]
64
66
 
65
67
 
68
+ def _resolve_alias_to_real_module(target_module: str) -> str:
69
+ if "." not in target_module:
70
+ return target_module
71
+ parent_name, attr_name = target_module.rsplit(".", 1)
72
+ try:
73
+ parent = importlib.import_module(parent_name)
74
+ except ImportError:
75
+ return target_module
76
+ aliased = getattr(parent, attr_name, None)
77
+ if not inspect.ismodule(aliased) or aliased.__name__ == target_module:
78
+ return target_module
79
+ return aliased.__name__
80
+
81
+
66
82
  def _hook_missing_reference(
67
83
  _app: Sphinx, _env: BuildEnvironment, node: pending_xref, contnode: nodes.Text
68
84
  ) -> nodes.reference | None:
@@ -80,6 +96,10 @@ def _hook_missing_reference(
80
96
  return None
81
97
 
82
98
  target_module, target_name = target.rsplit(".", 1)
99
+ real_module = _resolve_alias_to_real_module(target_module)
100
+ if real_module != target_module:
101
+ target_module = real_module
102
+ target = f"{target_module}.{target_name}"
83
103
 
84
104
  # construct relative path from current doc page to target page
85
105
  relative_segments_to_root = [".." for _ in current_doc.split("/")]
@@ -1,3 +1,5 @@
1
+ # CLOSED MODULE
2
+
1
3
  from ._blob_session import BlobSession as BlobSession
2
4
  from ._file_share_session import FileShareSession as FileShareSession
3
5
  from ._gdrive_session import (
@@ -32,3 +34,32 @@ from .file_type_utils import (
32
34
  RemoteObjectReference as RemoteObjectReference,
33
35
  )
34
36
  from .filesystem_session import FileSystemSession as FileSystemSession
37
+
38
+ __all__ = [
39
+ "BlobSession",
40
+ "FileObjectData",
41
+ "FileShareSession",
42
+ "FileSystemBlobConfig",
43
+ "FileSystemFileReference",
44
+ "FileSystemFileShareConfig",
45
+ "FileSystemObject",
46
+ "FileSystemS3Config",
47
+ "FileSystemSFTPConfig",
48
+ "FileSystemSession",
49
+ "FileTransfer",
50
+ "GDriveSession",
51
+ "IncompatibleFileReference",
52
+ "LocalSession",
53
+ "RemoteObjectReference",
54
+ "S3Session",
55
+ "SFTPConnection",
56
+ "SFTPCredentialError",
57
+ "SFTPSession",
58
+ "delete_gdrive_file",
59
+ "download_gdrive_file",
60
+ "list_gdrive_files",
61
+ "list_sftp_files",
62
+ "move_gdrive_file",
63
+ "move_sftp_files",
64
+ "upload_file_gdrive",
65
+ ]
@@ -3,5 +3,7 @@ from typing import Self
3
3
 
4
4
  # Blocks a string key value from being interpreted for case conversion
5
5
  class OpaqueKey(str): # noqa: FURB189
6
+ __slots__ = ()
7
+
6
8
  def __new__(cls, key: str) -> Self:
7
9
  return str.__new__(cls, key)
@@ -1,3 +1,5 @@
1
+ # CLOSED MODULE
2
+
1
3
  from .strenum_compat import StrEnum
2
4
 
3
5
  __all__ = ["StrEnum"]
@@ -298,6 +298,10 @@ class Client(ClientMethods):
298
298
  else None
299
299
  )
300
300
  response = self._send_request(request, timeout=timeout)
301
+ if self._cfg.logger is not None:
302
+ self._cfg.logger.set_span_attribute(
303
+ "http.status_code", response.status_code
304
+ )
301
305
  response_data = self._get_response_json(response, request_id=request_id)
302
306
  cached_parser = self._get_cached_parser(return_type)
303
307
  try:
@@ -17,6 +17,7 @@ from uncountable.types import uploader_t
17
17
  from .types import AuthDetailsAll, AuthDetailsApiKey
18
18
 
19
19
  _CHUNK_SIZE = 5 * 1024 * 1024 # s3 requires 5MiB minimum
20
+ _PARSED_FILE_DATA_FILENAME = "parsed_file_data.json"
20
21
 
21
22
 
22
23
  class FileUploadType(StrEnum):
@@ -51,17 +52,27 @@ class UploaderFileUpload:
51
52
  FileUpload = MediaFileUpload | DataFileUpload | UploaderFileUpload
52
53
 
53
54
 
54
- @dataclass(kw_only=True)
55
- class _ParsedFileDataWrapper:
56
- parsed_file_data: list[uploader_t.ParsedFileData]
57
-
58
-
59
55
  @dataclass(kw_only=True)
60
56
  class FileBytes:
61
57
  name: str
62
58
  bytes_data: BytesIO
63
59
 
64
60
 
61
+ def _build_parsed_file_data_bytes(
62
+ *, parsed_file_data: list[uploader_t.ParsedFileData]
63
+ ) -> FileBytes:
64
+ buffer = BytesIO()
65
+ buffer.write(b'{"parsed_file_data": [')
66
+ for index, file_data in enumerate(parsed_file_data):
67
+ if index > 0:
68
+ buffer.write(b", ")
69
+ serialized_file_data = serialize_for_storage(file_data)
70
+ buffer.write(json.dumps(serialized_file_data).encode("utf-8"))
71
+ buffer.write(b"]}")
72
+ buffer.seek(0)
73
+ return FileBytes(name=_PARSED_FILE_DATA_FILENAME, bytes_data=buffer)
74
+
75
+
65
76
  @contextmanager
66
77
  def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None]:
67
78
  match file_upload:
@@ -73,15 +84,9 @@ def file_upload_data(file_upload: FileUpload) -> Generator[FileBytes, None, None
73
84
  case DataFileUpload():
74
85
  yield FileBytes(name=file_upload.name, bytes_data=file_upload.data)
75
86
  case UploaderFileUpload():
76
- wrapper = _ParsedFileDataWrapper(
87
+ yield _build_parsed_file_data_bytes(
77
88
  parsed_file_data=file_upload.parsed_file_data
78
89
  )
79
- serialized = serialize_for_storage(wrapper)
80
- json_bytes = json.dumps(serialized).encode("utf-8")
81
- yield FileBytes(
82
- name="parsed_file_data.json",
83
- bytes_data=BytesIO(json_bytes),
84
- )
85
90
 
86
91
 
87
92
  @dataclass(kw_only=True)
@@ -135,7 +140,7 @@ class FileUploader:
135
140
  case DataFileUpload():
136
141
  attributes["file_name"] = file_upload.name
137
142
  case UploaderFileUpload():
138
- attributes["file_name"] = "parsed_file_data.json"
143
+ attributes["file_name"] = _PARSED_FILE_DATA_FILENAME
139
144
  case _:
140
145
  assert_never(file_upload)
141
146
  with push_scope_optional(
@@ -13,6 +13,7 @@ from uncountable.core.query.column import (
13
13
  Column,
14
14
  ColumnFilter,
15
15
  EnumColumn,
16
+ JsonColumn,
16
17
  NullableColumn,
17
18
  PrimaryKeyColumn,
18
19
  get_column_base,
@@ -72,8 +73,16 @@ class QueryBuilder[QueryRowT: QueryRow]:
72
73
  column.identifier for column in column_definitions.values()
73
74
  )
74
75
  self._property_names: tuple[str, ...] = tuple(column_definitions.keys())
76
+ json_property_names = {
77
+ name
78
+ for name, column in column_definitions.items()
79
+ if isinstance(column, JsonColumn)
80
+ }
75
81
  self._parser: CachedParser = CachedParser(
76
- serial_class(unconverted_keys={*self._property_names})(
82
+ serial_class(
83
+ unconverted_keys={*self._property_names},
84
+ unconverted_values=json_property_names,
85
+ )(
77
86
  make_dataclass(
78
87
  cls_name=self._model.__name__,
79
88
  fields=[
@@ -465,6 +465,27 @@ class NullableTextsColumn[
465
465
  # IMPROVE: Implement "Not Exists" filter (when supported in SDK)
466
466
 
467
467
 
468
+ class JsonColumn(Column[base_t.JsonValue, NullableColumn]):
469
+ __hash__ = Column.__hash__
470
+
471
+ def __init__(self, identifier: listing_t.ColumnIdentifier) -> None:
472
+ super().__init__(
473
+ identifier=identifier,
474
+ nullable=NullableColumn,
475
+ value_type=(
476
+ dict[str, base_t.JsonValue] | list[base_t.JsonValue] | base_t.JsonScalar
477
+ ),
478
+ )
479
+
480
+ def __ne__(self, other: None) -> ColumnFilter: # type: ignore[override]
481
+ return ColumnFilter(
482
+ identifier=self.identifier,
483
+ filter=lambda identifier: listing_t.FilterSpecExists(column=identifier),
484
+ )
485
+
486
+ # IMPROVE: Implement "Not Exists" filter (when supported in SDK)
487
+
488
+
468
489
  class PrimaryKeyColumn(
469
490
  Column[base_t.ObjectId, NonNullableColumn],
470
491
  ):
@@ -684,6 +705,10 @@ class IdColumn[
684
705
  column: NullableTextsColumn[BaseNullableT],
685
706
  ) -> NullableTextsColumn[BaseNullableT]: ...
686
707
 
708
+ # Json
709
+ @overload
710
+ def __rshift__(self, column: JsonColumn) -> JsonColumn: ...
711
+
687
712
  # Ids
688
713
  @overload
689
714
  def __rshift__[
@@ -734,6 +759,7 @@ class IdColumn[
734
759
  | NumericColumn[BaseNullableT]
735
760
  | TextsColumn[BaseNullableT]
736
761
  | NullableTextsColumn[BaseNullableT]
762
+ | JsonColumn
737
763
  | IdsColumn[BaseNullableT]
738
764
  | IdColumn[BaseNullableT],
739
765
  ) -> (
@@ -768,6 +794,7 @@ class IdColumn[
768
794
  | NullableTextsColumn[BaseNullableT]
769
795
  | NullableTextsColumn[NonNullableColumn | NullableColumn]
770
796
  | NullableTextsColumn[NullableColumn]
797
+ | JsonColumn
771
798
  | IdsColumn[BaseNullableT]
772
799
  | IdsColumn[NonNullableColumn | NullableColumn]
773
800
  | IdsColumn[NullableColumn]
@@ -869,6 +896,8 @@ class IdColumn[
869
896
  if self.nullable is NonNullableColumn
870
897
  else NullableColumn,
871
898
  )
899
+ case JsonColumn():
900
+ return JsonColumn(identifier=transitive_identifier)
872
901
  case IdsColumn():
873
902
  return IdsColumn(
874
903
  id_type=column.id_type,
@@ -27,6 +27,7 @@ from opentelemetry.sdk.trace.export import (
27
27
  SimpleSpanProcessor,
28
28
  )
29
29
  from opentelemetry.trace import Span, Tracer
30
+ from opentelemetry.util.types import AttributeValue
30
31
 
31
32
  from pkgs.serialization_util import dict_fields
32
33
  from uncountable.core.environment import (
@@ -188,6 +189,9 @@ class Logger:
188
189
  )
189
190
  otel_logger.emit(log_record)
190
191
 
192
+ def set_span_attribute(self, key: str, value: AttributeValue) -> None:
193
+ self._current_span_with_fallback().set_attribute(key, value)
194
+
191
195
  def bind(self, *, attributes: Attributes) -> None:
192
196
  # Bound attributes flow into log records and the X-UNC-METADATA request
193
197
  # header on outbound API calls. The header is capped at 2048 bytes; if
@@ -22,7 +22,7 @@ __all__: list[str] = [
22
22
 
23
23
  ENDPOINT_METHOD = "POST"
24
24
  ENDPOINT_PATH = "api/external/integrations/publish_realtime_data"
25
- ENDPOINT_DESCRIPTION = "Publish a numeric reading for a realtime instrument integration. Currently only supports equipment entities. Resolves the target equipment via identifier key. Returns the integration session details and status. API is in beta \u2014 contact Uncountable for realtime integration guidance."
25
+ ENDPOINT_DESCRIPTION = "Publish a numeric reading for a realtime instrument integration. Currently only supports equipment entities. Resolves the target equipment via identifier key. Returns the integration session details and status. Contact Uncountable for realtime integration guidance."
26
26
 
27
27
 
28
28
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1713,7 +1713,7 @@ class ClientMethods(ABC):
1713
1713
  data_package: integrations_t.DataPackage,
1714
1714
  _request_options: client_config_t.RequestOptions | None = None,
1715
1715
  ) -> publish_realtime_data_t.Data:
1716
- """Publish a numeric reading for a realtime instrument integration. Currently only supports equipment entities. Resolves the target equipment via identifier key. Returns the integration session details and status. API is in beta — contact Uncountable for realtime integration guidance.
1716
+ """Publish a numeric reading for a realtime instrument integration. Currently only supports equipment entities. Resolves the target equipment via identifier key. Returns the integration session details and status. Contact Uncountable for realtime integration guidance.
1717
1717
 
1718
1718
  """
1719
1719
  args = publish_realtime_data_t.Arguments(
@@ -48,9 +48,11 @@ __all__: list[str] = [
48
48
  "condition_parameter_matches": "Condition Parameter Matches",
49
49
  "condition_parameter_rule": "Condition Parameter Rule",
50
50
  "condition_parameter_value": "Condition Parameter Value",
51
+ "config_transfer_export": "Config Transfer Export",
51
52
  "constraint": "Constraint",
52
53
  "constraint_set": "Constraint Set",
53
54
  "control_type": "Control Type",
55
+ "credit_balance": "Credit Balance",
54
56
  "curve_settings": "Curve Settings",
55
57
  "custom_entity": "Custom Entity",
56
58
  "default_permissions_new_project": "Default Permissions New Project",
@@ -82,6 +84,7 @@ __all__: list[str] = [
82
84
  "external_ai_connector": "External AI Connector",
83
85
  "external_ai_model": "External AI Model",
84
86
  "external_ai_session": "External AI Session",
87
+ "external_ai_usage": "External AI Usage",
85
88
  "experiment_group": "Experiment Group",
86
89
  "experiment_group_member": "Experiment Group Member",
87
90
  "experiment_group_type": "Experiment Group Type",
@@ -299,9 +302,11 @@ class EntityType(StrEnum):
299
302
  CONDITION_PARAMETER_MATCHES = "condition_parameter_matches"
300
303
  CONDITION_PARAMETER_RULE = "condition_parameter_rule"
301
304
  CONDITION_PARAMETER_VALUE = "condition_parameter_value"
305
+ CONFIG_TRANSFER_EXPORT = "config_transfer_export"
302
306
  CONSTRAINT = "constraint"
303
307
  CONSTRAINT_SET = "constraint_set"
304
308
  CONTROL_TYPE = "control_type"
309
+ CREDIT_BALANCE = "credit_balance"
305
310
  CURVE_SETTINGS = "curve_settings"
306
311
  CUSTOM_ENTITY = "custom_entity"
307
312
  DEFAULT_PERMISSIONS_NEW_PROJECT = "default_permissions_new_project"
@@ -333,6 +338,7 @@ class EntityType(StrEnum):
333
338
  EXTERNAL_AI_CONNECTOR = "external_ai_connector"
334
339
  EXTERNAL_AI_MODEL = "external_ai_model"
335
340
  EXTERNAL_AI_SESSION = "external_ai_session"
341
+ EXTERNAL_AI_USAGE = "external_ai_usage"
336
342
  EXPERIMENT_GROUP = "experiment_group"
337
343
  EXPERIMENT_GROUP_MEMBER = "experiment_group_member"
338
344
  EXPERIMENT_GROUP_TYPE = "experiment_group_type"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.176
3
+ Version: 0.0.178
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  docs/.flowmarkignore,sha256=gmJziQDpI3zbfHFgM73BE9iaLn04Oqya_7QCjJ749o8,548
2
2
  docs/.gitignore,sha256=_ebkZUcwfvfnGEJ95rfj1lxoBNd6EE9ZvtOc7FsbfFE,7
3
- docs/conf.py,sha256=Ky-_Y76T7pwN2aBG-dSF79Av70e7ASgcOXEdQ1qyor4,3542
3
+ docs/conf.py,sha256=KivJNvQWboXqJ07NMgcYY5tsV6CoIfyTpZh8jdn_5Qk,4239
4
4
  docs/index.md,sha256=g4Yi5831fEkywYkkcFohYLkKzSI91SOZF7DxKsm9zgI,3193
5
5
  docs/justfile,sha256=WymCEQ6W2A8Ak79iUPmecmuaUNN2htb7STUrz5K7ELE,273
6
6
  docs/requirements.txt,sha256=8aqtVaNV4AlzUZ7nAM8kxOF1ccAcujhQ_ayU9Whksf8,172
@@ -55,7 +55,7 @@ pkgs/argument_parser/parser_function_type.py,sha256=xmsg0YVseYbUx52qC9vP-_m9F_He
55
55
  pkgs/argument_parser/parser_inner.py,sha256=yteyamw3ZyMSQtDujkXgQVIpbtrpFbtjahtDNVKoGEE,23887
56
56
  pkgs/argument_parser/parser_options.py,sha256=NAwNZSIH8EjyfJXJSxbn4kYmF3K7D3HuOedlSjjsF28,1332
57
57
  pkgs/argument_parser/type_predicates.py,sha256=CkQexiseN05XDz4e34K3gIOlER5LG5Ke8u0UHK4gC04,1157
58
- pkgs/filesystem_utils/__init__.py,sha256=6xVtJo-5OMv8UGanNc7SfZte_iSXs5lE5au47QePy60,1381
58
+ pkgs/filesystem_utils/__init__.py,sha256=G-Nl0sxJsSgBB6yajzzY9aeSSBnkzJHGq3lj5LFn8fw,2056
59
59
  pkgs/filesystem_utils/_blob_session.py,sha256=YB_idar5qVuF9QN_A6qjpTuyeZ7JDOLri1LGLfPHLow,5158
60
60
  pkgs/filesystem_utils/_file_share_session.py,sha256=xlxCbNtOOT1xXCiL2Y_unjWZlQ9961J7mAz4D0-uea8,5095
61
61
  pkgs/filesystem_utils/_gdrive_session.py,sha256=4P2MSsA0GNxIYJxvmf7zKR8dM8oVMCCSzDIEkGA7XqE,11089
@@ -68,7 +68,7 @@ pkgs/filesystem_utils/filesystem_session.py,sha256=BQ2Go8Mu9-GcnaWh2Pm4x7ugLVsre
68
68
  pkgs/serialization/__init__.py,sha256=5OWO4IicaVrTWgRdC6E1K4dLYy2xQ6xQujDOuglykNU,1059
69
69
  pkgs/serialization/annotation.py,sha256=JXP2caXNoj8h_Pvx_26iarPlsaPcIqe1qssTksJiKjM,3408
70
70
  pkgs/serialization/missing_sentry.py,sha256=VCXiYs7s5MkfG8kbmwDAswdq0fL4zFRj4B2uSQzmTos,819
71
- pkgs/serialization/opaque_key.py,sha256=GKmZgxzzEghpukcuzSGXqG9afl_KZ7MFtLAY-Xqgu9k,213
71
+ pkgs/serialization/opaque_key.py,sha256=QepNPlAnzpOgLI0ztc9BRB7Xr_wLoVozxfHmL0C6slg,233
72
72
  pkgs/serialization/serial_alias.py,sha256=ABEGtSEapeW95wo9NT4srEhzdGaP5RhB8EyWSyWhwKg,1337
73
73
  pkgs/serialization/serial_class.py,sha256=AfWHdGlnEY2O2GbwU-SXZp7ZbTlPoigZ624QGp8kkuE,7099
74
74
  pkgs/serialization/serial_generic.py,sha256=qdG46rw5jnvckmKezxwMSJEIF-9Y4K5FdTezS1vRSgI,476
@@ -80,7 +80,7 @@ pkgs/serialization_util/_get_type_for_serialization.py,sha256=dW5_W9MFd6wgWfW5ql
80
80
  pkgs/serialization_util/convert_to_snakecase.py,sha256=H2BAo5ZdcCDN77RpLb-uP0s7-FQ5Ukwnsd3VYc1vD0M,583
81
81
  pkgs/serialization_util/dataclasses.py,sha256=uhNGXQPQLZblDFQuuwkAGmKOPiRyfDzCdg72CVtYJGA,390
82
82
  pkgs/serialization_util/serialization_helpers.py,sha256=v8omOQ2BRZZCzMeUwu29fCEqx0UNDJ_iNbqpW4oHk84,7804
83
- pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpGbk,59
83
+ pkgs/strenum_compat/__init__.py,sha256=Bq1kcPIQsXRiLUGWc63QGnVa5BlhvuFWpMMvdNcHy00,76
84
84
  pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
85
85
  pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
86
86
  pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
@@ -118,13 +118,13 @@ uncountable/__init__.py,sha256=8l8XWNCKsu7TG94c-xa2KHpDegvxDC2FyQISdWC763Y,89
118
118
  uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
119
  uncountable/core/__init__.py,sha256=RFv0kO6rKFf1PtBPu83hCGmxqkJamRtsgQ9_-ztw7tA,341
120
120
  uncountable/core/async_batch.py,sha256=9pYGFzVCQXt8059qFHgutweGIFPquJ5Xfq6NT5P-1K0,1206
121
- uncountable/core/client.py,sha256=XSAPfcSU51d3MgAZOuT6FMrdrM452KQfWzNHjLOGSMY,16549
121
+ uncountable/core/client.py,sha256=I5q47V5Xre7ZjqLW8Dd7BRJtlpcWiTJQdaxrn8QjaQ8,16726
122
122
  uncountable/core/environment.py,sha256=Z9vu7JtnSDgQB_KKcZnjTFNyARXjRr_PDW9krwxNNAo,1132
123
- uncountable/core/file_upload.py,sha256=hvxz6lq1Hv4nK51bux8W_Tl22_UNBtd8U21OWteXWjI,5730
123
+ uncountable/core/file_upload.py,sha256=IisvIBdm2f4CJTRQ9Awi5JuI16PSERjXrzZgmrUiCHY,5960
124
124
  uncountable/core/types.py,sha256=s2CjqYJpsmbC7xMwxxT7kJ_V9bwokrjjWVVjpMcQpKI,333
125
125
  uncountable/core/query/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- uncountable/core/query/builder.py,sha256=bnsHdeV6Pe2gf2kpbVDtY8_cQmmp51CMprLfNjymN8Q,8243
127
- uncountable/core/query/column.py,sha256=Xxvp9C4PkHtcSI5NGAt90NBI4-xpNwpvRJr6f1L51hA,44285
126
+ uncountable/core/query/builder.py,sha256=LmPHfi0wdNGVn1hdYxTAU1MTsIDlVc_lgWBZFVVmZR8,8510
127
+ uncountable/core/query/column.py,sha256=q5Yy41oS8MNrNaHAZVoftooJExPymm2tmCTF-BAPsoY,45231
128
128
  uncountable/core/query/row.py,sha256=dy68YKvMz336nyOsj_g2oNTLKBuUnKRUz5n99sApfT0,1600
129
129
  uncountable/core/query/types.py,sha256=xZgc0_O1PIxZoJWQhxkg3qnSvHj3yt-bv9QX1UCOFGw,481
130
130
  uncountable/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -137,7 +137,7 @@ uncountable/integration/request_context.py,sha256=N_FJJxqvfUJ0yV9h3I3vFTGNJiDfyL
137
137
  uncountable/integration/scan_profiles.py,sha256=86CQgrQ-zXl3p41ERazzbzhTIIjIh_BprWVfYTSHHE4,3259
138
138
  uncountable/integration/scheduler.py,sha256=BajQ4txvgEBw8S9x1P0eGm-uBkKp_oecJK65SQd2hNw,8477
139
139
  uncountable/integration/server.py,sha256=P4RRGwU9jMselHPWbU6GxhRLgVtN7Ydcxr18sFn2zI8,5778
140
- uncountable/integration/telemetry.py,sha256=7IWhCxchtVYJwwwFYduwnMEUdxO8srx2RnocLzcQmtg,15965
140
+ uncountable/integration/telemetry.py,sha256=zvg-K8uy49vQxWgInXAx-Sz8jHC0IWT1kdzPQdp9ROA,16162
141
141
  uncountable/integration/webhook_signature_key.py,sha256=vXlNtj0qLqZxjKDLmRvlChvLS5xoPAGmYcYcs4WIVaM,3882
142
142
  uncountable/integration/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
143
  uncountable/integration/db/connect.py,sha256=mE3bdV0huclH2iT_dXCQdRL4LkjIuf_myAR64RTWXEs,498
@@ -186,7 +186,7 @@ uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6R
186
186
  uncountable/types/calculations_t.py,sha256=_K4MDVoxa6AgxlxPrEDBujWhEGWEhUQuE2-ZgiLg9OU,660
187
187
  uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
188
188
  uncountable/types/chemical_structure_t.py,sha256=tbA7NBO-vv7Hnk3-ETxc6Pw3wqWeenBG27Y9_bdPCu4,785
189
- uncountable/types/client_base.py,sha256=kwy2tJ5L1v02YFeT_wFuFh543ffMEnhNuzFxL1MdvgQ,135001
189
+ uncountable/types/client_base.py,sha256=h3uIZLAyJR_FPo3SAKXgkk6HDTGAaLmcio3klzcIIM0,134982
190
190
  uncountable/types/client_config.py,sha256=M7FZ0m_lGmBsIYcMn8pm92DdoVzrLpzd8sH6DqTQLKo,456
191
191
  uncountable/types/client_config_t.py,sha256=-YNp-zFvk5OL6_WGwGSx30ToK2bGIOh0kv_HN7KcCys,1796
192
192
  uncountable/types/condition_match.py,sha256=ekDzij7-e1PtVwIslSjD1T9fuBIDr5c_7QPdaasiGJw,262
@@ -196,7 +196,7 @@ uncountable/types/curves_t.py,sha256=WIML06C67yC4KWdPJR2HV_Ac7eBFTDRDUL3YgeXbFOs
196
196
  uncountable/types/data.py,sha256=u2isf4XEug3Eu-xSIoqGaCQmW2dFaKBHCkP_WKYwwBc,500
197
197
  uncountable/types/data_t.py,sha256=U_dIh5GcyaJlkrHEI4Qf4TOo1uJX07PYO70sYzzKtTo,2615
198
198
  uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
199
- uncountable/types/entity_t.py,sha256=v2nuly-LbmFoSBHFtd7apIs2OcMUyXpX5AvYIXweMOc,27562
199
+ uncountable/types/entity_t.py,sha256=LyANi9Myj5gVAMta5AN9ijiTjwOwJeKNCQ12vrmY_VQ,27852
200
200
  uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
201
201
  uncountable/types/experiment_groups_t.py,sha256=QjZBdjnbsD1D-VpPSSV6hBg-Q7mujjKvYtdMewtXNVU,712
202
202
  uncountable/types/exports.py,sha256=VMmxUO2PpV1Y63hZ2AnVor4H-B6aswJ7YpSru_u89lU,334
@@ -341,7 +341,7 @@ uncountable/types/api/inputs/set_input_category.py,sha256=EWQdlp-qhgtOOf0bwdjvix
341
341
  uncountable/types/api/inputs/set_input_subcategories.py,sha256=5nJgffEe-9Fh_VUXqZkI6Uwoa36D0d4lIhADtRGr7tk,1615
342
342
  uncountable/types/api/inputs/set_intermediate_type.py,sha256=Qsrjv67hvNHIad58kFm-8BcD1Ny8wzkuLz3aIB7ybSw,1641
343
343
  uncountable/types/api/integrations/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
344
- uncountable/types/api/integrations/publish_realtime_data.py,sha256=HJkfczKaLOySHWgI0qQcDQzanSUPRkv0HhnHipUKjnk,1960
344
+ uncountable/types/api/integrations/publish_realtime_data.py,sha256=R5efPtt3RMEwoazLiqblndRPd57RTF1YajgwWiieH1Y,1938
345
345
  uncountable/types/api/integrations/push_notification.py,sha256=cqJv-qXI97jg8HFdoDF-KYaxSUgV3fqD1N614WZvaBw,1701
346
346
  uncountable/types/api/integrations/register_sockets_token.py,sha256=LJ_1LSfjVjTz-uhZkjcIw80Ah8D9pgdjQGjsTSS8gtM,1393
347
347
  uncountable/types/api/listing/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
@@ -414,7 +414,7 @@ uncountable/types/api/uploader/complete_async_parse.py,sha256=Os1HAubxTlbut6Gylj
414
414
  uncountable/types/api/uploader/invoke_uploader.py,sha256=QU1KmAFgGHSWskZEKfaAww8rCj-hVNP0i4kMQE3x3Fc,1822
415
415
  uncountable/types/api/user/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
416
416
  uncountable/types/api/user/get_current_user_info.py,sha256=BT7bGp5SOHz3XdKWhhdZ6acnInafT2PgdJ-H4YH3W7c,1181
417
- uncountablepythonsdk-0.0.176.dist-info/METADATA,sha256=s0UZYChC9s08XuTnFwHFzr4j6RYWBqgwTMemmUggQTk,2175
418
- uncountablepythonsdk-0.0.176.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
419
- uncountablepythonsdk-0.0.176.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
420
- uncountablepythonsdk-0.0.176.dist-info/RECORD,,
417
+ uncountablepythonsdk-0.0.178.dist-info/METADATA,sha256=wl_jrsVOIztNXhFZhDki7qQA8B6rK8U-suwvKFcL5nk,2175
418
+ uncountablepythonsdk-0.0.178.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
419
+ uncountablepythonsdk-0.0.178.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
420
+ uncountablepythonsdk-0.0.178.dist-info/RECORD,,