UncountablePythonSDK 0.0.115__py3-none-any.whl → 0.0.142.dev0__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 UncountablePythonSDK might be problematic. Click here for more details.

Files changed (119) hide show
  1. docs/conf.py +52 -5
  2. docs/index.md +107 -4
  3. docs/integration_examples/create_ingredient.md +43 -0
  4. docs/integration_examples/create_output.md +56 -0
  5. docs/integration_examples/index.md +6 -0
  6. docs/justfile +1 -1
  7. docs/requirements.txt +3 -2
  8. examples/basic_auth.py +7 -0
  9. examples/integration-server/jobs/materials_auto/example_cron.py +3 -0
  10. examples/integration-server/jobs/materials_auto/example_http.py +19 -7
  11. examples/integration-server/jobs/materials_auto/example_instrument.py +100 -0
  12. examples/integration-server/jobs/materials_auto/example_parse.py +140 -0
  13. examples/integration-server/jobs/materials_auto/example_predictions.py +61 -0
  14. examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +57 -16
  15. examples/integration-server/jobs/materials_auto/profile.yaml +27 -0
  16. examples/integration-server/pyproject.toml +4 -4
  17. examples/oauth.py +7 -0
  18. pkgs/argument_parser/__init__.py +1 -0
  19. pkgs/argument_parser/_is_namedtuple.py +3 -0
  20. pkgs/argument_parser/argument_parser.py +22 -3
  21. pkgs/serialization_util/serialization_helpers.py +3 -1
  22. pkgs/type_spec/builder.py +66 -19
  23. pkgs/type_spec/builder_types.py +9 -0
  24. pkgs/type_spec/config.py +26 -5
  25. pkgs/type_spec/cross_output_links.py +10 -16
  26. pkgs/type_spec/emit_open_api.py +72 -22
  27. pkgs/type_spec/emit_open_api_util.py +1 -0
  28. pkgs/type_spec/emit_python.py +76 -12
  29. pkgs/type_spec/emit_typescript.py +48 -32
  30. pkgs/type_spec/emit_typescript_util.py +44 -6
  31. pkgs/type_spec/load_types.py +2 -2
  32. pkgs/type_spec/open_api_util.py +16 -1
  33. pkgs/type_spec/parts/base.ts.prepart +4 -0
  34. pkgs/type_spec/type_info/emit_type_info.py +37 -4
  35. pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +1 -0
  36. pkgs/type_spec/value_spec/__main__.py +2 -2
  37. pkgs/type_spec/value_spec/emit_python.py +6 -1
  38. uncountable/core/client.py +10 -3
  39. uncountable/integration/cli.py +175 -23
  40. uncountable/integration/executors/executors.py +1 -2
  41. uncountable/integration/executors/generic_upload_executor.py +1 -1
  42. uncountable/integration/http_server/types.py +3 -1
  43. uncountable/integration/job.py +35 -3
  44. uncountable/integration/queue_runner/command_server/__init__.py +4 -0
  45. uncountable/integration/queue_runner/command_server/command_client.py +89 -0
  46. uncountable/integration/queue_runner/command_server/command_server.py +117 -5
  47. uncountable/integration/queue_runner/command_server/constants.py +4 -0
  48. uncountable/integration/queue_runner/command_server/protocol/command_server.proto +51 -0
  49. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +34 -11
  50. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +102 -1
  51. uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +180 -0
  52. uncountable/integration/queue_runner/command_server/types.py +44 -1
  53. uncountable/integration/queue_runner/datastore/datastore_sqlite.py +189 -8
  54. uncountable/integration/queue_runner/datastore/interface.py +13 -0
  55. uncountable/integration/queue_runner/datastore/model.py +8 -1
  56. uncountable/integration/queue_runner/job_scheduler.py +85 -21
  57. uncountable/integration/queue_runner/queue_runner.py +10 -2
  58. uncountable/integration/queue_runner/types.py +2 -0
  59. uncountable/integration/queue_runner/worker.py +28 -29
  60. uncountable/integration/scheduler.py +121 -23
  61. uncountable/integration/server.py +36 -6
  62. uncountable/integration/telemetry.py +129 -8
  63. uncountable/integration/webhook_server/entrypoint.py +2 -0
  64. uncountable/types/__init__.py +38 -0
  65. uncountable/types/api/entity/create_or_update_entity.py +1 -0
  66. uncountable/types/api/entity/export_entities.py +13 -0
  67. uncountable/types/api/entity/list_aggregate.py +79 -0
  68. uncountable/types/api/entity/list_entities.py +25 -0
  69. uncountable/types/api/entity/set_barcode.py +43 -0
  70. uncountable/types/api/entity/transition_entity_phase.py +2 -1
  71. uncountable/types/api/files/download_file.py +15 -1
  72. uncountable/types/api/integrations/__init__.py +1 -0
  73. uncountable/types/api/integrations/publish_realtime_data.py +41 -0
  74. uncountable/types/api/integrations/push_notification.py +49 -0
  75. uncountable/types/api/integrations/register_sockets_token.py +41 -0
  76. uncountable/types/api/listing/__init__.py +1 -0
  77. uncountable/types/api/listing/fetch_listing.py +57 -0
  78. uncountable/types/api/notebooks/__init__.py +1 -0
  79. uncountable/types/api/notebooks/add_notebook_content.py +119 -0
  80. uncountable/types/api/outputs/get_output_organization.py +173 -0
  81. uncountable/types/api/recipes/edit_recipe_inputs.py +1 -1
  82. uncountable/types/api/recipes/get_recipe_output_metadata.py +2 -2
  83. uncountable/types/api/recipes/get_recipes_data.py +29 -0
  84. uncountable/types/api/recipes/lock_recipes.py +2 -1
  85. uncountable/types/api/recipes/set_recipe_total.py +59 -0
  86. uncountable/types/api/recipes/unlock_recipes.py +2 -1
  87. uncountable/types/api/runsheet/export_default_runsheet.py +44 -0
  88. uncountable/types/api/uploader/complete_async_parse.py +46 -0
  89. uncountable/types/api/user/__init__.py +1 -0
  90. uncountable/types/api/user/get_current_user_info.py +40 -0
  91. uncountable/types/async_batch_processor.py +266 -0
  92. uncountable/types/async_batch_t.py +5 -0
  93. uncountable/types/client_base.py +432 -2
  94. uncountable/types/client_config.py +1 -0
  95. uncountable/types/client_config_t.py +10 -0
  96. uncountable/types/entity_t.py +9 -1
  97. uncountable/types/exports_t.py +1 -0
  98. uncountable/types/integration_server_t.py +2 -0
  99. uncountable/types/integration_session.py +10 -0
  100. uncountable/types/integration_session_t.py +60 -0
  101. uncountable/types/integrations.py +10 -0
  102. uncountable/types/integrations_t.py +62 -0
  103. uncountable/types/listing.py +46 -0
  104. uncountable/types/listing_t.py +533 -0
  105. uncountable/types/notices.py +8 -0
  106. uncountable/types/notices_t.py +37 -0
  107. uncountable/types/notifications.py +11 -0
  108. uncountable/types/notifications_t.py +74 -0
  109. uncountable/types/queued_job.py +2 -0
  110. uncountable/types/queued_job_t.py +20 -2
  111. uncountable/types/sockets.py +20 -0
  112. uncountable/types/sockets_t.py +169 -0
  113. uncountable/types/uploader.py +24 -0
  114. uncountable/types/uploader_t.py +222 -0
  115. {uncountablepythonsdk-0.0.115.dist-info → uncountablepythonsdk-0.0.142.dev0.dist-info}/METADATA +5 -2
  116. {uncountablepythonsdk-0.0.115.dist-info → uncountablepythonsdk-0.0.142.dev0.dist-info}/RECORD +118 -79
  117. docs/quickstart.md +0 -19
  118. {uncountablepythonsdk-0.0.115.dist-info → uncountablepythonsdk-0.0.142.dev0.dist-info}/WHEEL +0 -0
  119. {uncountablepythonsdk-0.0.115.dist-info → uncountablepythonsdk-0.0.142.dev0.dist-info}/top_level.txt +0 -0
