dtlpy 1.113.10__py3-none-any.whl → 1.114.13__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.
Files changed (243) hide show
  1. dtlpy/__init__.py +488 -488
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/__init__.py +26 -26
  4. dtlpy/assets/__pycache__/__init__.cpython-38.pyc +0 -0
  5. dtlpy/assets/code_server/config.yaml +2 -2
  6. dtlpy/assets/code_server/installation.sh +24 -24
  7. dtlpy/assets/code_server/launch.json +13 -13
  8. dtlpy/assets/code_server/settings.json +2 -2
  9. dtlpy/assets/main.py +53 -53
  10. dtlpy/assets/main_partial.py +18 -18
  11. dtlpy/assets/mock.json +11 -11
  12. dtlpy/assets/model_adapter.py +83 -83
  13. dtlpy/assets/package.json +61 -61
  14. dtlpy/assets/package_catalog.json +29 -29
  15. dtlpy/assets/package_gitignore +307 -307
  16. dtlpy/assets/service_runners/__init__.py +33 -33
  17. dtlpy/assets/service_runners/converter.py +96 -96
  18. dtlpy/assets/service_runners/multi_method.py +49 -49
  19. dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
  20. dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
  21. dtlpy/assets/service_runners/multi_method_item.py +52 -52
  22. dtlpy/assets/service_runners/multi_method_json.py +52 -52
  23. dtlpy/assets/service_runners/single_method.py +37 -37
  24. dtlpy/assets/service_runners/single_method_annotation.py +43 -43
  25. dtlpy/assets/service_runners/single_method_dataset.py +43 -43
  26. dtlpy/assets/service_runners/single_method_item.py +41 -41
  27. dtlpy/assets/service_runners/single_method_json.py +42 -42
  28. dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
  29. dtlpy/assets/voc_annotation_template.xml +23 -23
  30. dtlpy/caches/base_cache.py +32 -32
  31. dtlpy/caches/cache.py +473 -473
  32. dtlpy/caches/dl_cache.py +201 -201
  33. dtlpy/caches/filesystem_cache.py +89 -89
  34. dtlpy/caches/redis_cache.py +84 -84
  35. dtlpy/dlp/__init__.py +20 -20
  36. dtlpy/dlp/cli_utilities.py +367 -367
  37. dtlpy/dlp/command_executor.py +764 -764
  38. dtlpy/dlp/dlp +1 -1
  39. dtlpy/dlp/dlp.bat +1 -1
  40. dtlpy/dlp/dlp.py +128 -128
  41. dtlpy/dlp/parser.py +651 -651
  42. dtlpy/entities/__init__.py +83 -83
  43. dtlpy/entities/analytic.py +311 -311
  44. dtlpy/entities/annotation.py +1879 -1879
  45. dtlpy/entities/annotation_collection.py +699 -699
  46. dtlpy/entities/annotation_definitions/__init__.py +20 -20
  47. dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
  48. dtlpy/entities/annotation_definitions/box.py +195 -195
  49. dtlpy/entities/annotation_definitions/classification.py +67 -67
  50. dtlpy/entities/annotation_definitions/comparison.py +72 -72
  51. dtlpy/entities/annotation_definitions/cube.py +204 -204
  52. dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
  53. dtlpy/entities/annotation_definitions/description.py +32 -32
  54. dtlpy/entities/annotation_definitions/ellipse.py +124 -124
  55. dtlpy/entities/annotation_definitions/free_text.py +62 -62
  56. dtlpy/entities/annotation_definitions/gis.py +69 -69
  57. dtlpy/entities/annotation_definitions/note.py +139 -139
  58. dtlpy/entities/annotation_definitions/point.py +117 -117
  59. dtlpy/entities/annotation_definitions/polygon.py +182 -182
  60. dtlpy/entities/annotation_definitions/polyline.py +111 -111
  61. dtlpy/entities/annotation_definitions/pose.py +92 -92
  62. dtlpy/entities/annotation_definitions/ref_image.py +86 -86
  63. dtlpy/entities/annotation_definitions/segmentation.py +240 -240
  64. dtlpy/entities/annotation_definitions/subtitle.py +34 -34
  65. dtlpy/entities/annotation_definitions/text.py +85 -85
  66. dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
  67. dtlpy/entities/app.py +220 -220
  68. dtlpy/entities/app_module.py +107 -107
  69. dtlpy/entities/artifact.py +174 -174
  70. dtlpy/entities/assignment.py +399 -399
  71. dtlpy/entities/base_entity.py +214 -214
  72. dtlpy/entities/bot.py +113 -113
  73. dtlpy/entities/codebase.py +296 -296
  74. dtlpy/entities/collection.py +38 -38
  75. dtlpy/entities/command.py +169 -169
  76. dtlpy/entities/compute.py +442 -442
  77. dtlpy/entities/dataset.py +1285 -1285
  78. dtlpy/entities/directory_tree.py +44 -44
  79. dtlpy/entities/dpk.py +470 -470
  80. dtlpy/entities/driver.py +222 -222
  81. dtlpy/entities/execution.py +397 -397
  82. dtlpy/entities/feature.py +124 -124
  83. dtlpy/entities/feature_set.py +145 -145
  84. dtlpy/entities/filters.py +641 -641
  85. dtlpy/entities/gis_item.py +107 -107
  86. dtlpy/entities/integration.py +184 -184
  87. dtlpy/entities/item.py +953 -953
  88. dtlpy/entities/label.py +123 -123
  89. dtlpy/entities/links.py +85 -85
  90. dtlpy/entities/message.py +175 -175
  91. dtlpy/entities/model.py +694 -691
  92. dtlpy/entities/node.py +1005 -1005
  93. dtlpy/entities/ontology.py +803 -803
  94. dtlpy/entities/organization.py +287 -287
  95. dtlpy/entities/package.py +657 -657
  96. dtlpy/entities/package_defaults.py +5 -5
  97. dtlpy/entities/package_function.py +185 -185
  98. dtlpy/entities/package_module.py +113 -113
  99. dtlpy/entities/package_slot.py +118 -118
  100. dtlpy/entities/paged_entities.py +290 -267
  101. dtlpy/entities/pipeline.py +593 -593
  102. dtlpy/entities/pipeline_execution.py +279 -279
  103. dtlpy/entities/project.py +394 -394
  104. dtlpy/entities/prompt_item.py +499 -499
  105. dtlpy/entities/recipe.py +301 -301
  106. dtlpy/entities/reflect_dict.py +102 -102
  107. dtlpy/entities/resource_execution.py +138 -138
  108. dtlpy/entities/service.py +958 -958
  109. dtlpy/entities/service_driver.py +117 -117
  110. dtlpy/entities/setting.py +294 -294
  111. dtlpy/entities/task.py +491 -491
  112. dtlpy/entities/time_series.py +143 -143
  113. dtlpy/entities/trigger.py +426 -426
  114. dtlpy/entities/user.py +118 -118
  115. dtlpy/entities/webhook.py +124 -124
  116. dtlpy/examples/__init__.py +19 -19
  117. dtlpy/examples/add_labels.py +135 -135
  118. dtlpy/examples/add_metadata_to_item.py +21 -21
  119. dtlpy/examples/annotate_items_using_model.py +65 -65
  120. dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
  121. dtlpy/examples/annotations_convert_to_voc.py +9 -9
  122. dtlpy/examples/annotations_convert_to_yolo.py +9 -9
  123. dtlpy/examples/convert_annotation_types.py +51 -51
  124. dtlpy/examples/converter.py +143 -143
  125. dtlpy/examples/copy_annotations.py +22 -22
  126. dtlpy/examples/copy_folder.py +31 -31
  127. dtlpy/examples/create_annotations.py +51 -51
  128. dtlpy/examples/create_video_annotations.py +83 -83
  129. dtlpy/examples/delete_annotations.py +26 -26
  130. dtlpy/examples/filters.py +113 -113
  131. dtlpy/examples/move_item.py +23 -23
  132. dtlpy/examples/play_video_annotation.py +13 -13
  133. dtlpy/examples/show_item_and_mask.py +53 -53
  134. dtlpy/examples/triggers.py +49 -49
  135. dtlpy/examples/upload_batch_of_items.py +20 -20
  136. dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
  137. dtlpy/examples/upload_items_with_modalities.py +43 -43
  138. dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
  139. dtlpy/examples/upload_yolo_format_annotations.py +70 -70
  140. dtlpy/exceptions.py +125 -125
  141. dtlpy/miscellaneous/__init__.py +20 -20
  142. dtlpy/miscellaneous/dict_differ.py +95 -95
  143. dtlpy/miscellaneous/git_utils.py +217 -217
  144. dtlpy/miscellaneous/json_utils.py +14 -14
  145. dtlpy/miscellaneous/list_print.py +105 -105
  146. dtlpy/miscellaneous/zipping.py +130 -130
  147. dtlpy/ml/__init__.py +20 -20
  148. dtlpy/ml/base_feature_extractor_adapter.py +27 -27
  149. dtlpy/ml/base_model_adapter.py +945 -940
  150. dtlpy/ml/metrics.py +461 -461
  151. dtlpy/ml/predictions_utils.py +274 -274
  152. dtlpy/ml/summary_writer.py +57 -57
  153. dtlpy/ml/train_utils.py +60 -60
  154. dtlpy/new_instance.py +252 -252
  155. dtlpy/repositories/__init__.py +56 -56
  156. dtlpy/repositories/analytics.py +85 -85
  157. dtlpy/repositories/annotations.py +916 -916
  158. dtlpy/repositories/apps.py +383 -383
  159. dtlpy/repositories/artifacts.py +452 -452
  160. dtlpy/repositories/assignments.py +599 -599
  161. dtlpy/repositories/bots.py +213 -213
  162. dtlpy/repositories/codebases.py +559 -559
  163. dtlpy/repositories/collections.py +332 -348
  164. dtlpy/repositories/commands.py +158 -158
  165. dtlpy/repositories/compositions.py +61 -61
  166. dtlpy/repositories/computes.py +434 -406
  167. dtlpy/repositories/datasets.py +1291 -1291
  168. dtlpy/repositories/downloader.py +895 -895
  169. dtlpy/repositories/dpks.py +433 -433
  170. dtlpy/repositories/drivers.py +266 -266
  171. dtlpy/repositories/executions.py +817 -817
  172. dtlpy/repositories/feature_sets.py +226 -226
  173. dtlpy/repositories/features.py +238 -238
  174. dtlpy/repositories/integrations.py +484 -484
  175. dtlpy/repositories/items.py +909 -915
  176. dtlpy/repositories/messages.py +94 -94
  177. dtlpy/repositories/models.py +877 -867
  178. dtlpy/repositories/nodes.py +80 -80
  179. dtlpy/repositories/ontologies.py +511 -511
  180. dtlpy/repositories/organizations.py +525 -525
  181. dtlpy/repositories/packages.py +1941 -1941
  182. dtlpy/repositories/pipeline_executions.py +448 -448
  183. dtlpy/repositories/pipelines.py +642 -642
  184. dtlpy/repositories/projects.py +539 -539
  185. dtlpy/repositories/recipes.py +399 -399
  186. dtlpy/repositories/resource_executions.py +137 -137
  187. dtlpy/repositories/schema.py +120 -120
  188. dtlpy/repositories/service_drivers.py +213 -213
  189. dtlpy/repositories/services.py +1704 -1704
  190. dtlpy/repositories/settings.py +339 -339
  191. dtlpy/repositories/tasks.py +1124 -1124
  192. dtlpy/repositories/times_series.py +278 -278
  193. dtlpy/repositories/triggers.py +536 -536
  194. dtlpy/repositories/upload_element.py +257 -257
  195. dtlpy/repositories/uploader.py +651 -651
  196. dtlpy/repositories/webhooks.py +249 -249
  197. dtlpy/services/__init__.py +22 -22
  198. dtlpy/services/aihttp_retry.py +131 -131
  199. dtlpy/services/api_client.py +1782 -1782
  200. dtlpy/services/api_reference.py +40 -40
  201. dtlpy/services/async_utils.py +133 -133
  202. dtlpy/services/calls_counter.py +44 -44
  203. dtlpy/services/check_sdk.py +68 -68
  204. dtlpy/services/cookie.py +115 -115
  205. dtlpy/services/create_logger.py +156 -156
  206. dtlpy/services/events.py +84 -84
  207. dtlpy/services/logins.py +235 -235
  208. dtlpy/services/reporter.py +256 -256
  209. dtlpy/services/service_defaults.py +91 -91
  210. dtlpy/utilities/__init__.py +20 -20
  211. dtlpy/utilities/annotations/__init__.py +16 -16
  212. dtlpy/utilities/annotations/annotation_converters.py +269 -269
  213. dtlpy/utilities/base_package_runner.py +264 -264
  214. dtlpy/utilities/converter.py +1650 -1650
  215. dtlpy/utilities/dataset_generators/__init__.py +1 -1
  216. dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
  217. dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
  218. dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
  219. dtlpy/utilities/local_development/__init__.py +1 -1
  220. dtlpy/utilities/local_development/local_session.py +179 -179
  221. dtlpy/utilities/reports/__init__.py +2 -2
  222. dtlpy/utilities/reports/figures.py +343 -343
  223. dtlpy/utilities/reports/report.py +71 -71
  224. dtlpy/utilities/videos/__init__.py +17 -17
  225. dtlpy/utilities/videos/video_player.py +598 -598
  226. dtlpy/utilities/videos/videos.py +470 -470
  227. {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp +1 -1
  228. dtlpy-1.114.13.data/scripts/dlp.bat +2 -0
  229. {dtlpy-1.113.10.data → dtlpy-1.114.13.data}/scripts/dlp.py +128 -128
  230. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/LICENSE +200 -200
  231. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/METADATA +172 -172
  232. dtlpy-1.114.13.dist-info/RECORD +240 -0
  233. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/WHEEL +1 -1
  234. tests/features/environment.py +551 -550
  235. dtlpy-1.113.10.data/scripts/dlp.bat +0 -2
  236. dtlpy-1.113.10.dist-info/RECORD +0 -244
  237. tests/assets/__init__.py +0 -0
  238. tests/assets/models_flow/__init__.py +0 -0
  239. tests/assets/models_flow/failedmain.py +0 -52
  240. tests/assets/models_flow/main.py +0 -62
  241. tests/assets/models_flow/main_model.py +0 -54
  242. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/entry_points.txt +0 -0
  243. {dtlpy-1.113.10.dist-info → dtlpy-1.114.13.dist-info}/top_level.txt +0 -0
dtlpy/entities/project.py CHANGED
@@ -1,394 +1,394 @@
1
- from collections import namedtuple
2
- from enum import Enum
3
- import traceback
4
- import logging
5
- import attr
6
-
7
- from .. import repositories, miscellaneous, entities
8
- from ..services.api_client import ApiClient
9
-
10
- logger = logging.getLogger(name='dtlpy')
11
-
12
-
13
- class MemberRole(str, Enum):
14
- OWNER = "owner"
15
- DEVELOPER = "engineer"
16
- ANNOTATOR = "annotator"
17
- ANNOTATION_MANAGER = "annotationManager"
18
-
19
-
20
- @attr.s()
21
- class Project(entities.BaseEntity):
22
- """
23
- Project entity
24
- """
25
-
26
- _contributors = attr.ib(repr=False)
27
- created_at = attr.ib()
28
- creator = attr.ib()
29
- id = attr.ib()
30
- url = attr.ib()
31
- name = attr.ib()
32
- org = attr.ib(repr=False)
33
- updated_at = attr.ib(repr=False)
34
- role = attr.ib(repr=False)
35
- account = attr.ib(repr=False)
36
- is_blocked = attr.ib(repr=False)
37
- archived = attr.ib(repr=False)
38
-
39
- # name change
40
- feature_constraints = attr.ib()
41
-
42
- # api
43
- _client_api = attr.ib(type=ApiClient, repr=False)
44
-
45
- # repositories
46
- _repositories = attr.ib(repr=False)
47
-
48
- @property
49
- def isBlocked(self):
50
- return self.is_blocked
51
-
52
- @property
53
- def createdAt(self):
54
- return self.created_at
55
-
56
- @property
57
- def updatedAt(self):
58
- return self.updated_at
59
-
60
- @_repositories.default
61
- def set_repositories(self):
62
- reps = namedtuple(
63
- 'repositories',
64
- 'projects triggers datasets items recipes packages codebases artifacts times_series services '
65
- 'executions assignments tasks bots webhooks models analytics ontologies '
66
- 'drivers pipelines feature_sets features integrations settings apps dpks compositions'
67
- )
68
- datasets = repositories.Datasets(client_api=self._client_api, project=self)
69
- return reps(
70
- projects=repositories.Projects(client_api=self._client_api),
71
- webhooks=repositories.Webhooks(client_api=self._client_api, project=self),
72
- items=repositories.Items(client_api=self._client_api, datasets=datasets, project=self),
73
- recipes=repositories.Recipes(client_api=self._client_api, project=self, project_id=self.id),
74
- datasets=datasets,
75
- executions=repositories.Executions(client_api=self._client_api, project=self),
76
- triggers=repositories.Triggers(client_api=self._client_api, project=self),
77
- packages=repositories.Packages(project=self, client_api=self._client_api),
78
- models=repositories.Models(project=self, client_api=self._client_api),
79
- codebases=repositories.Codebases(project=self, client_api=self._client_api),
80
- artifacts=repositories.Artifacts(project=self, client_api=self._client_api),
81
- times_series=repositories.TimesSeries(project=self, client_api=self._client_api),
82
- services=repositories.Services(client_api=self._client_api, project=self),
83
- assignments=repositories.Assignments(project=self, client_api=self._client_api),
84
- tasks=repositories.Tasks(client_api=self._client_api, project=self),
85
- bots=repositories.Bots(client_api=self._client_api, project=self),
86
- analytics=repositories.Analytics(client_api=self._client_api, project=self),
87
- ontologies=repositories.Ontologies(client_api=self._client_api, project=self),
88
- drivers=repositories.Drivers(client_api=self._client_api, project=self),
89
- pipelines=repositories.Pipelines(client_api=self._client_api, project=self),
90
- feature_sets=repositories.FeatureSets(client_api=self._client_api, project=self),
91
- features=repositories.Features(client_api=self._client_api, project=self),
92
- integrations=repositories.Integrations(client_api=self._client_api, project=self),
93
- settings=repositories.Settings(client_api=self._client_api,
94
- project=self,
95
- resource=self,
96
- resource_type=entities.PlatformEntityType.PROJECT),
97
- apps=repositories.Apps(client_api=self._client_api, project=self),
98
- dpks=repositories.Dpks(client_api=self._client_api, project=self),
99
- compositions=repositories.Compositions(client_api=self._client_api, project=self)
100
- )
101
-
102
- @property
103
- def drivers(self):
104
- assert isinstance(self._repositories.drivers, repositories.Drivers)
105
- return self._repositories.drivers
106
-
107
- @property
108
- def integrations(self):
109
- assert isinstance(self._repositories.integrations, repositories.Integrations)
110
- return self._repositories.integrations
111
-
112
- @property
113
- def platform_url(self):
114
- return self._client_api._get_resource_url("projects/{}".format(self.id))
115
-
116
- @property
117
- def triggers(self):
118
- assert isinstance(self._repositories.triggers, repositories.Triggers)
119
- return self._repositories.triggers
120
-
121
- @property
122
- def ontologies(self):
123
- assert isinstance(self._repositories.ontologies, repositories.Ontologies)
124
- return self._repositories.ontologies
125
-
126
- @property
127
- def items(self):
128
- assert isinstance(self._repositories.items, repositories.Items)
129
- return self._repositories.items
130
-
131
- @property
132
- def recipes(self):
133
- assert isinstance(self._repositories.recipes, repositories.Recipes)
134
- return self._repositories.recipes
135
-
136
- @property
137
- def services(self):
138
- assert isinstance(self._repositories.services, repositories.Services)
139
- return self._repositories.services
140
-
141
- @property
142
- def executions(self):
143
- assert isinstance(self._repositories.executions, repositories.Executions)
144
- return self._repositories.executions
145
-
146
- @property
147
- def apps(self):
148
- assert isinstance(self._repositories.apps, repositories.Apps)
149
- return self._repositories.apps
150
-
151
- @property
152
- def dpks(self):
153
- assert isinstance(self._repositories.dpks, repositories.Dpks)
154
- return self._repositories.dpks
155
-
156
- @property
157
- def compositions(self):
158
- assert isinstance(self._repositories.compositions, repositories.Compositions)
159
- return self._repositories.compositions
160
-
161
- @property
162
- def projects(self):
163
- assert isinstance(self._repositories.projects, repositories.Projects)
164
- return self._repositories.projects
165
-
166
- @property
167
- def datasets(self):
168
- assert isinstance(self._repositories.datasets, repositories.Datasets)
169
- return self._repositories.datasets
170
-
171
- @property
172
- def pipelines(self):
173
- assert isinstance(self._repositories.pipelines, repositories.Pipelines)
174
- return self._repositories.pipelines
175
-
176
- @property
177
- def packages(self):
178
- assert isinstance(self._repositories.packages, repositories.Packages)
179
- return self._repositories.packages
180
-
181
- @property
182
- def models(self):
183
- assert isinstance(self._repositories.models, repositories.Models)
184
- return self._repositories.models
185
-
186
- @property
187
- def codebases(self):
188
- assert isinstance(self._repositories.codebases, repositories.Codebases)
189
- return self._repositories.codebases
190
-
191
- @property
192
- def webhooks(self):
193
- assert isinstance(self._repositories.webhooks, repositories.Webhooks)
194
- return self._repositories.webhooks
195
-
196
- @property
197
- def artifacts(self):
198
- assert isinstance(self._repositories.artifacts, repositories.Artifacts)
199
- return self._repositories.artifacts
200
-
201
- @property
202
- def times_series(self):
203
- assert isinstance(self._repositories.times_series, repositories.TimesSeries)
204
- return self._repositories.times_series
205
-
206
- @property
207
- def assignments(self):
208
- assert isinstance(self._repositories.assignments, repositories.Assignments)
209
- return self._repositories.assignments
210
-
211
- @property
212
- def tasks(self):
213
- assert isinstance(self._repositories.tasks, repositories.Tasks)
214
- return self._repositories.tasks
215
-
216
- @property
217
- def bots(self):
218
- assert isinstance(self._repositories.bots, repositories.Bots)
219
- return self._repositories.bots
220
-
221
- @property
222
- def analytics(self):
223
- assert isinstance(self._repositories.analytics, repositories.Analytics)
224
- return self._repositories.analytics
225
-
226
- @property
227
- def feature_sets(self):
228
- assert isinstance(self._repositories.feature_sets, repositories.FeatureSets)
229
- return self._repositories.feature_sets
230
-
231
- @property
232
- def features(self):
233
- assert isinstance(self._repositories.features, repositories.Features)
234
- return self._repositories.features
235
-
236
- @property
237
- def settings(self):
238
- assert isinstance(self._repositories.settings, repositories.Settings)
239
- return self._repositories.settings
240
-
241
- @property
242
- def contributors(self):
243
- return miscellaneous.List([entities.User.from_json(_json=_json,
244
- client_api=self._client_api,
245
- project=self) for _json in self._contributors])
246
-
247
- @staticmethod
248
- def _protected_from_json(_json, client_api):
249
- """
250
- Same as from_json but with try-except to catch if error
251
-
252
- :param dict _json: platform json
253
- :param dl.ApiClient client_api: ApiClient entity
254
- :return:
255
- """
256
- try:
257
- project = Project.from_json(_json=_json,
258
- client_api=client_api)
259
- status = True
260
- except Exception:
261
- project = traceback.format_exc()
262
- status = False
263
- return status, project
264
-
265
- @classmethod
266
- def from_json(cls, _json, client_api, is_fetched=True):
267
- """
268
- Build a Project object from a json
269
-
270
- :param bool is_fetched: is Entity fetched from Platform
271
- :param dict _json: _json response from host
272
- :param dl.ApiClient client_api: ApiClient entity
273
- :return: Project object
274
- :rtype: dtlpy.entities.project.Project
275
- """
276
- inst = cls(feature_constraints=_json.get('featureConstraints', None),
277
- contributors=_json.get('contributors', None),
278
- is_blocked=_json.get('isBlocked', None),
279
- created_at=_json.get('createdAt', None),
280
- updated_at=_json.get('updatedAt', None),
281
- creator=_json.get('creator', None),
282
- account=_json.get('account', None),
283
- name=_json.get('name', None),
284
- role=_json.get('role', None),
285
- org=_json.get('org', None),
286
- id=_json.get('id', None),
287
- url=_json.get('url', None),
288
- archived=_json.get('archived', None),
289
- client_api=client_api)
290
- inst.is_fetched = is_fetched
291
- return inst
292
-
293
- def to_json(self):
294
- """
295
- Returns platform _json format of project object
296
-
297
- :return: platform json format of project object
298
- :rtype: dict
299
- """
300
- output_dict = attr.asdict(self,
301
- filter=attr.filters.exclude(attr.fields(Project)._client_api,
302
- attr.fields(Project)._repositories,
303
- attr.fields(Project).feature_constraints,
304
- attr.fields(Project)._contributors,
305
- attr.fields(Project).created_at,
306
- attr.fields(Project).updated_at,
307
- attr.fields(Project).is_blocked,
308
- ))
309
- output_dict['contributors'] = self._contributors
310
- output_dict['featureConstraints'] = self.feature_constraints
311
- output_dict['createdAt'] = self.created_at
312
- output_dict['updatedAt'] = self.updated_at
313
- output_dict['isBlocked'] = self.is_blocked
314
-
315
- return output_dict
316
-
317
- def delete(self, sure=False, really=False):
318
- """
319
- Delete the project forever!
320
-
321
- :param bool sure: Are you sure you want to delete?
322
- :param bool really: Really really sure?
323
- :return: True if success, error if not
324
- :rtype: bool
325
- """
326
- return self.projects.delete(project_id=self.id,
327
- sure=sure,
328
- really=really)
329
-
330
- def update(self, system_metadata=False):
331
- """
332
- Update the project
333
-
334
- :param bool system_metadata: optional - True, if you want to change metadata system
335
- :return: Project object
336
- :rtype: dtlpy.entities.project.Project
337
- """
338
- return self.projects.update(project=self, system_metadata=system_metadata)
339
-
340
- def checkout(self):
341
- """
342
- Checkout (switch) to a project to work on.
343
-
344
- """
345
- self.projects.checkout(project=self)
346
-
347
- def open_in_web(self):
348
- """
349
- Open the project in web platform
350
-
351
- """
352
- self._client_api._open_in_web(url=self.platform_url)
353
-
354
- def add_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
355
- """
356
- Add a member to the project.
357
-
358
- :param str email: member email
359
- :param role: The required role for the user. Use the enum dl.MemberRole
360
- :return: dict that represent the user
361
- :rtype: dict
362
- """
363
- return self.projects.add_member(email=email, role=role, project_id=self.id)
364
-
365
- def update_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
366
- """
367
- Update member's information/details from the project.
368
-
369
- :param str email: member email
370
- :param role: The required role for the user. Use the enum dl.MemberRole
371
- :return: dict that represent the user
372
- :rtype: dict
373
- """
374
- return self.projects.update_member(email=email, role=role, project_id=self.id)
375
-
376
- def remove_member(self, email):
377
- """
378
- Remove a member from the project.
379
-
380
- :param str email: member email
381
- :return: dict that represents the user
382
- :rtype: dict
383
- """
384
- return self.projects.remove_member(email=email, project_id=self.id)
385
-
386
- def list_members(self, role: MemberRole = None):
387
- """
388
- List the project members.
389
-
390
- :param role: The required role for the user. Use the enum dl.MemberRole
391
- :return: list of the project members
392
- :rtype: list
393
- """
394
- return self.projects.list_members(project=self, role=role)
1
+ from collections import namedtuple
2
+ from enum import Enum
3
+ import traceback
4
+ import logging
5
+ import attr
6
+
7
+ from .. import repositories, miscellaneous, entities
8
+ from ..services.api_client import ApiClient
9
+
10
+ logger = logging.getLogger(name='dtlpy')
11
+
12
+
13
+ class MemberRole(str, Enum):
14
+ OWNER = "owner"
15
+ DEVELOPER = "engineer"
16
+ ANNOTATOR = "annotator"
17
+ ANNOTATION_MANAGER = "annotationManager"
18
+
19
+
20
+ @attr.s()
21
+ class Project(entities.BaseEntity):
22
+ """
23
+ Project entity
24
+ """
25
+
26
+ _contributors = attr.ib(repr=False)
27
+ created_at = attr.ib()
28
+ creator = attr.ib()
29
+ id = attr.ib()
30
+ url = attr.ib()
31
+ name = attr.ib()
32
+ org = attr.ib(repr=False)
33
+ updated_at = attr.ib(repr=False)
34
+ role = attr.ib(repr=False)
35
+ account = attr.ib(repr=False)
36
+ is_blocked = attr.ib(repr=False)
37
+ archived = attr.ib(repr=False)
38
+
39
+ # name change
40
+ feature_constraints = attr.ib()
41
+
42
+ # api
43
+ _client_api = attr.ib(type=ApiClient, repr=False)
44
+
45
+ # repositories
46
+ _repositories = attr.ib(repr=False)
47
+
48
+ @property
49
+ def isBlocked(self):
50
+ return self.is_blocked
51
+
52
+ @property
53
+ def createdAt(self):
54
+ return self.created_at
55
+
56
+ @property
57
+ def updatedAt(self):
58
+ return self.updated_at
59
+
60
+ @_repositories.default
61
+ def set_repositories(self):
62
+ reps = namedtuple(
63
+ 'repositories',
64
+ 'projects triggers datasets items recipes packages codebases artifacts times_series services '
65
+ 'executions assignments tasks bots webhooks models analytics ontologies '
66
+ 'drivers pipelines feature_sets features integrations settings apps dpks compositions'
67
+ )
68
+ datasets = repositories.Datasets(client_api=self._client_api, project=self)
69
+ return reps(
70
+ projects=repositories.Projects(client_api=self._client_api),
71
+ webhooks=repositories.Webhooks(client_api=self._client_api, project=self),
72
+ items=repositories.Items(client_api=self._client_api, datasets=datasets, project=self),
73
+ recipes=repositories.Recipes(client_api=self._client_api, project=self, project_id=self.id),
74
+ datasets=datasets,
75
+ executions=repositories.Executions(client_api=self._client_api, project=self),
76
+ triggers=repositories.Triggers(client_api=self._client_api, project=self),
77
+ packages=repositories.Packages(project=self, client_api=self._client_api),
78
+ models=repositories.Models(project=self, client_api=self._client_api),
79
+ codebases=repositories.Codebases(project=self, client_api=self._client_api),
80
+ artifacts=repositories.Artifacts(project=self, client_api=self._client_api),
81
+ times_series=repositories.TimesSeries(project=self, client_api=self._client_api),
82
+ services=repositories.Services(client_api=self._client_api, project=self),
83
+ assignments=repositories.Assignments(project=self, client_api=self._client_api),
84
+ tasks=repositories.Tasks(client_api=self._client_api, project=self),
85
+ bots=repositories.Bots(client_api=self._client_api, project=self),
86
+ analytics=repositories.Analytics(client_api=self._client_api, project=self),
87
+ ontologies=repositories.Ontologies(client_api=self._client_api, project=self),
88
+ drivers=repositories.Drivers(client_api=self._client_api, project=self),
89
+ pipelines=repositories.Pipelines(client_api=self._client_api, project=self),
90
+ feature_sets=repositories.FeatureSets(client_api=self._client_api, project=self),
91
+ features=repositories.Features(client_api=self._client_api, project=self),
92
+ integrations=repositories.Integrations(client_api=self._client_api, project=self),
93
+ settings=repositories.Settings(client_api=self._client_api,
94
+ project=self,
95
+ resource=self,
96
+ resource_type=entities.PlatformEntityType.PROJECT),
97
+ apps=repositories.Apps(client_api=self._client_api, project=self),
98
+ dpks=repositories.Dpks(client_api=self._client_api, project=self),
99
+ compositions=repositories.Compositions(client_api=self._client_api, project=self)
100
+ )
101
+
102
+ @property
103
+ def drivers(self):
104
+ assert isinstance(self._repositories.drivers, repositories.Drivers)
105
+ return self._repositories.drivers
106
+
107
+ @property
108
+ def integrations(self):
109
+ assert isinstance(self._repositories.integrations, repositories.Integrations)
110
+ return self._repositories.integrations
111
+
112
+ @property
113
+ def platform_url(self):
114
+ return self._client_api._get_resource_url("projects/{}".format(self.id))
115
+
116
+ @property
117
+ def triggers(self):
118
+ assert isinstance(self._repositories.triggers, repositories.Triggers)
119
+ return self._repositories.triggers
120
+
121
+ @property
122
+ def ontologies(self):
123
+ assert isinstance(self._repositories.ontologies, repositories.Ontologies)
124
+ return self._repositories.ontologies
125
+
126
+ @property
127
+ def items(self):
128
+ assert isinstance(self._repositories.items, repositories.Items)
129
+ return self._repositories.items
130
+
131
+ @property
132
+ def recipes(self):
133
+ assert isinstance(self._repositories.recipes, repositories.Recipes)
134
+ return self._repositories.recipes
135
+
136
+ @property
137
+ def services(self):
138
+ assert isinstance(self._repositories.services, repositories.Services)
139
+ return self._repositories.services
140
+
141
+ @property
142
+ def executions(self):
143
+ assert isinstance(self._repositories.executions, repositories.Executions)
144
+ return self._repositories.executions
145
+
146
+ @property
147
+ def apps(self):
148
+ assert isinstance(self._repositories.apps, repositories.Apps)
149
+ return self._repositories.apps
150
+
151
+ @property
152
+ def dpks(self):
153
+ assert isinstance(self._repositories.dpks, repositories.Dpks)
154
+ return self._repositories.dpks
155
+
156
+ @property
157
+ def compositions(self):
158
+ assert isinstance(self._repositories.compositions, repositories.Compositions)
159
+ return self._repositories.compositions
160
+
161
+ @property
162
+ def projects(self):
163
+ assert isinstance(self._repositories.projects, repositories.Projects)
164
+ return self._repositories.projects
165
+
166
+ @property
167
+ def datasets(self):
168
+ assert isinstance(self._repositories.datasets, repositories.Datasets)
169
+ return self._repositories.datasets
170
+
171
+ @property
172
+ def pipelines(self):
173
+ assert isinstance(self._repositories.pipelines, repositories.Pipelines)
174
+ return self._repositories.pipelines
175
+
176
+ @property
177
+ def packages(self):
178
+ assert isinstance(self._repositories.packages, repositories.Packages)
179
+ return self._repositories.packages
180
+
181
+ @property
182
+ def models(self):
183
+ assert isinstance(self._repositories.models, repositories.Models)
184
+ return self._repositories.models
185
+
186
+ @property
187
+ def codebases(self):
188
+ assert isinstance(self._repositories.codebases, repositories.Codebases)
189
+ return self._repositories.codebases
190
+
191
+ @property
192
+ def webhooks(self):
193
+ assert isinstance(self._repositories.webhooks, repositories.Webhooks)
194
+ return self._repositories.webhooks
195
+
196
+ @property
197
+ def artifacts(self):
198
+ assert isinstance(self._repositories.artifacts, repositories.Artifacts)
199
+ return self._repositories.artifacts
200
+
201
+ @property
202
+ def times_series(self):
203
+ assert isinstance(self._repositories.times_series, repositories.TimesSeries)
204
+ return self._repositories.times_series
205
+
206
+ @property
207
+ def assignments(self):
208
+ assert isinstance(self._repositories.assignments, repositories.Assignments)
209
+ return self._repositories.assignments
210
+
211
+ @property
212
+ def tasks(self):
213
+ assert isinstance(self._repositories.tasks, repositories.Tasks)
214
+ return self._repositories.tasks
215
+
216
+ @property
217
+ def bots(self):
218
+ assert isinstance(self._repositories.bots, repositories.Bots)
219
+ return self._repositories.bots
220
+
221
+ @property
222
+ def analytics(self):
223
+ assert isinstance(self._repositories.analytics, repositories.Analytics)
224
+ return self._repositories.analytics
225
+
226
+ @property
227
+ def feature_sets(self):
228
+ assert isinstance(self._repositories.feature_sets, repositories.FeatureSets)
229
+ return self._repositories.feature_sets
230
+
231
+ @property
232
+ def features(self):
233
+ assert isinstance(self._repositories.features, repositories.Features)
234
+ return self._repositories.features
235
+
236
+ @property
237
+ def settings(self):
238
+ assert isinstance(self._repositories.settings, repositories.Settings)
239
+ return self._repositories.settings
240
+
241
+ @property
242
+ def contributors(self):
243
+ return miscellaneous.List([entities.User.from_json(_json=_json,
244
+ client_api=self._client_api,
245
+ project=self) for _json in self._contributors])
246
+
247
+ @staticmethod
248
+ def _protected_from_json(_json, client_api):
249
+ """
250
+ Same as from_json but with try-except to catch if error
251
+
252
+ :param dict _json: platform json
253
+ :param dl.ApiClient client_api: ApiClient entity
254
+ :return:
255
+ """
256
+ try:
257
+ project = Project.from_json(_json=_json,
258
+ client_api=client_api)
259
+ status = True
260
+ except Exception:
261
+ project = traceback.format_exc()
262
+ status = False
263
+ return status, project
264
+
265
+ @classmethod
266
+ def from_json(cls, _json, client_api, is_fetched=True):
267
+ """
268
+ Build a Project object from a json
269
+
270
+ :param bool is_fetched: is Entity fetched from Platform
271
+ :param dict _json: _json response from host
272
+ :param dl.ApiClient client_api: ApiClient entity
273
+ :return: Project object
274
+ :rtype: dtlpy.entities.project.Project
275
+ """
276
+ inst = cls(feature_constraints=_json.get('featureConstraints', None),
277
+ contributors=_json.get('contributors', None),
278
+ is_blocked=_json.get('isBlocked', None),
279
+ created_at=_json.get('createdAt', None),
280
+ updated_at=_json.get('updatedAt', None),
281
+ creator=_json.get('creator', None),
282
+ account=_json.get('account', None),
283
+ name=_json.get('name', None),
284
+ role=_json.get('role', None),
285
+ org=_json.get('org', None),
286
+ id=_json.get('id', None),
287
+ url=_json.get('url', None),
288
+ archived=_json.get('archived', None),
289
+ client_api=client_api)
290
+ inst.is_fetched = is_fetched
291
+ return inst
292
+
293
+ def to_json(self):
294
+ """
295
+ Returns platform _json format of project object
296
+
297
+ :return: platform json format of project object
298
+ :rtype: dict
299
+ """
300
+ output_dict = attr.asdict(self,
301
+ filter=attr.filters.exclude(attr.fields(Project)._client_api,
302
+ attr.fields(Project)._repositories,
303
+ attr.fields(Project).feature_constraints,
304
+ attr.fields(Project)._contributors,
305
+ attr.fields(Project).created_at,
306
+ attr.fields(Project).updated_at,
307
+ attr.fields(Project).is_blocked,
308
+ ))
309
+ output_dict['contributors'] = self._contributors
310
+ output_dict['featureConstraints'] = self.feature_constraints
311
+ output_dict['createdAt'] = self.created_at
312
+ output_dict['updatedAt'] = self.updated_at
313
+ output_dict['isBlocked'] = self.is_blocked
314
+
315
+ return output_dict
316
+
317
+ def delete(self, sure=False, really=False):
318
+ """
319
+ Delete the project forever!
320
+
321
+ :param bool sure: Are you sure you want to delete?
322
+ :param bool really: Really really sure?
323
+ :return: True if success, error if not
324
+ :rtype: bool
325
+ """
326
+ return self.projects.delete(project_id=self.id,
327
+ sure=sure,
328
+ really=really)
329
+
330
+ def update(self, system_metadata=False):
331
+ """
332
+ Update the project
333
+
334
+ :param bool system_metadata: optional - True, if you want to change metadata system
335
+ :return: Project object
336
+ :rtype: dtlpy.entities.project.Project
337
+ """
338
+ return self.projects.update(project=self, system_metadata=system_metadata)
339
+
340
+ def checkout(self):
341
+ """
342
+ Checkout (switch) to a project to work on.
343
+
344
+ """
345
+ self.projects.checkout(project=self)
346
+
347
+ def open_in_web(self):
348
+ """
349
+ Open the project in web platform
350
+
351
+ """
352
+ self._client_api._open_in_web(url=self.platform_url)
353
+
354
+ def add_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
355
+ """
356
+ Add a member to the project.
357
+
358
+ :param str email: member email
359
+ :param role: The required role for the user. Use the enum dl.MemberRole
360
+ :return: dict that represent the user
361
+ :rtype: dict
362
+ """
363
+ return self.projects.add_member(email=email, role=role, project_id=self.id)
364
+
365
+ def update_member(self, email, role: MemberRole = MemberRole.DEVELOPER):
366
+ """
367
+ Update member's information/details from the project.
368
+
369
+ :param str email: member email
370
+ :param role: The required role for the user. Use the enum dl.MemberRole
371
+ :return: dict that represent the user
372
+ :rtype: dict
373
+ """
374
+ return self.projects.update_member(email=email, role=role, project_id=self.id)
375
+
376
+ def remove_member(self, email):
377
+ """
378
+ Remove a member from the project.
379
+
380
+ :param str email: member email
381
+ :return: dict that represents the user
382
+ :rtype: dict
383
+ """
384
+ return self.projects.remove_member(email=email, project_id=self.id)
385
+
386
+ def list_members(self, role: MemberRole = None):
387
+ """
388
+ List the project members.
389
+
390
+ :param role: The required role for the user. Use the enum dl.MemberRole
391
+ :return: list of the project members
392
+ :rtype: list
393
+ """
394
+ return self.projects.list_members(project=self, role=role)