rapidata 1.10.0__py3-none-any.whl → 2.0.0__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 rapidata might be problematic. Click here for more details.

Files changed (138) hide show
  1. rapidata/__init__.py +21 -17
  2. rapidata/api_client/__init__.py +15 -5
  3. rapidata/api_client/api/coco_api.py +14 -29
  4. rapidata/api_client/api/dataset_api.py +6 -6
  5. rapidata/api_client/api/identity_api.py +3 -3
  6. rapidata/api_client/api/pipeline_api.py +1008 -95
  7. rapidata/api_client/api/rapid_api.py +6 -6
  8. rapidata/api_client/api/validation_api.py +12 -42
  9. rapidata/api_client/models/__init__.py +15 -5
  10. rapidata/api_client/models/add_campaign_model.py +1 -3
  11. rapidata/api_client/models/add_validation_text_rapid_model.py +1 -1
  12. rapidata/api_client/models/age_group.py +5 -4
  13. rapidata/api_client/models/base_error.py +1 -4
  14. rapidata/api_client/models/compare_workflow_config.py +9 -24
  15. rapidata/api_client/models/compare_workflow_config_model.py +9 -29
  16. rapidata/api_client/models/compare_workflow_config_model_pair_maker_config.py +140 -0
  17. rapidata/api_client/models/compare_workflow_config_pair_maker_config.py +140 -0
  18. rapidata/api_client/models/compare_workflow_model.py +7 -3
  19. rapidata/api_client/models/compare_workflow_model1.py +7 -3
  20. rapidata/api_client/models/compare_workflow_model1_pair_maker_information.py +140 -0
  21. rapidata/api_client/models/compare_workflow_model_pair_maker_config.py +140 -0
  22. rapidata/api_client/models/file_asset_model_metadata_inner.py +8 -22
  23. rapidata/api_client/models/get_classify_workflow_result_overview_result.py +144 -0
  24. rapidata/api_client/models/get_pipeline_by_id_result.py +13 -3
  25. rapidata/api_client/models/identity_read_bridge_token_get202_response.py +140 -0
  26. rapidata/api_client/models/not_available_yet_result.py +96 -0
  27. rapidata/api_client/models/online_pair_maker_config.py +98 -0
  28. rapidata/api_client/models/online_pair_maker_config_model.py +98 -0
  29. rapidata/api_client/models/online_pair_maker_information.py +100 -0
  30. rapidata/api_client/models/pipeline_id_workflow_put_request.py +140 -0
  31. rapidata/api_client/models/pre_arranged_pair_maker_config.py +100 -0
  32. rapidata/api_client/models/pre_arranged_pair_maker_config_model.py +96 -0
  33. rapidata/api_client/models/pre_arranged_pair_maker_information.py +102 -0
  34. rapidata/api_client/models/read_bridge_token_keys_result.py +11 -2
  35. rapidata/api_client/models/simple_workflow_config.py +7 -26
  36. rapidata/api_client/models/simple_workflow_config_model.py +4 -28
  37. rapidata/api_client/models/simple_workflow_get_result_overview_get200_response.py +16 -16
  38. rapidata/api_client/models/simple_workflow_model1.py +3 -3
  39. rapidata/api_client/models/update_campaign_model.py +99 -0
  40. rapidata/api_client/models/validation_import_post_request_blueprint.py +1 -1
  41. rapidata/api_client_README.md +20 -7
  42. rapidata/rapidata_client/__init__.py +18 -9
  43. rapidata/rapidata_client/assets/__init__.py +5 -4
  44. rapidata/rapidata_client/assets/{media_asset.py → _media_asset.py} +32 -11
  45. rapidata/rapidata_client/assets/{multi_asset.py → _multi_asset.py} +1 -1
  46. rapidata/rapidata_client/assets/{text_asset.py → _text_asset.py} +1 -1
  47. rapidata/rapidata_client/assets/data_type_enum.py +7 -0
  48. rapidata/rapidata_client/filter/__init__.py +1 -1
  49. rapidata/rapidata_client/filter/_base_filter.py +10 -0
  50. rapidata/rapidata_client/filter/age_filter.py +12 -5
  51. rapidata/rapidata_client/filter/campaign_filter.py +12 -3
  52. rapidata/rapidata_client/filter/country_filter.py +10 -3
  53. rapidata/rapidata_client/filter/gender_filter.py +12 -5
  54. rapidata/rapidata_client/filter/language_filter.py +14 -3
  55. rapidata/rapidata_client/filter/models/age_group.py +26 -0
  56. rapidata/rapidata_client/filter/models/gender.py +19 -0
  57. rapidata/rapidata_client/filter/rapidata_filters.py +31 -0
  58. rapidata/rapidata_client/filter/user_score_filter.py +20 -4
  59. rapidata/rapidata_client/metadata/__init__.py +5 -5
  60. rapidata/rapidata_client/metadata/{base_metadata.py → _base_metadata.py} +2 -1
  61. rapidata/rapidata_client/metadata/{private_text_metadata.py → _private_text_metadata.py} +2 -2
  62. rapidata/rapidata_client/metadata/{prompt_metadata.py → _prompt_metadata.py} +3 -2
  63. rapidata/rapidata_client/metadata/{public_text_metadata.py → _public_text_metadata.py} +2 -2
  64. rapidata/rapidata_client/metadata/{select_words_metadata.py → _select_words_metadata.py} +3 -2
  65. rapidata/rapidata_client/{dataset/rapidata_dataset.py → order/_rapidata_dataset.py} +7 -8
  66. rapidata/rapidata_client/order/_rapidata_order_builder.py +365 -0
  67. rapidata/rapidata_client/order/rapidata_order.py +49 -31
  68. rapidata/rapidata_client/order/rapidata_order_manager.py +461 -0
  69. rapidata/rapidata_client/rapidata_client.py +12 -201
  70. rapidata/rapidata_client/referee/__init__.py +3 -3
  71. rapidata/rapidata_client/referee/{base_referee.py → _base_referee.py} +3 -3
  72. rapidata/rapidata_client/referee/{early_stopping_referee.py → _early_stopping_referee.py} +14 -11
  73. rapidata/rapidata_client/referee/{naive_referee.py → _naive_referee.py} +9 -9
  74. rapidata/rapidata_client/selection/__init__.py +1 -1
  75. rapidata/rapidata_client/{filter/base_filter.py → selection/_base_selection.py} +2 -2
  76. rapidata/rapidata_client/selection/capped_selection.py +15 -5
  77. rapidata/rapidata_client/selection/conditional_validation_selection.py +17 -4
  78. rapidata/rapidata_client/selection/demographic_selection.py +18 -7
  79. rapidata/rapidata_client/selection/labeling_selection.py +10 -3
  80. rapidata/rapidata_client/selection/rapidata_selections.py +21 -0
  81. rapidata/rapidata_client/selection/validation_selection.py +11 -4
  82. rapidata/rapidata_client/settings/__init__.py +9 -2
  83. rapidata/rapidata_client/settings/_rapidata_setting.py +11 -0
  84. rapidata/rapidata_client/settings/alert_on_fast_response.py +21 -0
  85. rapidata/rapidata_client/settings/custom_setting.py +16 -0
  86. rapidata/rapidata_client/settings/free_text_minimum_characters.py +16 -0
  87. rapidata/rapidata_client/settings/models/__init__.py +1 -0
  88. rapidata/rapidata_client/settings/models/translation_behaviour_options.py +14 -0
  89. rapidata/rapidata_client/settings/no_shuffle.py +16 -0
  90. rapidata/rapidata_client/settings/play_video_until_the_end.py +16 -0
  91. rapidata/rapidata_client/settings/rapidata_settings.py +31 -0
  92. rapidata/rapidata_client/settings/translation_behaviour.py +18 -0
  93. rapidata/rapidata_client/validation/__init__.py +1 -0
  94. rapidata/rapidata_client/{dataset/validation_rapid_parts.py → validation/_validation_rapid_parts.py} +7 -6
  95. rapidata/rapidata_client/validation/_validation_set_builder.py +371 -0
  96. rapidata/rapidata_client/{dataset → validation}/rapidata_validation_set.py +54 -50
  97. rapidata/rapidata_client/validation/rapids/__init__.py +1 -0
  98. rapidata/rapidata_client/validation/rapids/box.py +17 -0
  99. rapidata/rapidata_client/validation/rapids/rapids.py +94 -0
  100. rapidata/rapidata_client/validation/rapids/rapids_manager.py +163 -0
  101. rapidata/rapidata_client/validation/validation_set_manager.py +335 -0
  102. rapidata/rapidata_client/workflow/__init__.py +8 -6
  103. rapidata/rapidata_client/workflow/_base_workflow.py +25 -0
  104. rapidata/rapidata_client/workflow/{classify_workflow.py → _classify_workflow.py} +6 -6
  105. rapidata/rapidata_client/workflow/{compare_workflow.py → _compare_workflow.py} +10 -16
  106. rapidata/rapidata_client/workflow/_draw_workflow.py +22 -0
  107. rapidata/rapidata_client/workflow/_evaluation_workflow.py +26 -0
  108. rapidata/rapidata_client/workflow/{free_text_workflow.py → _free_text_workflow.py} +10 -16
  109. rapidata/rapidata_client/workflow/_locate_workflow.py +22 -0
  110. rapidata/rapidata_client/workflow/{select_words_workflow.py → _select_words_workflow.py} +2 -8
  111. rapidata/service/credential_manager.py +11 -1
  112. rapidata/service/openapi_service.py +23 -4
  113. {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/METADATA +2 -1
  114. {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/RECORD +118 -94
  115. rapidata/constants.py +0 -1
  116. rapidata/rapidata_client/dataset/rapid_builders/__init__.py +0 -4
  117. rapidata/rapidata_client/dataset/rapid_builders/base_rapid_builder.py +0 -33
  118. rapidata/rapidata_client/dataset/rapid_builders/classify_rapid_builders.py +0 -166
  119. rapidata/rapidata_client/dataset/rapid_builders/compare_rapid_builders.py +0 -145
  120. rapidata/rapidata_client/dataset/rapid_builders/rapids.py +0 -33
  121. rapidata/rapidata_client/dataset/rapid_builders/select_words_rapid_builders.py +0 -124
  122. rapidata/rapidata_client/dataset/validation_set_builder.py +0 -336
  123. rapidata/rapidata_client/order/order_builder.py +0 -25
  124. rapidata/rapidata_client/order/rapidata_order_builder.py +0 -463
  125. rapidata/rapidata_client/selection/base_selection.py +0 -9
  126. rapidata/rapidata_client/settings/feature_flags.py +0 -125
  127. rapidata/rapidata_client/settings/settings.py +0 -124
  128. rapidata/rapidata_client/simple_builders/__init__.py +0 -0
  129. rapidata/rapidata_client/simple_builders/simple_classification_builders.py +0 -271
  130. rapidata/rapidata_client/simple_builders/simple_compare_builders.py +0 -267
  131. rapidata/rapidata_client/simple_builders/simple_free_text_builders.py +0 -192
  132. rapidata/rapidata_client/simple_builders/simple_select_words_builders.py +0 -196
  133. rapidata/rapidata_client/workflow/base_workflow.py +0 -42
  134. rapidata/rapidata_client/workflow/evaluation_workflow.py +0 -15
  135. /rapidata/rapidata_client/assets/{base_asset.py → _base_asset.py} +0 -0
  136. /rapidata/rapidata_client/{dataset → filter/models}/__init__.py +0 -0
  137. {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/LICENSE +0 -0
  138. {rapidata-1.10.0.dist-info → rapidata-2.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,365 @@
1
+ from rapidata.api_client.models.capped_selection_selections_inner import (
2
+ CappedSelectionSelectionsInner,
3
+ )
4
+ from rapidata.api_client.models.create_order_model import CreateOrderModel
5
+ from rapidata.api_client.models.create_order_model_referee import (
6
+ CreateOrderModelReferee,
7
+ )
8
+ from rapidata.api_client.models.create_order_model_user_filters_inner import (
9
+ CreateOrderModelUserFiltersInner,
10
+ )
11
+ from rapidata.api_client.models.create_order_model_workflow import (
12
+ CreateOrderModelWorkflow,
13
+ )
14
+
15
+ from rapidata.rapidata_client.settings import RapidataSetting
16
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
17
+ from rapidata.rapidata_client.order._rapidata_dataset import RapidataDataset
18
+ from rapidata.rapidata_client.referee._naive_referee import NaiveReferee
19
+ from rapidata.rapidata_client.selection._base_selection import RapidataSelection
20
+ from rapidata.rapidata_client.filter import RapidataFilter
21
+ from rapidata.rapidata_client.workflow import Workflow
22
+ from rapidata.rapidata_client.order.rapidata_order import RapidataOrder
23
+ from rapidata.rapidata_client.referee import Referee
24
+ from rapidata.service.openapi_service import OpenAPIService
25
+
26
+ from rapidata.rapidata_client.workflow._compare_workflow import CompareWorkflow
27
+
28
+ from rapidata.rapidata_client.assets import MediaAsset, TextAsset, MultiAsset, BaseAsset
29
+
30
+ from typing import Optional, cast, Sequence
31
+
32
+
33
+ class RapidataOrderBuilder:
34
+ """Builder object for creating Rapidata orders.
35
+
36
+ Use the fluent interface to set the desired configuration. Add a workflow to the order using `.workflow()` and finally call `.create()` to create the order.
37
+
38
+ Args:
39
+ openapi_service (OpenAPIService): The OpenAPIService instance.
40
+ name (str): The name of the order.
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ name: str,
46
+ openapi_service: OpenAPIService,
47
+ ):
48
+ self._name = name
49
+ self.order_id: str | None = None
50
+ self.__openapi_service = openapi_service
51
+ self.__dataset: Optional[RapidataDataset]
52
+ self.__workflow: Workflow | None = None
53
+ self.__referee: Referee | None = None
54
+ self.__metadata: Sequence[Metadata] | None = None
55
+ self.__validation_set_id: str | None = None
56
+ self.__settings: Sequence[RapidataSetting] | None = None
57
+ self.__user_filters: list[RapidataFilter] = []
58
+ self.__selections: list[RapidataSelection] = []
59
+ self.__priority: int = 50
60
+ self.__assets: Sequence[BaseAsset] = []
61
+
62
+ def _to_model(self) -> CreateOrderModel:
63
+ """
64
+ Convert the builder configuration to a CreateOrderModel.
65
+
66
+ Raises:
67
+ ValueError: If no workflow is provided.
68
+
69
+ Returns:
70
+ CreateOrderModel: The model representing the order configuration.
71
+ """
72
+ if self.__workflow is None:
73
+ raise ValueError("You must provide a workflow to create an order.")
74
+
75
+ if self.__referee is None:
76
+ print("No referee provided, using default NaiveReferee.")
77
+ self.__referee = NaiveReferee()
78
+
79
+ return CreateOrderModel(
80
+ _t="CreateOrderModel",
81
+ orderName=self._name,
82
+ workflow=CreateOrderModelWorkflow(self.__workflow._to_model()),
83
+ userFilters=[
84
+ CreateOrderModelUserFiltersInner(user_filter._to_model())
85
+ for user_filter in self.__user_filters
86
+ ],
87
+ referee=CreateOrderModelReferee(self.__referee._to_model()),
88
+ validationSetId=self.__validation_set_id,
89
+ featureFlags=(
90
+ [setting._to_feature_flag() for setting in self.__settings]
91
+ if self.__settings is not None
92
+ else None
93
+ ),
94
+ selections=[
95
+ CappedSelectionSelectionsInner(selection._to_model())
96
+ for selection in self.__selections
97
+ ],
98
+ priority=self.__priority,
99
+ )
100
+
101
+ def _create(self, max_upload_workers: int = 10) -> RapidataOrder:
102
+ """
103
+ Create the Rapidata order by making the necessary API calls based on the builder's configuration.
104
+
105
+ Args:
106
+ max_upload_workers (int, optional): The maximum number of worker threads for processing media paths. Defaults to 10.
107
+
108
+ Raises:
109
+ ValueError: If both media paths and texts are provided, or if neither is provided.
110
+ AssertionError: If the workflow is a CompareWorkflow and media paths are not in pairs.
111
+
112
+ Returns:
113
+ RapidataOrder: The created RapidataOrder instance.
114
+ """
115
+ order_model = self._to_model()
116
+ if isinstance(
117
+ self.__workflow, CompareWorkflow
118
+ ): # Temporary fix; will be handled by backend in the future
119
+ assert all(
120
+ isinstance(item, MultiAsset) for item in self.__assets
121
+ ), "The media paths must be of type MultiAsset for comparison tasks."
122
+
123
+ result = self.__openapi_service.order_api.order_create_post(
124
+ create_order_model=order_model
125
+ )
126
+
127
+ self.order_id = result.order_id
128
+
129
+ self.__dataset = (
130
+ RapidataDataset(result.dataset_id, self.__openapi_service)
131
+ if result.dataset_id
132
+ else None
133
+ )
134
+
135
+ order = RapidataOrder(
136
+ order_id=self.order_id,
137
+ dataset=self.__dataset,
138
+ openapi_service=self.__openapi_service,
139
+ name=self._name,
140
+ )
141
+
142
+ if all(isinstance(item, MediaAsset) for item in self.__assets) and order.dataset:
143
+ assets = cast(list[MediaAsset], self.__assets)
144
+ order.dataset._add_media_from_paths(assets, self.__metadata, max_upload_workers)
145
+
146
+ elif (
147
+ all(isinstance(item, TextAsset) for item in self.__assets) and order.dataset
148
+ ):
149
+ assets = cast(list[TextAsset], self.__assets)
150
+ order.dataset._add_texts(assets)
151
+
152
+ elif (
153
+ all(isinstance(item, MultiAsset) for item in self.__assets) and order.dataset
154
+ ):
155
+ multi_assets = cast(list[MultiAsset], self.__assets)
156
+
157
+ # Check if all MultiAssets contain the same type of assets
158
+ first_asset_type = type(multi_assets[0].assets[0])
159
+ if not all(
160
+ isinstance(asset, first_asset_type)
161
+ for multi_asset in multi_assets
162
+ for asset in multi_asset.assets
163
+ ):
164
+ raise ValueError(
165
+ "All MultiAssets must contain the same type of assets (either all MediaAssets or all TextAssets)."
166
+ )
167
+
168
+ # Process based on the asset type
169
+ if issubclass(first_asset_type, MediaAsset):
170
+ order.dataset._add_media_from_paths(
171
+ multi_assets, self.__metadata, max_upload_workers
172
+ )
173
+
174
+ elif issubclass(first_asset_type, TextAsset):
175
+ order.dataset._add_texts(multi_assets)
176
+
177
+ else:
178
+ raise ValueError(
179
+ "MultiAsset must contain MediaAssets or TextAssets objects."
180
+ )
181
+
182
+ elif order.dataset:
183
+ raise ValueError(
184
+ "Media paths must all be of the same type: MediaAsset, TextAsset, or MultiAsset."
185
+ )
186
+
187
+ return order
188
+
189
+ def _workflow(self, workflow: Workflow) -> "RapidataOrderBuilder":
190
+ """
191
+ Set the workflow for the order.
192
+
193
+ Args:
194
+ workflow (Workflow): The workflow to be set.
195
+
196
+ Returns:
197
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
198
+ """
199
+ if not isinstance(workflow, Workflow):
200
+ raise TypeError("Workflow must be of type Workflow.")
201
+
202
+ self.__workflow = workflow
203
+ return self
204
+
205
+ def _referee(self, referee: Referee) -> "RapidataOrderBuilder":
206
+ """
207
+ Set the referee for the order.
208
+
209
+ Args:
210
+ referee (Referee): The referee to be set.
211
+
212
+ Returns:
213
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
214
+ """
215
+ if not isinstance(referee, Referee):
216
+ raise TypeError("Referee must be of type Referee.")
217
+
218
+ self.__referee = referee
219
+ return self
220
+
221
+ def _media(
222
+ self,
223
+ asset: Sequence[BaseAsset],
224
+ metadata: Sequence[Metadata] | None = None,
225
+ ) -> "RapidataOrderBuilder":
226
+ """
227
+ Set the media assets for the order.
228
+
229
+ Args:
230
+ asset: (list[MediaAsset] | list[TextAsset] | list[MultiAsset]): The paths of the media assets to be set.
231
+ metadata: (list[Metadata] | None, optional): Metadata for the media assets. Defaults to None.
232
+
233
+ Returns:
234
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
235
+ """
236
+ if not isinstance(asset, list):
237
+ raise TypeError("Media paths must be provided as a list of paths.")
238
+
239
+ # for a in asset:
240
+ # if not isinstance(a, (MediaAsset, TextAsset, MultiAsset)):
241
+ # raise TypeError(
242
+ # "Media paths must be of type MediaAsset, TextAsset, or MultiAsset."
243
+ # )
244
+
245
+ if metadata:
246
+ for data in metadata:
247
+ if not isinstance(data, Metadata):
248
+ raise TypeError("Metadata must be of type Metadata.")
249
+
250
+ self.__assets = asset
251
+ self.__metadata = metadata
252
+ return self
253
+
254
+ def _settings(self, settings: Sequence[RapidataSetting]) -> "RapidataOrderBuilder":
255
+ """
256
+ Set the settings for the order.
257
+
258
+ Args:
259
+ settings (Settings): The settings to be set.
260
+
261
+ Returns:
262
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
263
+ """
264
+
265
+ if not isinstance(settings, list):
266
+ raise TypeError("Settings must be provided as a list of Setting objects.")
267
+
268
+ for s in settings:
269
+ if not isinstance(s, RapidataSetting):
270
+ raise TypeError("The settings list must only contain Setting objects.")
271
+
272
+ self.__settings = settings
273
+ return self
274
+
275
+ def _filters(self, filters: Sequence[RapidataFilter]) -> "RapidataOrderBuilder":
276
+ """
277
+ Set the filters for the order, e.g., country, language, userscore, etc.
278
+
279
+ Args:
280
+ filters (Sequence[Filters]): The user filters to be set.
281
+
282
+ Returns:
283
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
284
+ """
285
+ if not isinstance(filters, list):
286
+ raise TypeError("Filters must be provided as a list of Filter objects.")
287
+
288
+ for f in filters:
289
+ if not isinstance(f, RapidataFilter):
290
+ raise TypeError("Filters must be of type Filter.")
291
+
292
+ if len(self.__user_filters) > 0:
293
+ print("Overwriting existing user filters.")
294
+
295
+ self.__user_filters = filters
296
+ return self
297
+
298
+ def _validation_set_id(self, validation_set_id: str) -> "RapidataOrderBuilder":
299
+ """
300
+ Set the validation set ID for the order.
301
+
302
+ Args:
303
+ validation_set_id (str): The validation set ID to be set.
304
+
305
+ Returns:
306
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
307
+ """
308
+ if not isinstance(validation_set_id, str):
309
+ raise TypeError("Validation set ID must be of type str.")
310
+
311
+ self.__validation_set_id = validation_set_id
312
+ return self
313
+
314
+ def _rapids_per_bag(self, amount: int) -> "RapidataOrderBuilder":
315
+ """
316
+ Define the number of tasks a user sees in a single session.
317
+
318
+ Args:
319
+ amount (int): The number of tasks a user sees in a single session.
320
+
321
+ Returns:
322
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
323
+
324
+ Raises:
325
+ NotImplementedError: This method is not implemented yet.
326
+ """
327
+ raise NotImplementedError("Not implemented yet.")
328
+
329
+ def _selections(self, selections: Sequence[RapidataSelection]) -> "RapidataOrderBuilder":
330
+ """
331
+ Set the selections for the order.
332
+
333
+ Args:
334
+ selections (Sequence[Selection]): The selections to be set.
335
+
336
+ Returns:
337
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
338
+ """
339
+ if not isinstance(selections, list):
340
+ raise TypeError(
341
+ "Selections must be provided as a list of Selection objects."
342
+ )
343
+
344
+ for selection in selections:
345
+ if not isinstance(selection, RapidataSelection):
346
+ raise TypeError("Selections must be of type Selection.")
347
+
348
+ self.__selections = selections # type: ignore
349
+ return self
350
+
351
+ def _priority(self, priority: int) -> "RapidataOrderBuilder":
352
+ """
353
+ Set the priority for the order.
354
+
355
+ Args:
356
+ priority (int): The priority to be set.
357
+
358
+ Returns:
359
+ RapidataOrderBuilder: The updated RapidataOrderBuilder instance.
360
+ """
361
+ if not isinstance(priority, int):
362
+ raise TypeError("Priority must be of type int.")
363
+
364
+ self.__priority = priority
365
+ return self
@@ -1,5 +1,5 @@
1
1
  from time import sleep
2
- from rapidata.rapidata_client.dataset.rapidata_dataset import RapidataDataset
2
+ from rapidata.rapidata_client.order._rapidata_dataset import RapidataDataset
3
3
  from rapidata.service.openapi_service import OpenAPIService
4
4
  import json
5
5
  from rapidata.api_client.exceptions import ApiException
@@ -9,33 +9,48 @@ from tqdm import tqdm
9
9
 
10
10
  class RapidataOrder:
11
11
  """
12
- Represents a Rapidata order.
12
+ An instance of a Rapidata order.
13
+
14
+ Used to interact with a specific order in the Rapidata system.
15
+ Such as starting, pausing, and getting the results of the order.
13
16
 
14
17
  Args:
15
- The ID of the order.
16
- The optional Dataset associated with the order.
17
- The OpenAPIService instance used to interact with the Rapidata API.
18
- The name of the order.
18
+ order_id: The ID of the order.
19
+ openapi_service: The OpenAPIService instance used to interact with the Rapidata API.
20
+ name: The name of the order.
21
+ dataset: The optional Dataset associated with the order.
19
22
  """
20
23
 
21
24
  def __init__(
22
25
  self,
23
26
  order_id: str,
24
- dataset: Optional[RapidataDataset],
25
27
  openapi_service: OpenAPIService,
26
28
  name: str,
29
+ dataset: Optional[RapidataDataset]=None,
27
30
  ):
28
- self.openapi_service = openapi_service
29
31
  self.order_id = order_id
30
- self._dataset = dataset
31
32
  self.name = name
32
- self._workflow_id = None
33
+ self.__openapi_service = openapi_service
34
+ self.__dataset = dataset
35
+ self.__workflow_id = None
33
36
 
34
- def submit(self):
37
+ def run(self, print_link: bool=True):
35
38
  """
36
- Submits the order for processing.
39
+ Runs the order for to start collecting votes.
37
40
  """
38
- self.openapi_service.order_api.order_submit_post(self.order_id)
41
+ self.__openapi_service.order_api.order_submit_post(self.order_id)
42
+
43
+ if print_link:
44
+ print(f"Order '{self.name}' is now viewable under: https://app.{self.__openapi_service.enviroment}/order/detail/{self.order_id}")
45
+
46
+ return self
47
+
48
+ def pause(self):
49
+ """
50
+ Pauses the order.
51
+ """
52
+ self.__openapi_service.order_api.order_pause_post(self.order_id)
53
+ print(f"Order '{self}' has been paused.")
39
54
 
40
55
  def get_status(self) -> str:
41
56
  """
@@ -44,19 +59,22 @@ class RapidataOrder:
44
59
  Returns:
45
60
  The status of the order.
46
61
  """
47
- return self.openapi_service.order_api.order_get_by_id_get(self.order_id).state
62
+ return self.__openapi_service.order_api.order_get_by_id_get(self.order_id).state
48
63
 
49
- def display_progress_bar(self, refresh_rate=5):
64
+ def display_progress_bar(self, refresh_rate: int=5):
50
65
  """
51
66
  Displays a progress bar for the order processing using tqdm.
52
67
 
53
- Prameter:
54
- How often to refresh the progress bar, in seconds.
68
+ Args:
69
+ refresh_rate: How often to refresh the progress bar, in seconds.
55
70
  """
71
+ if refresh_rate < 1:
72
+ raise ValueError("refresh_rate must be at least 1")
73
+
56
74
  with tqdm(total=100, desc="Processing order", unit="%", bar_format="{desc}: {percentage:3.0f}%|{bar}| completed [{elapsed}<{remaining}, {rate_fmt}]") as pbar:
57
75
  last_percentage = 0
58
76
  while True:
59
- current_percentage = self._get_workflow_progress().completion_percentage
77
+ current_percentage = self.__get_workflow_progress().completion_percentage
60
78
  if current_percentage > last_percentage:
61
79
  pbar.update(current_percentage - last_percentage)
62
80
  last_percentage = current_percentage
@@ -66,28 +84,28 @@ class RapidataOrder:
66
84
 
67
85
  sleep(refresh_rate)
68
86
 
69
- def _get_workflow_id(self):
70
- if self._workflow_id:
71
- return self._workflow_id
87
+ def __get_workflow_id(self):
88
+ if self.__workflow_id:
89
+ return self.__workflow_id
72
90
 
73
91
  for _ in range(10):
74
92
  try:
75
- order_result = self.openapi_service.order_api.order_get_by_id_get(self.order_id)
76
- pipeline = self.openapi_service.pipeline_api.pipeline_id_get(order_result.pipeline_id)
77
- self._workflow_id = cast(WorkflowArtifactModel, pipeline.artifacts["workflow-artifact"].actual_instance).workflow_id
93
+ order_result = self.__openapi_service.order_api.order_get_by_id_get(self.order_id)
94
+ pipeline = self.__openapi_service.pipeline_api.pipeline_id_get(order_result.pipeline_id)
95
+ self.__workflow_id = cast(WorkflowArtifactModel, pipeline.artifacts["workflow-artifact"].actual_instance).workflow_id
78
96
  break
79
97
  except Exception:
80
98
  sleep(2)
81
- if not self._workflow_id:
99
+ if not self.__workflow_id:
82
100
  raise Exception("Order has not started yet. Please start it or wait for a few seconds and try again.")
83
- return self._workflow_id
101
+ return self.__workflow_id
84
102
 
85
- def _get_workflow_progress(self):
86
- workflow_id = self._get_workflow_id()
103
+ def __get_workflow_progress(self):
104
+ workflow_id = self.__get_workflow_id()
87
105
  progress = None
88
106
  for _ in range(2):
89
107
  try:
90
- progress = self.openapi_service.workflow_api.workflow_get_progress_get(workflow_id)
108
+ progress = self.__openapi_service.workflow_api.workflow_get_progress_get(workflow_id)
91
109
  break
92
110
  except Exception:
93
111
  sleep(5)
@@ -111,7 +129,7 @@ class RapidataOrder:
111
129
 
112
130
  try:
113
131
  # Get the raw result string
114
- result_str = self.openapi_service.order_api.order_result_get(id=self.order_id)
132
+ result_str = self.__openapi_service.order_api.order_result_get(id=self.order_id)
115
133
  # Parse the result string as JSON
116
134
  return json.loads(result_str)
117
135
  except ApiException as e:
@@ -128,7 +146,7 @@ class RapidataOrder:
128
146
  Returns:
129
147
  The RapidataDataset instance.
130
148
  """
131
- return self._dataset
149
+ return self.__dataset
132
150
 
133
151
  def __str__(self) -> str:
134
152
  return f"name: '{self.name}' order id: {self.order_id}"