@@ -20,7 +20,9 @@ __all__: list[str] = [
20
20
  "InvocationContextManual",
21
21
  "InvocationContextType",
22
22
  "InvocationContextWebhook",
23
+ "JobStatus",
23
24
  "QueuedJob",
25
+ "QueuedJobMetadata",
24
26
  "QueuedJobPayload",
25
27
  "QueuedJobResult",
26
28
  ]
@@ -110,13 +112,29 @@ class QueuedJobResult:
110
112
 
111
113
  # DO NOT MODIFY -- This file is generated by type_spec
112
114
  @serial_class(
113
- named_type_path="sdk.queued_job.QueuedJob",
115
+ named_type_path="sdk.queued_job.QueuedJobMetadata",
114
116
  )
115
117
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
116
- class QueuedJob:
118
+ class QueuedJobMetadata:
117
119
  queued_job_uuid: str
118
120
  job_ref_name: str
119
121
  num_attempts: int
120
122
  submitted_at: datetime.datetime
123
+ status: JobStatus | None = None
124
+
125
+
126
+ # DO NOT MODIFY -- This file is generated by type_spec
127
+ @serial_class(
128
+ named_type_path="sdk.queued_job.QueuedJob",
129
+ )
130
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
131
+ class QueuedJob(QueuedJobMetadata):
121
132
  payload: QueuedJobPayload
