rapidata 1.10.1__py3-none-any.whl → 2.1.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 (142) hide show
  1. rapidata/__init__.py +22 -17
  2. rapidata/api_client/__init__.py +16 -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 +16 -5
  10. rapidata/api_client/models/add_campaign_model.py +5 -5
  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/create_order_model.py +4 -2
  23. rapidata/api_client/models/create_order_model_user_filters_inner.py +25 -11
  24. rapidata/api_client/models/custom_user_filter_model.py +98 -0
  25. rapidata/api_client/models/file_asset_model_metadata_inner.py +8 -22
  26. rapidata/api_client/models/get_classify_workflow_result_overview_result.py +144 -0
  27. rapidata/api_client/models/get_pipeline_by_id_result.py +13 -3
  28. rapidata/api_client/models/identity_read_bridge_token_get202_response.py +140 -0
  29. rapidata/api_client/models/not_available_yet_result.py +96 -0
  30. rapidata/api_client/models/online_pair_maker_config.py +98 -0
  31. rapidata/api_client/models/online_pair_maker_config_model.py +98 -0
  32. rapidata/api_client/models/online_pair_maker_information.py +100 -0
  33. rapidata/api_client/models/pipeline_id_workflow_put_request.py +140 -0
  34. rapidata/api_client/models/pre_arranged_pair_maker_config.py +100 -0
  35. rapidata/api_client/models/pre_arranged_pair_maker_config_model.py +96 -0
  36. rapidata/api_client/models/pre_arranged_pair_maker_information.py +102 -0
  37. rapidata/api_client/models/read_bridge_token_keys_result.py +11 -2
  38. rapidata/api_client/models/simple_workflow_config.py +7 -26
  39. rapidata/api_client/models/simple_workflow_config_model.py +4 -28
  40. rapidata/api_client/models/simple_workflow_get_result_overview_get200_response.py +16 -16
  41. rapidata/api_client/models/simple_workflow_model1.py +3 -3
  42. rapidata/api_client/models/update_campaign_model.py +99 -0
  43. rapidata/api_client/models/validation_import_post_request_blueprint.py +1 -1
  44. rapidata/api_client_README.md +21 -7
  45. rapidata/rapidata_client/__init__.py +20 -10
  46. rapidata/rapidata_client/assets/__init__.py +5 -4
  47. rapidata/rapidata_client/assets/{media_asset.py → _media_asset.py} +32 -11
  48. rapidata/rapidata_client/assets/{multi_asset.py → _multi_asset.py} +1 -1
  49. rapidata/rapidata_client/assets/{text_asset.py → _text_asset.py} +1 -1
  50. rapidata/rapidata_client/assets/data_type_enum.py +7 -0
  51. rapidata/rapidata_client/filter/__init__.py +2 -1
  52. rapidata/rapidata_client/filter/_base_filter.py +10 -0
  53. rapidata/rapidata_client/filter/age_filter.py +12 -5
  54. rapidata/rapidata_client/filter/campaign_filter.py +12 -3
  55. rapidata/rapidata_client/filter/country_filter.py +10 -3
  56. rapidata/rapidata_client/filter/custom_filter.py +29 -0
  57. rapidata/rapidata_client/filter/gender_filter.py +12 -5
  58. rapidata/rapidata_client/filter/language_filter.py +14 -3
  59. rapidata/rapidata_client/filter/models/age_group.py +26 -0
  60. rapidata/rapidata_client/filter/models/gender.py +19 -0
  61. rapidata/rapidata_client/filter/rapidata_filters.py +35 -0
  62. rapidata/rapidata_client/filter/user_score_filter.py +20 -4
  63. rapidata/rapidata_client/metadata/__init__.py +5 -5
  64. rapidata/rapidata_client/metadata/{base_metadata.py → _base_metadata.py} +2 -1
  65. rapidata/rapidata_client/metadata/{private_text_metadata.py → _private_text_metadata.py} +2 -2
  66. rapidata/rapidata_client/metadata/{prompt_metadata.py → _prompt_metadata.py} +3 -2
  67. rapidata/rapidata_client/metadata/{public_text_metadata.py → _public_text_metadata.py} +2 -2
  68. rapidata/rapidata_client/metadata/{select_words_metadata.py → _select_words_metadata.py} +3 -2
  69. rapidata/rapidata_client/{dataset/rapidata_dataset.py → order/_rapidata_dataset.py} +7 -8
  70. rapidata/rapidata_client/order/_rapidata_order_builder.py +365 -0
  71. rapidata/rapidata_client/order/rapidata_order.py +50 -32
  72. rapidata/rapidata_client/order/rapidata_order_manager.py +461 -0
  73. rapidata/rapidata_client/rapidata_client.py +12 -201
  74. rapidata/rapidata_client/referee/__init__.py +3 -3
  75. rapidata/rapidata_client/referee/{base_referee.py → _base_referee.py} +3 -3
  76. rapidata/rapidata_client/referee/{early_stopping_referee.py → _early_stopping_referee.py} +14 -11
  77. rapidata/rapidata_client/referee/{naive_referee.py → _naive_referee.py} +9 -9
  78. rapidata/rapidata_client/selection/__init__.py +1 -1
  79. rapidata/rapidata_client/{filter/base_filter.py → selection/_base_selection.py} +2 -2
  80. rapidata/rapidata_client/selection/capped_selection.py +15 -5
  81. rapidata/rapidata_client/selection/conditional_validation_selection.py +17 -4
  82. rapidata/rapidata_client/selection/demographic_selection.py +18 -7
  83. rapidata/rapidata_client/selection/labeling_selection.py +10 -3
  84. rapidata/rapidata_client/selection/rapidata_selections.py +21 -0
  85. rapidata/rapidata_client/selection/validation_selection.py +11 -4
  86. rapidata/rapidata_client/settings/__init__.py +9 -2
  87. rapidata/rapidata_client/settings/_rapidata_setting.py +11 -0
  88. rapidata/rapidata_client/settings/alert_on_fast_response.py +21 -0
  89. rapidata/rapidata_client/settings/custom_setting.py +16 -0
  90. rapidata/rapidata_client/settings/free_text_minimum_characters.py +16 -0
  91. rapidata/rapidata_client/settings/models/__init__.py +1 -0
  92. rapidata/rapidata_client/settings/models/translation_behaviour_options.py +14 -0
  93. rapidata/rapidata_client/settings/no_shuffle.py +16 -0
  94. rapidata/rapidata_client/settings/play_video_until_the_end.py +16 -0
  95. rapidata/rapidata_client/settings/rapidata_settings.py +31 -0
  96. rapidata/rapidata_client/settings/translation_behaviour.py +18 -0
  97. rapidata/rapidata_client/validation/__init__.py +1 -0
  98. rapidata/rapidata_client/{dataset/validation_rapid_parts.py → validation/_validation_rapid_parts.py} +7 -6
  99. rapidata/rapidata_client/validation/_validation_set_builder.py +371 -0
  100. rapidata/rapidata_client/{dataset → validation}/rapidata_validation_set.py +54 -50
  101. rapidata/rapidata_client/validation/rapids/__init__.py +1 -0
  102. rapidata/rapidata_client/validation/rapids/box.py +17 -0
  103. rapidata/rapidata_client/validation/rapids/rapids.py +94 -0
  104. rapidata/rapidata_client/validation/rapids/rapids_manager.py +163 -0
  105. rapidata/rapidata_client/validation/validation_set_manager.py +338 -0
  106. rapidata/rapidata_client/workflow/__init__.py +8 -6
  107. rapidata/rapidata_client/workflow/_base_workflow.py +25 -0
  108. rapidata/rapidata_client/workflow/{classify_workflow.py → _classify_workflow.py} +6 -6
  109. rapidata/rapidata_client/workflow/{compare_workflow.py → _compare_workflow.py} +10 -16
  110. rapidata/rapidata_client/workflow/_draw_workflow.py +22 -0
  111. rapidata/rapidata_client/workflow/_evaluation_workflow.py +26 -0
  112. rapidata/rapidata_client/workflow/{free_text_workflow.py → _free_text_workflow.py} +10 -16
  113. rapidata/rapidata_client/workflow/_locate_workflow.py +22 -0
  114. rapidata/rapidata_client/workflow/{select_words_workflow.py → _select_words_workflow.py} +2 -8
  115. rapidata/service/credential_manager.py +11 -1
  116. rapidata/service/openapi_service.py +23 -4
  117. {rapidata-1.10.1.dist-info → rapidata-2.1.0.dist-info}/METADATA +2 -1
  118. {rapidata-1.10.1.dist-info → rapidata-2.1.0.dist-info}/RECORD +122 -96
  119. rapidata/constants.py +0 -1
  120. rapidata/rapidata_client/dataset/rapid_builders/__init__.py +0 -4
  121. rapidata/rapidata_client/dataset/rapid_builders/base_rapid_builder.py +0 -33
  122. rapidata/rapidata_client/dataset/rapid_builders/classify_rapid_builders.py +0 -166
  123. rapidata/rapidata_client/dataset/rapid_builders/compare_rapid_builders.py +0 -145
  124. rapidata/rapidata_client/dataset/rapid_builders/rapids.py +0 -33
  125. rapidata/rapidata_client/dataset/rapid_builders/select_words_rapid_builders.py +0 -124
  126. rapidata/rapidata_client/dataset/validation_set_builder.py +0 -336
  127. rapidata/rapidata_client/order/order_builder.py +0 -25
  128. rapidata/rapidata_client/order/rapidata_order_builder.py +0 -463
  129. rapidata/rapidata_client/selection/base_selection.py +0 -9
  130. rapidata/rapidata_client/settings/feature_flags.py +0 -125
  131. rapidata/rapidata_client/settings/settings.py +0 -124
  132. rapidata/rapidata_client/simple_builders/__init__.py +0 -0
  133. rapidata/rapidata_client/simple_builders/simple_classification_builders.py +0 -271
  134. rapidata/rapidata_client/simple_builders/simple_compare_builders.py +0 -267
  135. rapidata/rapidata_client/simple_builders/simple_free_text_builders.py +0 -192
  136. rapidata/rapidata_client/simple_builders/simple_select_words_builders.py +0 -196
  137. rapidata/rapidata_client/workflow/base_workflow.py +0 -42
  138. rapidata/rapidata_client/workflow/evaluation_workflow.py +0 -15
  139. /rapidata/rapidata_client/assets/{base_asset.py → _base_asset.py} +0 -0
  140. /rapidata/rapidata_client/{dataset → filter/models}/__init__.py +0 -0
  141. {rapidata-1.10.1.dist-info → rapidata-2.1.0.dist-info}/LICENSE +0 -0
  142. {rapidata-1.10.1.dist-info → rapidata-2.1.0.dist-info}/WHEEL +0 -0
@@ -1,7 +1,7 @@
1
1
  from rapidata.api_client.models.private_text_metadata_input import (
2
2
  PrivateTextMetadataInput,
3
3
  )
4
- from rapidata.rapidata_client.metadata.base_metadata import Metadata
4
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
5
5
 
6
6
 
7
7
  class PrivateTextMetadata(Metadata):
@@ -10,7 +10,7 @@ class PrivateTextMetadata(Metadata):
10
10
  super().__init__(identifier=identifier)
11
11
  self._text = text
12
12
 
13
- def to_model(self):
13
+ def _to_model(self):
14
14
  return PrivateTextMetadataInput(
15
15
  _t="PrivateTextMetadataInput", identifier=self._identifier, text=self._text
16
16
  )
@@ -1,8 +1,9 @@
1
- from rapidata.rapidata_client.metadata.base_metadata import Metadata
1
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
2
2
  from rapidata.api_client.models.prompt_metadata_input import PromptMetadataInput
3
3
 
4
4
 
5
5
  class PromptMetadata(Metadata):
6
+ """The PromptMetadata class is used to display a prompt to the user."""
6
7
 
7
8
  def __init__(self, prompt: str, identifier: str = "prompt"):
8
9
  super().__init__(identifier=identifier)
@@ -13,5 +14,5 @@ class PromptMetadata(Metadata):
13
14
  self._prompt = prompt