133
+
134
+
135
+ # DO NOT MODIFY -- This file is generated by type_spec
136
+ class JobStatus(StrEnum):
137
+ QUEUED = "queued"
138
+ FAILED = "failed"
139
+ SUCCESS = "success"
122
140
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,20 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .sockets_t import SocketRequestBase as SocketRequestBase
7
+ from .sockets_t import SocketRequestType as SocketRequestType
8
+ from .sockets_t import SocketRequestIntegrationSession as SocketRequestIntegrationSession
9
+ from .sockets_t import SocketTokenRequest as SocketTokenRequest
10
+ from .sockets_t import SocketTokenResponse as SocketTokenResponse
11
+ from .sockets_t import SocketEventType as SocketEventType
12
+ from .sockets_t import BaseSocketEventData as BaseSocketEventData
13
+ from .sockets_t import UsersInRoomUpdatedEventData as UsersInRoomUpdatedEventData
14
+ from .sockets_t import SocketEventData as SocketEventData
15
+ from .sockets_t import SocketResponse as SocketResponse
16
+ from .sockets_t import SocketClientMessageType as SocketClientMessageType
17
+ from .sockets_t import JoinRoomWithTokenSocketClientMessage as JoinRoomWithTokenSocketClientMessage
18
+ from .sockets_t import SendInstrumentReadingClientMessage as SendInstrumentReadingClientMessage
19
+ from .sockets_t import SocketClientMessage as SocketClientMessage
20
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,169 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from pkgs.serialization import serial_alias_annotation
14
+ from . import base_t
15
+ from . import integration_session_t
16
+
17
+ __all__: list[str] = [
18
+ "BaseSocketEventData",
19
+ "JoinRoomWithTokenSocketClientMessage",
20
+ "SendInstrumentReadingClientMessage",
21
+ "SocketClientMessage",
22
+ "SocketClientMessageType",
23
+ "SocketEventData",
24
+ "SocketEventType",
25
+ "SocketRequestBase",
26
+ "SocketRequestIntegrationSession",
27
+ "SocketRequestType",
28
+ "SocketResponse",
29
+ "SocketTokenRequest",
30
+ "SocketTokenResponse",
31
+ "UsersInRoomUpdatedEventData",
32
+ ]
33
+
34
+
35
+ # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.sockets.SocketRequestBase",
38
+ )
39
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ class SocketRequestBase:
41
+ type: SocketRequestType
42
+
43
+
44
+ # DO NOT MODIFY -- This file is generated by type_spec
45
+ class SocketRequestType(StrEnum):
46
+ INTEGRATION_SESSION = "integration_session"
47
+
48
+
49
+ # DO NOT MODIFY -- This file is generated by type_spec
50
+ @serial_class(
51
+ named_type_path="sdk.sockets.SocketRequestIntegrationSession",
52
+ parse_require={"type"},
53
+ )
54
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
55
+ class SocketRequestIntegrationSession(SocketRequestBase):
56
+ type: typing.Literal[SocketRequestType.INTEGRATION_SESSION] = SocketRequestType.INTEGRATION_SESSION
57
+ integration_session: integration_session_t.IntegrationSession
58
+
59
+
60
+ # DO NOT MODIFY -- This file is generated by type_spec
61
+ SocketTokenRequest = typing.Annotated[
62
+ typing.Union[SocketRequestIntegrationSession],
63
+ serial_union_annotation(
64
+ named_type_path="sdk.sockets.SocketTokenRequest",
65
+ discriminator="type",
66
+ discriminator_map={
67
+ "integration_session": SocketRequestIntegrationSession,
68
+ },
69
+ ),
70
+ ]
71
+
72
+
73
+ # DO NOT MODIFY -- This file is generated by type_spec
74
+ @serial_class(
75
+ named_type_path="sdk.sockets.SocketTokenResponse",
76
+ )
77
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
78
+ class SocketTokenResponse:
79
+ token: str
80
+ room_key: str
81
+
82
+
83
+ # DO NOT MODIFY -- This file is generated by type_spec
84
+ class SocketEventType(StrEnum):
85
+ USERS_IN_ROOM_UPDATED = "users_in_room_updated"
86
+
87
+
88
+ # DO NOT MODIFY -- This file is generated by type_spec
89
+ @serial_class(
90
+ named_type_path="sdk.sockets.BaseSocketEventData",
91
+ )
92
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
93
+ class BaseSocketEventData:
94
+ pass
95
+
96
+
97
+ # DO NOT MODIFY -- This file is generated by type_spec
98
+ @serial_class(
99
+ named_type_path="sdk.sockets.UsersInRoomUpdatedEventData",
100
+ parse_require={"type"},
101
+ )
102
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
103
+ class UsersInRoomUpdatedEventData(BaseSocketEventData):
104
+ type: typing.Literal[SocketEventType.USERS_IN_ROOM_UPDATED] = SocketEventType.USERS_IN_ROOM_UPDATED
105
+ user_ids: list[base_t.ObjectId]
106
+ number_of_connections: int
107
+
108
+
109
+ # DO NOT MODIFY -- This file is generated by type_spec
110
+ SocketEventData = typing.Annotated[
111
+ typing.Union[UsersInRoomUpdatedEventData],
112
+ serial_alias_annotation(
113
+ named_type_path="sdk.sockets.SocketEventData",
114
+ ),
115
+ ]
116
+
117
+
118
+ # DO NOT MODIFY -- This file is generated by type_spec
119
+ @serial_class(
120
+ named_type_path="sdk.sockets.SocketResponse",
121
+ )
122
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
123
+ class SocketResponse:
124
+ data: SocketEventData
125
+
126
+
127
+ # DO NOT MODIFY -- This file is generated by type_spec
128
+ class SocketClientMessageType(StrEnum):
129
+ JOIN_ROOM_WITH_TOKEN = "join_room_with_token"
130
+ SEND_INSTRUMENT_READING = "send_instrument_reading"
131
+
132
+
133
+ # DO NOT MODIFY -- This file is generated by type_spec
134
+ @serial_class(
135
+ named_type_path="sdk.sockets.JoinRoomWithTokenSocketClientMessage",
136
+ parse_require={"type"},
137
+ )
138
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
139
+ class JoinRoomWithTokenSocketClientMessage:
140
+ type: typing.Literal[SocketClientMessageType.JOIN_ROOM_WITH_TOKEN] = SocketClientMessageType.JOIN_ROOM_WITH_TOKEN
141
+ token: str
142
+
143
+
144
+ # DO NOT MODIFY -- This file is generated by type_spec
145
+ @serial_class(
146
+ named_type_path="sdk.sockets.SendInstrumentReadingClientMessage",
147
+ to_string_values={"value"},
148
+ parse_require={"type"},
149
+ )
150
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
151
+ class SendInstrumentReadingClientMessage:
152
+ type: typing.Literal[SocketClientMessageType.SEND_INSTRUMENT_READING] = SocketClientMessageType.SEND_INSTRUMENT_READING
153
+ room_key: str
154
+ value: Decimal
155
+
156
+
157
+ # DO NOT MODIFY -- This file is generated by type_spec
158
+ SocketClientMessage = typing.Annotated[
159
+ JoinRoomWithTokenSocketClientMessage | SendInstrumentReadingClientMessage,
160
+ serial_union_annotation(
161
+ named_type_path="sdk.sockets.SocketClientMessage",
162
+ discriminator="type",
163
+ discriminator_map={
164
+ "join_room_with_token": JoinRoomWithTokenSocketClientMessage,
165
+ "send_instrument_reading": SendInstrumentReadingClientMessage,
166
+ },
167
+ ),
168
+ ]
169
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,24 @@
1
+ # ruff: noqa: E402 Q003
2
+ # fmt: off
3
+ # isort: skip_file
4
+ # DO NOT MODIFY -- This file is generated by type_spec
5
+ # Kept only for SDK backwards compatibility
6
+ from .uploader_t import HeaderType as HeaderType
7
+ from .uploader_t import ChannelType as ChannelType
8
+ from .uploader_t import StructureElementType as StructureElementType
9
+ from .uploader_t import StructureElementBase as StructureElementBase
10
+ from .uploader_t import DecimalValue as DecimalValue
11
+ from .uploader_t import StringValue as StringValue
12
+ from .uploader_t import BaseData as BaseData
13
+ from .uploader_t import NumericHeaderData as NumericHeaderData
14
+ from .uploader_t import TextHeaderData as TextHeaderData
15
+ from .uploader_t import HeaderValue as HeaderValue
16
+ from .uploader_t import NumericChannelData as NumericChannelData
17
+ from .uploader_t import TimestampChannelData as TimestampChannelData
18
+ from .uploader_t import TextChannelData as TextChannelData
19
+ from .uploader_t import Channel as Channel
20
+ from .uploader_t import DataChannel as DataChannel
21
+ from .uploader_t import HeaderEntry as HeaderEntry
22
+ from .uploader_t import StructureElement as StructureElement
23
+ from .uploader_t import ParsedFileData as ParsedFileData
24
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,222 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # ruff: noqa: E402 Q003
3
+ # fmt: off
4
+ # isort: skip_file
5
+ from __future__ import annotations
6
+ import typing # noqa: F401
7
+ import datetime # noqa: F401
8
+ from decimal import Decimal # noqa: F401
9
+ from enum import StrEnum
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from pkgs.serialization import serial_union_annotation
13
+ from . import base_t
14
+
15
+ __all__: list[str] = [
16
+ "BaseData",
17
+ "Channel",
18
+ "ChannelType",
19
+ "DataChannel",
20
+ "DecimalValue",
21
+ "HeaderEntry",
22
+ "HeaderType",
23
+ "HeaderValue",
24
+ "NumericChannelData",
25
+ "NumericHeaderData",
26
+ "ParsedFileData",
27
+ "StringValue",
28
+ "StructureElement",
29
+ "StructureElementBase",
30
+ "StructureElementType",
31
+ "TextChannelData",
32
+ "TextHeaderData",
33
+ "TimestampChannelData",
34
+ ]
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ class HeaderType(StrEnum):
39
+ NUMERIC_HEADER = "numeric_header"
40
+ TEXT_HEADER = "text_header"
41
+
42
+
43
+ # DO NOT MODIFY -- This file is generated by type_spec
44
+ class ChannelType(StrEnum):
45
+ NUMERIC_CHANNEL = "numeric_channel"
46
+ TIMESTAMP_CHANNEL = "timestamp_channel"
47
+ TEXT_CHANNEL = "text_channel"
48
+
49
+
50
+ # DO NOT MODIFY -- This file is generated by type_spec
51
+ class StructureElementType(StrEnum):
52
+ CHANNEL = "channel"
53
+ HEADER = "header"
54
+
55
+
56
+ # DO NOT MODIFY -- This file is generated by type_spec
57
+ @serial_class(
58
+ named_type_path="sdk.uploader.StructureElementBase",
59
+ )
60
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
61
+ class StructureElementBase:
62
+ type: StructureElementType
63
+
64
+
65
+ # DO NOT MODIFY -- This file is generated by type_spec
66
+ @serial_class(
67
+ named_type_path="sdk.uploader.DecimalValue",
68
+ to_string_values={"value"},
69
+ )
70
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
71
+ class DecimalValue:
72
+ value: Decimal
73
+
74
+
75
+ # DO NOT MODIFY -- This file is generated by type_spec
76
+ @serial_class(
77
+ named_type_path="sdk.uploader.StringValue",
78
+ )
79
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
80
+ class StringValue:
81
+ value: str
82
+
83
+
84
+ # DO NOT MODIFY -- This file is generated by type_spec
85
+ @serial_class(
86
+ named_type_path="sdk.uploader.BaseData",
87
+ )
88
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
89
+ class BaseData:
90
+ name: str
91
+ type: str
92
+
93
+
94
+ # DO NOT MODIFY -- This file is generated by type_spec
95
+ @serial_class(
96
+ named_type_path="sdk.uploader.NumericHeaderData",
97
+ parse_require={"type"},
98
+ )
99
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
100
+ class NumericHeaderData(BaseData):
101
+ type: typing.Literal[HeaderType.NUMERIC_HEADER] = HeaderType.NUMERIC_HEADER
102
+ data: DecimalValue | None
103
+
104
+
105
+ # DO NOT MODIFY -- This file is generated by type_spec
106
+ @serial_class(
107
+ named_type_path="sdk.uploader.TextHeaderData",
108
+ parse_require={"type"},
109
+ )
110
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
111
+ class TextHeaderData(BaseData):
112
+ type: typing.Literal[HeaderType.TEXT_HEADER] = HeaderType.TEXT_HEADER
113
+ data: StringValue | None
114
+
115
+
116
+ # DO NOT MODIFY -- This file is generated by type_spec
117
+ HeaderValue = typing.Annotated[
118
+ NumericHeaderData | TextHeaderData,
119
+ serial_union_annotation(
120
+ named_type_path="sdk.uploader.HeaderValue",
121
+ discriminator="type",
122
+ discriminator_map={
123
+ "numeric_header": NumericHeaderData,
124
+ "text_header": TextHeaderData,
125
+ },
126
+ ),
127
+ ]
128
+
129
+
130
+ # DO NOT MODIFY -- This file is generated by type_spec
131
+ @serial_class(
132
+ named_type_path="sdk.uploader.NumericChannelData",
133
+ parse_require={"type"},
134
+ )
135
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
136
+ class NumericChannelData(BaseData):
137
+ type: typing.Literal[ChannelType.NUMERIC_CHANNEL] = ChannelType.NUMERIC_CHANNEL
138
+ data: list[DecimalValue]
139
+
140
+
141
+ # DO NOT MODIFY -- This file is generated by type_spec
142
+ @serial_class(
143
+ named_type_path="sdk.uploader.TimestampChannelData",
144
+ parse_require={"type"},
145
+ )
146
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
147
+ class TimestampChannelData(BaseData):
148
+ type: typing.Literal[ChannelType.TIMESTAMP_CHANNEL] = ChannelType.TIMESTAMP_CHANNEL
149
+ data: list[DecimalValue]
150
+
151
+
152
+ # DO NOT MODIFY -- This file is generated by type_spec
153
+ @serial_class(
154
+ named_type_path="sdk.uploader.TextChannelData",
155
+ parse_require={"type"},
156
+ )
157
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
158
+ class TextChannelData(BaseData):
159
+ type: typing.Literal[ChannelType.TEXT_CHANNEL] = ChannelType.TEXT_CHANNEL
160
+ data: list[StringValue]
161
+
162
+
163
+ # DO NOT MODIFY -- This file is generated by type_spec
164
+ Channel = typing.Annotated[
165
+ TextChannelData | TimestampChannelData | NumericChannelData,
166
+ serial_union_annotation(
167
+ named_type_path="sdk.uploader.Channel",
168
+ discriminator="type",
169
+ discriminator_map={
170
+ "text_channel": TextChannelData,
171
+ "timestamp_channel": TimestampChannelData,
172
+ "numeric_channel": NumericChannelData,
173
+ },
174
+ ),
175
+ ]
176
+
177
+
178
+ # DO NOT MODIFY -- This file is generated by type_spec
179
+ @serial_class(
180
+ named_type_path="sdk.uploader.DataChannel",
181
+ parse_require={"type"},
182
+ )
183
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
184
+ class DataChannel(StructureElementBase):
185
+ type: typing.Literal[StructureElementType.CHANNEL] = StructureElementType.CHANNEL
186
+ channel: Channel
187
+
188
+
189
+ # DO NOT MODIFY -- This file is generated by type_spec
190
+ @serial_class(
191
+ named_type_path="sdk.uploader.HeaderEntry",
192
+ parse_require={"type"},
193
+ )
194
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
195
+ class HeaderEntry(StructureElementBase):
196
+ type: typing.Literal[StructureElementType.HEADER] = StructureElementType.HEADER
197
+ value: HeaderValue
198
+
199
+
200
+ # DO NOT MODIFY -- This file is generated by type_spec
201
+ StructureElement = typing.Annotated[
202
+ DataChannel | HeaderEntry,
203
+ serial_union_annotation(
204
+ named_type_path="sdk.uploader.StructureElement",
205
+ discriminator="type",
206
+ discriminator_map={
207
+ "channel": DataChannel,
208
+ "header": HeaderEntry,
209
+ },
210
+ ),
211
+ ]
212
+
213
+
214
+ # DO NOT MODIFY -- This file is generated by type_spec
215
+ @serial_class(
216
+ named_type_path="sdk.uploader.ParsedFileData",
217
+ )
218
+ @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
219
+ class ParsedFileData:
220
+ file_name: str
221
+ file_structures: list[StructureElement]
222
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.115
3
+ Version: 0.0.142.dev0
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
@@ -40,12 +40,15 @@ Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
41
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Requires-Dist: msgspec==0.19.*
43
+ Requires-Dist: tabulate==0.9.0
44
+ Requires-Dist: types-psutil~=5.9.5
45
+ Requires-Dist: psutil>=5.9.0
43
46
  Provides-Extra: test
44
47
  Requires-Dist: mypy==1.*; extra == "test"
45
48
  Requires-Dist: ruff==0.*; extra == "test"
46
49
  Requires-Dist: pytest==8.*; extra == "test"
47
50
  Requires-Dist: coverage[toml]==7.*; extra == "test"
48
- Requires-Dist: pytest-cov==6.*; extra == "test"
51
+ Requires-Dist: pytest-cov==7.*; extra == "test"
49
52
  Requires-Dist: pytest-xdist==3.*; extra == "test"
50
53
 
51
54
  # Uncountable Python SDK