14
15
 
15
16
 
16
- def to_model(self):
17
+ def _to_model(self):
17
18
  return PromptMetadataInput(_t="PromptMetadataInput", identifier=self._identifier, prompt=self._prompt)
@@ -1,7 +1,7 @@
1
1
  from rapidata.api_client.models.public_text_metadata_input import (
2
2
  PublicTextMetadataInput,
3
3
  )
4
- from rapidata.rapidata_client.metadata.base_metadata import Metadata
4
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
5
5
 
6
6
 
7
7
  class PublicTextMetadata(Metadata):
@@ -10,7 +10,7 @@ class PublicTextMetadata(Metadata):
10
10
  super().__init__(identifier=identifier)
11
11
  self._text = text
12
12
 
13
- def to_model(self):
13
+ def _to_model(self):
14
14
  return PublicTextMetadataInput(
15
15
  _t="PublicTextMetadataInput", identifier=self._identifier, text=self._text
16
16
  )
@@ -1,17 +1,18 @@
1
1
  from rapidata.api_client.models.transcription_metadata_input import (
2
2
  TranscriptionMetadataInput,
3
3
  )
4
- from rapidata.rapidata_client.metadata.base_metadata import Metadata
4
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
5
5
 
6
6
 
7
7
  class SelectWordsMetadata(Metadata):
8
+ """SelectWordsMetadata Class is used to define the Sentence that will be display to the user."""
8
9
 
9
10
  def __init__(self, select_words: str, identifier: str = "transcription"):
10
11
  super().__init__(identifier=identifier)
11
12
  self.identifier = identifier
12
13
  self.select_words = select_words
13
14
 
14
- def to_model(self):
15
+ def _to_model(self):
15
16
  return TranscriptionMetadataInput(
16
17
  _t="TranscriptionMetadataInput",
17
18
  identifier=self.identifier,
@@ -1,5 +1,4 @@
1
1
  from itertools import zip_longest
2
- import os
3
2
 
4
3
  from rapidata.api_client.models.datapoint_metadata_model import DatapointMetadataModel
5
4
  from rapidata.api_client.models.datapoint_metadata_model_metadata_inner import (
@@ -8,14 +7,14 @@ from rapidata.api_client.models.datapoint_metadata_model_metadata_inner import (
8
7
  from rapidata.api_client.models.upload_text_sources_to_dataset_model import (
9
8
  UploadTextSourcesToDatasetModel,
10
9
  )
11
- from rapidata.rapidata_client.metadata.base_metadata import Metadata
10
+ from rapidata.rapidata_client.metadata._base_metadata import Metadata
12
11
  from rapidata.rapidata_client.assets import TextAsset, MediaAsset, MultiAsset
13
12
  from rapidata.service import LocalFileService
14
13
  from rapidata.service.openapi_service import OpenAPIService
15
14
  from concurrent.futures import ThreadPoolExecutor, as_completed
16
15
  from tqdm import tqdm
17
16
 
18
- from typing import cast
17
+ from typing import cast, Sequence
19
18
 
20
19
 
21
20
  class RapidataDataset:
@@ -25,7 +24,7 @@ class RapidataDataset:
25
24
  self.openapi_service = openapi_service
26
25
  self.local_file_service = LocalFileService()
27
26
 
28
- def add_texts(
27
+ def _add_texts(
29
28
  self,
30
29
  text_assets: list[TextAsset] | list[MultiAsset],
31
30
  max_workers: int = 10,
@@ -63,17 +62,17 @@ class RapidataDataset:
63
62
  future.result() # This will raise any exceptions that occurred during execution
64
63
  pbar.update(1)
65
64
 
66
- def add_media_from_paths(
65
+ def _add_media_from_paths(
67
66
  self,
68
67
  media_paths: list[MediaAsset] | list[MultiAsset], # where multiasset is a list of media assets
69
- metadata: list[Metadata] | None = None,
68
+ metadata: Sequence[Metadata] | None = None,
70
69
  max_workers: int = 10,
71
70
  ):
72
71
  if metadata is not None and len(metadata) != len(media_paths):
73
72
  raise ValueError(
74
73
  "metadata must be None or have the same length as media_paths"
75
74
  )
76
-
75
+
77
76
  for media_path in media_paths:
78
77
  if isinstance(media_path, MultiAsset):
79
78
  assert all(
@@ -88,7 +87,7 @@ class RapidataDataset:
88
87
  else:
89
88
  raise ValueError(f"Unsupported asset type: {type(media_asset)}")
90
89
 
91
- meta_model = meta.to_model() if meta else None
90
+ meta_model = meta._to_model() if meta else None
92
91
  model = DatapointMetadataModel(
93
92
  datasetId=self.dataset_id,
94
93
  metadata=(
@@ -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
+ name: The name of the order.
19
+ order_id: The ID of the order.
20
+ openapi_service: The OpenAPIService instance used to interact with the Rapidata API.
21
+ dataset: The optional Dataset associated with the order.
19
22
  """
20
23
 
21
24
  def __init__(
22
25
  self,
26
+ name: str,
23
27
  order_id: str,
24
- dataset: Optional[RapidataDataset],
25
28
  openapi_service: OpenAPIService,
26
- 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}"