dtlpy 1.115.44__py3-none-any.whl → 1.116.6__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 (238) hide show
  1. dtlpy/__init__.py +491 -491
  2. dtlpy/__version__.py +1 -1
  3. dtlpy/assets/__init__.py +26 -26
  4. dtlpy/assets/code_server/config.yaml +2 -2
  5. dtlpy/assets/code_server/installation.sh +24 -24
  6. dtlpy/assets/code_server/launch.json +13 -13
  7. dtlpy/assets/code_server/settings.json +2 -2
  8. dtlpy/assets/main.py +53 -53
  9. dtlpy/assets/main_partial.py +18 -18
  10. dtlpy/assets/mock.json +11 -11
  11. dtlpy/assets/model_adapter.py +83 -83
  12. dtlpy/assets/package.json +61 -61
  13. dtlpy/assets/package_catalog.json +29 -29
  14. dtlpy/assets/package_gitignore +307 -307
  15. dtlpy/assets/service_runners/__init__.py +33 -33
  16. dtlpy/assets/service_runners/converter.py +96 -96
  17. dtlpy/assets/service_runners/multi_method.py +49 -49
  18. dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
  19. dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
  20. dtlpy/assets/service_runners/multi_method_item.py +52 -52
  21. dtlpy/assets/service_runners/multi_method_json.py +52 -52
  22. dtlpy/assets/service_runners/single_method.py +37 -37
  23. dtlpy/assets/service_runners/single_method_annotation.py +43 -43
  24. dtlpy/assets/service_runners/single_method_dataset.py +43 -43
  25. dtlpy/assets/service_runners/single_method_item.py +41 -41
  26. dtlpy/assets/service_runners/single_method_json.py +42 -42
  27. dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
  28. dtlpy/assets/voc_annotation_template.xml +23 -23
  29. dtlpy/caches/base_cache.py +32 -32
  30. dtlpy/caches/cache.py +473 -473
  31. dtlpy/caches/dl_cache.py +201 -201
  32. dtlpy/caches/filesystem_cache.py +89 -89
  33. dtlpy/caches/redis_cache.py +84 -84
  34. dtlpy/dlp/__init__.py +20 -20
  35. dtlpy/dlp/cli_utilities.py +367 -367
  36. dtlpy/dlp/command_executor.py +764 -764
  37. dtlpy/dlp/dlp +1 -1
  38. dtlpy/dlp/dlp.bat +1 -1
  39. dtlpy/dlp/dlp.py +128 -128
  40. dtlpy/dlp/parser.py +651 -651
  41. dtlpy/entities/__init__.py +83 -83
  42. dtlpy/entities/analytic.py +347 -347
  43. dtlpy/entities/annotation.py +1879 -1879
  44. dtlpy/entities/annotation_collection.py +699 -699
  45. dtlpy/entities/annotation_definitions/__init__.py +20 -20
  46. dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
  47. dtlpy/entities/annotation_definitions/box.py +195 -195
  48. dtlpy/entities/annotation_definitions/classification.py +67 -67
  49. dtlpy/entities/annotation_definitions/comparison.py +72 -72
  50. dtlpy/entities/annotation_definitions/cube.py +204 -204
  51. dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
  52. dtlpy/entities/annotation_definitions/description.py +32 -32
  53. dtlpy/entities/annotation_definitions/ellipse.py +124 -124
  54. dtlpy/entities/annotation_definitions/free_text.py +62 -62
  55. dtlpy/entities/annotation_definitions/gis.py +69 -69
  56. dtlpy/entities/annotation_definitions/note.py +139 -139
  57. dtlpy/entities/annotation_definitions/point.py +117 -117
  58. dtlpy/entities/annotation_definitions/polygon.py +182 -182
  59. dtlpy/entities/annotation_definitions/polyline.py +111 -111
  60. dtlpy/entities/annotation_definitions/pose.py +92 -92
  61. dtlpy/entities/annotation_definitions/ref_image.py +86 -86
  62. dtlpy/entities/annotation_definitions/segmentation.py +240 -240
  63. dtlpy/entities/annotation_definitions/subtitle.py +34 -34
  64. dtlpy/entities/annotation_definitions/text.py +85 -85
  65. dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
  66. dtlpy/entities/app.py +220 -220
  67. dtlpy/entities/app_module.py +107 -107
  68. dtlpy/entities/artifact.py +174 -174
  69. dtlpy/entities/assignment.py +399 -399
  70. dtlpy/entities/base_entity.py +214 -214
  71. dtlpy/entities/bot.py +113 -113
  72. dtlpy/entities/codebase.py +292 -292
  73. dtlpy/entities/collection.py +38 -38
  74. dtlpy/entities/command.py +169 -169
  75. dtlpy/entities/compute.py +449 -449
  76. dtlpy/entities/dataset.py +1299 -1299
  77. dtlpy/entities/directory_tree.py +44 -44
  78. dtlpy/entities/dpk.py +470 -470
  79. dtlpy/entities/driver.py +235 -235
  80. dtlpy/entities/execution.py +397 -397
  81. dtlpy/entities/feature.py +124 -124
  82. dtlpy/entities/feature_set.py +145 -145
  83. dtlpy/entities/filters.py +798 -798
  84. dtlpy/entities/gis_item.py +107 -107
  85. dtlpy/entities/integration.py +184 -184
  86. dtlpy/entities/item.py +959 -959
  87. dtlpy/entities/label.py +123 -123
  88. dtlpy/entities/links.py +85 -85
  89. dtlpy/entities/message.py +175 -175
  90. dtlpy/entities/model.py +684 -684
  91. dtlpy/entities/node.py +1005 -1005
  92. dtlpy/entities/ontology.py +810 -803
  93. dtlpy/entities/organization.py +287 -287
  94. dtlpy/entities/package.py +657 -657
  95. dtlpy/entities/package_defaults.py +5 -5
  96. dtlpy/entities/package_function.py +185 -185
  97. dtlpy/entities/package_module.py +113 -113
  98. dtlpy/entities/package_slot.py +118 -118
  99. dtlpy/entities/paged_entities.py +299 -299
  100. dtlpy/entities/pipeline.py +624 -624
  101. dtlpy/entities/pipeline_execution.py +279 -279
  102. dtlpy/entities/project.py +394 -394
  103. dtlpy/entities/prompt_item.py +505 -505
  104. dtlpy/entities/recipe.py +301 -301
  105. dtlpy/entities/reflect_dict.py +102 -102
  106. dtlpy/entities/resource_execution.py +138 -138
  107. dtlpy/entities/service.py +963 -963
  108. dtlpy/entities/service_driver.py +117 -117
  109. dtlpy/entities/setting.py +294 -294
  110. dtlpy/entities/task.py +495 -495
  111. dtlpy/entities/time_series.py +143 -143
  112. dtlpy/entities/trigger.py +426 -426
  113. dtlpy/entities/user.py +118 -118
  114. dtlpy/entities/webhook.py +124 -124
  115. dtlpy/examples/__init__.py +19 -19
  116. dtlpy/examples/add_labels.py +135 -135
  117. dtlpy/examples/add_metadata_to_item.py +21 -21
  118. dtlpy/examples/annotate_items_using_model.py +65 -65
  119. dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
  120. dtlpy/examples/annotations_convert_to_voc.py +9 -9
  121. dtlpy/examples/annotations_convert_to_yolo.py +9 -9
  122. dtlpy/examples/convert_annotation_types.py +51 -51
  123. dtlpy/examples/converter.py +143 -143
  124. dtlpy/examples/copy_annotations.py +22 -22
  125. dtlpy/examples/copy_folder.py +31 -31
  126. dtlpy/examples/create_annotations.py +51 -51
  127. dtlpy/examples/create_video_annotations.py +83 -83
  128. dtlpy/examples/delete_annotations.py +26 -26
  129. dtlpy/examples/filters.py +113 -113
  130. dtlpy/examples/move_item.py +23 -23
  131. dtlpy/examples/play_video_annotation.py +13 -13
  132. dtlpy/examples/show_item_and_mask.py +53 -53
  133. dtlpy/examples/triggers.py +49 -49
  134. dtlpy/examples/upload_batch_of_items.py +20 -20
  135. dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
  136. dtlpy/examples/upload_items_with_modalities.py +43 -43
  137. dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
  138. dtlpy/examples/upload_yolo_format_annotations.py +70 -70
  139. dtlpy/exceptions.py +125 -125
  140. dtlpy/miscellaneous/__init__.py +20 -20
  141. dtlpy/miscellaneous/dict_differ.py +95 -95
  142. dtlpy/miscellaneous/git_utils.py +217 -217
  143. dtlpy/miscellaneous/json_utils.py +14 -14
  144. dtlpy/miscellaneous/list_print.py +105 -105
  145. dtlpy/miscellaneous/zipping.py +130 -130
  146. dtlpy/ml/__init__.py +20 -20
  147. dtlpy/ml/base_feature_extractor_adapter.py +27 -27
  148. dtlpy/ml/base_model_adapter.py +1257 -1230
  149. dtlpy/ml/metrics.py +461 -461
  150. dtlpy/ml/predictions_utils.py +274 -274
  151. dtlpy/ml/summary_writer.py +57 -57
  152. dtlpy/ml/train_utils.py +60 -60
  153. dtlpy/new_instance.py +252 -252
  154. dtlpy/repositories/__init__.py +56 -56
  155. dtlpy/repositories/analytics.py +85 -85
  156. dtlpy/repositories/annotations.py +916 -916
  157. dtlpy/repositories/apps.py +383 -383
  158. dtlpy/repositories/artifacts.py +452 -452
  159. dtlpy/repositories/assignments.py +599 -599
  160. dtlpy/repositories/bots.py +213 -213
  161. dtlpy/repositories/codebases.py +559 -559
  162. dtlpy/repositories/collections.py +332 -332
  163. dtlpy/repositories/commands.py +152 -152
  164. dtlpy/repositories/compositions.py +61 -61
  165. dtlpy/repositories/computes.py +439 -439
  166. dtlpy/repositories/datasets.py +1504 -1504
  167. dtlpy/repositories/downloader.py +976 -923
  168. dtlpy/repositories/dpks.py +433 -433
  169. dtlpy/repositories/drivers.py +482 -482
  170. dtlpy/repositories/executions.py +815 -815
  171. dtlpy/repositories/feature_sets.py +226 -226
  172. dtlpy/repositories/features.py +255 -255
  173. dtlpy/repositories/integrations.py +484 -484
  174. dtlpy/repositories/items.py +912 -912
  175. dtlpy/repositories/messages.py +94 -94
  176. dtlpy/repositories/models.py +1000 -1000
  177. dtlpy/repositories/nodes.py +80 -80
  178. dtlpy/repositories/ontologies.py +511 -511
  179. dtlpy/repositories/organizations.py +525 -525
  180. dtlpy/repositories/packages.py +1941 -1941
  181. dtlpy/repositories/pipeline_executions.py +451 -451
  182. dtlpy/repositories/pipelines.py +640 -640
  183. dtlpy/repositories/projects.py +539 -539
  184. dtlpy/repositories/recipes.py +419 -399
  185. dtlpy/repositories/resource_executions.py +137 -137
  186. dtlpy/repositories/schema.py +120 -120
  187. dtlpy/repositories/service_drivers.py +213 -213
  188. dtlpy/repositories/services.py +1704 -1704
  189. dtlpy/repositories/settings.py +339 -339
  190. dtlpy/repositories/tasks.py +1477 -1477
  191. dtlpy/repositories/times_series.py +278 -278
  192. dtlpy/repositories/triggers.py +536 -536
  193. dtlpy/repositories/upload_element.py +257 -257
  194. dtlpy/repositories/uploader.py +661 -661
  195. dtlpy/repositories/webhooks.py +249 -249
  196. dtlpy/services/__init__.py +22 -22
  197. dtlpy/services/aihttp_retry.py +131 -131
  198. dtlpy/services/api_client.py +1785 -1785
  199. dtlpy/services/api_reference.py +40 -40
  200. dtlpy/services/async_utils.py +133 -133
  201. dtlpy/services/calls_counter.py +44 -44
  202. dtlpy/services/check_sdk.py +68 -68
  203. dtlpy/services/cookie.py +115 -115
  204. dtlpy/services/create_logger.py +156 -156
  205. dtlpy/services/events.py +84 -84
  206. dtlpy/services/logins.py +235 -235
  207. dtlpy/services/reporter.py +256 -256
  208. dtlpy/services/service_defaults.py +91 -91
  209. dtlpy/utilities/__init__.py +20 -20
  210. dtlpy/utilities/annotations/__init__.py +16 -16
  211. dtlpy/utilities/annotations/annotation_converters.py +269 -269
  212. dtlpy/utilities/base_package_runner.py +285 -264
  213. dtlpy/utilities/converter.py +1650 -1650
  214. dtlpy/utilities/dataset_generators/__init__.py +1 -1
  215. dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
  216. dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
  217. dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
  218. dtlpy/utilities/local_development/__init__.py +1 -1
  219. dtlpy/utilities/local_development/local_session.py +179 -179
  220. dtlpy/utilities/reports/__init__.py +2 -2
  221. dtlpy/utilities/reports/figures.py +343 -343
  222. dtlpy/utilities/reports/report.py +71 -71
  223. dtlpy/utilities/videos/__init__.py +17 -17
  224. dtlpy/utilities/videos/video_player.py +598 -598
  225. dtlpy/utilities/videos/videos.py +470 -470
  226. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
  227. dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
  228. {dtlpy-1.115.44.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
  229. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -186
  230. dtlpy-1.116.6.dist-info/RECORD +239 -0
  231. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
  232. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
  233. tests/features/environment.py +551 -551
  234. dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
  235. dtlpy-1.115.44.data/scripts/dlp.bat +0 -2
  236. dtlpy-1.115.44.dist-info/RECORD +0 -240
  237. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
  238. {dtlpy-1.115.44.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
@@ -1,249 +1,249 @@
1
- import logging
2
- from urllib.parse import urlencode
3
- from .. import exceptions, entities, miscellaneous
4
- from ..services.api_client import ApiClient
5
-
6
- logger = logging.getLogger(name='dtlpy')
7
-
8
-
9
- class Webhooks:
10
- """
11
- Webhooks repository
12
- """
13
-
14
- def __init__(self,
15
- client_api: ApiClient,
16
- project: entities.Project = None):
17
- self._project = project
18
- self._client_api = client_api
19
- self._url = '/webhooks'
20
-
21
- ############
22
- # entities #
23
- ############
24
- @property
25
- def project(self) -> entities.Project:
26
- if self._project is None:
27
- raise exceptions.PlatformException(
28
- error='2001',
29
- message='Missing "project". need to set a Project entity or use project.webhooks repository')
30
- assert isinstance(self._project, entities.Project)
31
- return self._project
32
-
33
- @project.setter
34
- def project(self, project: entities.Project):
35
- if not isinstance(project, entities.Project):
36
- raise ValueError('Must input a valid Project entity')
37
- self._project = project
38
-
39
- ###########
40
- # methods #
41
- ###########
42
- def create(self,
43
- name: str,
44
- project_id: str = None,
45
- http_method=None,
46
- hook_url=None,
47
- project: entities.Project = None) -> entities.Webhook:
48
- """
49
- Create web hook entity
50
-
51
- :param name:
52
- :param project_id:
53
- :param http_method:
54
- :param hook_url:
55
- :param project:
56
- :return:
57
- """
58
- if project is None:
59
- project = self._project
60
-
61
- if project_id is None and project is None:
62
- raise exceptions.PlatformException('400', 'Must provide project or project id')
63
-
64
- if project_id is None:
65
- project_id = project.id
66
-
67
- # payload
68
- payload = {
69
- 'name': name,
70
- 'httpMethod': http_method,
71
- 'hookUrl': hook_url,
72
- 'project': project_id
73
- }
74
-
75
- # request
76
- success, response = self._client_api.gen_request(req_type='post',
77
- path=self._url,
78
- json_req=payload)
79
-
80
- # exception handling
81
- if not success:
82
- raise exceptions.PlatformException(response)
83
-
84
- # return entity
85
- return entities.Webhook.from_json(_json=response.json(),
86
- client_api=self._client_api,
87
- project=project)
88
-
89
- def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
90
- """
91
- List web hooks
92
-
93
- :param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
94
- :return: Paged entity
95
- :rtype: dtlpy.entities.paged_entities.PagedEntities
96
- """
97
- if filters is None:
98
- filters = entities.Filters(resource=entities.FiltersResource.WEBHOOK)
99
- if self._project is not None:
100
- filters.add(field='projectId', values=self._project.id)
101
- # assert type filters
102
- elif not isinstance(filters, entities.Filters):
103
- raise exceptions.PlatformException(error='400',
104
- message='Unknown filters type: {!r}'.format(type(filters)))
105
-
106
- if filters.resource != entities.FiltersResource.WEBHOOK:
107
- raise exceptions.PlatformException(
108
- error='400',
109
- message='Filters resource must to be FiltersResource.WEBHOOK. Got: {!r}'.format(filters.resource))
110
-
111
- paged = entities.PagedEntities(items_repository=self,
112
- filters=filters,
113
- page_offset=filters.page,
114
- page_size=filters.page_size,
115
- client_api=self._client_api)
116
- paged.get_page()
117
- return paged
118
-
119
- def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Webhook]:
120
- # handle execution
121
- pool = self._client_api.thread_pools(pool_name='entity.create')
122
- jobs = [None for _ in range(len(response_items))]
123
- # return execution list
124
- for i_item, item in enumerate(response_items):
125
- jobs[i_item] = pool.submit(entities.Webhook.from_json,
126
- **{'client_api': self._client_api,
127
- '_json': item,
128
- 'project': self._project})
129
-
130
- # get all results
131
- items = miscellaneous.List([j.result() for j in jobs])
132
- return items
133
-
134
- def _list(self, filters: entities.Filters):
135
- """
136
- List web hooks
137
-
138
- :return:
139
- """
140
-
141
- query_params = {
142
- 'pageOffset': filters.page,
143
- 'pageSize': filters.page_size
144
- }
145
-
146
- url = self._url + '?{}'.format(
147
- urlencode({key: val for key, val in query_params.items() if val is not None}, doseq=True))
148
-
149
- # request
150
- success, response = self._client_api.gen_request(req_type='get',
151
- path=url)
152
-
153
- if not success:
154
- raise exceptions.PlatformException(response)
155
-
156
- return response.json()
157
-
158
- def get(self, webhook_id=None, webhook_name=None) -> entities.Webhook:
159
- """
160
- Get Web hook
161
-
162
- :param webhook_id:
163
- :param webhook_name:
164
- :return: Web hook execution object
165
- """
166
- if webhook_id is None and webhook_name is None:
167
- raise exceptions.PlatformException('400', 'Must provide webhook_id or webhook_name id')
168
- elif webhook_id is None:
169
- webhooks_pages = self.list(
170
- filters=entities.Filters(field='name', values=webhook_name, resource=entities.FiltersResource.WEBHOOK))
171
- if webhooks_pages.items_count == 0:
172
- raise exceptions.PlatformException('404', 'Not found: web hook: {}'.format(webhook_name))
173
- elif webhooks_pages.items_count > 1:
174
- raise exceptions.PlatformException('404',
175
- 'More than one webhooks found: web hook: {}'.format(webhook_name))
176
- else:
177
- webhook = webhooks_pages.items[0]
178
- else:
179
- success, response = self._client_api.gen_request(
180
- req_type="get",
181
- path="{}/{}".format(self._url, webhook_id)
182
- )
183
-
184
- # exception handling
185
- if not success:
186
- raise exceptions.PlatformException(response)
187
-
188
- # return entity
189
- webhook = entities.Webhook.from_json(client_api=self._client_api,
190
- _json=response.json(),
191
- project=self._project)
192
- # verify input webhook name is same as the given id
193
- if webhook_name is not None and webhook.name != webhook_name:
194
- logger.warning(
195
- "Mismatch found in webhooks.get: webhook_name is different then webhook.name:"
196
- " {!r} != {!r}".format(
197
- webhook_name,
198
- webhook.name))
199
-
200
- return webhook
201
-
202
- def delete(self, webhook_id=None, webhook_name=None):
203
- """
204
- Delete Trigger object
205
-
206
- :param webhook_id:
207
- :param webhook_name:
208
- :return: True
209
- """
210
- if webhook_id is None:
211
- if webhook_name is None:
212
- raise exceptions.PlatformException('400', 'Must provide either webhook name or webhook id')
213
- else:
214
- webhook_id = self.get(webhook_name=webhook_name).id
215
-
216
- # request
217
- success, response = self._client_api.gen_request(
218
- req_type="delete",
219
- path="{}/{}".format(self._url, webhook_id)
220
- )
221
- # exception handling
222
- if not success:
223
- raise exceptions.PlatformException(response)
224
- return True
225
-
226
- def update(self, webhook: entities.Webhook) -> entities.Webhook:
227
- """
228
-
229
- :param webhook: Webhook entity
230
- :return: Webhook entity
231
- """
232
- assert isinstance(webhook, entities.Webhook)
233
-
234
- # payload
235
- payload = webhook.to_json()
236
-
237
- # request
238
- success, response = self._client_api.gen_request(req_type='patch',
239
- path='{}/{}'.format(self._url, webhook.id),
240
- json_req=payload)
241
-
242
- # exception handling
243
- if not success:
244
- raise exceptions.PlatformException(response)
245
-
246
- # return entity
247
- return entities.Webhook.from_json(_json=response.json(),
248
- client_api=self._client_api,
249
- project=self._project)
1
+ import logging
2
+ from urllib.parse import urlencode
3
+ from .. import exceptions, entities, miscellaneous
4
+ from ..services.api_client import ApiClient
5
+
6
+ logger = logging.getLogger(name='dtlpy')
7
+
8
+
9
+ class Webhooks:
10
+ """
11
+ Webhooks repository
12
+ """
13
+
14
+ def __init__(self,
15
+ client_api: ApiClient,
16
+ project: entities.Project = None):
17
+ self._project = project
18
+ self._client_api = client_api
19
+ self._url = '/webhooks'
20
+
21
+ ############
22
+ # entities #
23
+ ############
24
+ @property
25
+ def project(self) -> entities.Project:
26
+ if self._project is None:
27
+ raise exceptions.PlatformException(
28
+ error='2001',
29
+ message='Missing "project". need to set a Project entity or use project.webhooks repository')
30
+ assert isinstance(self._project, entities.Project)
31
+ return self._project
32
+
33
+ @project.setter
34
+ def project(self, project: entities.Project):
35
+ if not isinstance(project, entities.Project):
36
+ raise ValueError('Must input a valid Project entity')
37
+ self._project = project
38
+
39
+ ###########
40
+ # methods #
41
+ ###########
42
+ def create(self,
43
+ name: str,
44
+ project_id: str = None,
45
+ http_method=None,
46
+ hook_url=None,
47
+ project: entities.Project = None) -> entities.Webhook:
48
+ """
49
+ Create web hook entity
50
+
51
+ :param name:
52
+ :param project_id:
53
+ :param http_method:
54
+ :param hook_url:
55
+ :param project:
56
+ :return:
57
+ """
58
+ if project is None:
59
+ project = self._project
60
+
61
+ if project_id is None and project is None:
62
+ raise exceptions.PlatformException('400', 'Must provide project or project id')
63
+
64
+ if project_id is None:
65
+ project_id = project.id
66
+
67
+ # payload
68
+ payload = {
69
+ 'name': name,
70
+ 'httpMethod': http_method,
71
+ 'hookUrl': hook_url,
72
+ 'project': project_id
73
+ }
74
+
75
+ # request
76
+ success, response = self._client_api.gen_request(req_type='post',
77
+ path=self._url,
78
+ json_req=payload)
79
+
80
+ # exception handling
81
+ if not success:
82
+ raise exceptions.PlatformException(response)
83
+
84
+ # return entity
85
+ return entities.Webhook.from_json(_json=response.json(),
86
+ client_api=self._client_api,
87
+ project=project)
88
+
89
+ def list(self, filters: entities.Filters = None) -> entities.PagedEntities:
90
+ """
91
+ List web hooks
92
+
93
+ :param dtlpy.entities.filters.Filters filters: Filters entity or a dictionary containing filters parameters
94
+ :return: Paged entity
95
+ :rtype: dtlpy.entities.paged_entities.PagedEntities
96
+ """
97
+ if filters is None:
98
+ filters = entities.Filters(resource=entities.FiltersResource.WEBHOOK)
99
+ if self._project is not None:
100
+ filters.add(field='projectId', values=self._project.id)
101
+ # assert type filters
102
+ elif not isinstance(filters, entities.Filters):
103
+ raise exceptions.PlatformException(error='400',
104
+ message='Unknown filters type: {!r}'.format(type(filters)))
105
+
106
+ if filters.resource != entities.FiltersResource.WEBHOOK:
107
+ raise exceptions.PlatformException(
108
+ error='400',
109
+ message='Filters resource must to be FiltersResource.WEBHOOK. Got: {!r}'.format(filters.resource))
110
+
111
+ paged = entities.PagedEntities(items_repository=self,
112
+ filters=filters,
113
+ page_offset=filters.page,
114
+ page_size=filters.page_size,
115
+ client_api=self._client_api)
116
+ paged.get_page()
117
+ return paged
118
+
119
+ def _build_entities_from_response(self, response_items) -> miscellaneous.List[entities.Webhook]:
120
+ # handle execution
121
+ pool = self._client_api.thread_pools(pool_name='entity.create')
122
+ jobs = [None for _ in range(len(response_items))]
123
+ # return execution list
124
+ for i_item, item in enumerate(response_items):
125
+ jobs[i_item] = pool.submit(entities.Webhook.from_json,
126
+ **{'client_api': self._client_api,
127
+ '_json': item,
128
+ 'project': self._project})
129
+
130
+ # get all results
131
+ items = miscellaneous.List([j.result() for j in jobs])
132
+ return items
133
+
134
+ def _list(self, filters: entities.Filters):
135
+ """
136
+ List web hooks
137
+
138
+ :return:
139
+ """
140
+
141
+ query_params = {
142
+ 'pageOffset': filters.page,
143
+ 'pageSize': filters.page_size
144
+ }
145
+
146
+ url = self._url + '?{}'.format(
147
+ urlencode({key: val for key, val in query_params.items() if val is not None}, doseq=True))
148
+
149
+ # request
150
+ success, response = self._client_api.gen_request(req_type='get',
151
+ path=url)
152
+
153
+ if not success:
154
+ raise exceptions.PlatformException(response)
155
+
156
+ return response.json()
157
+
158
+ def get(self, webhook_id=None, webhook_name=None) -> entities.Webhook:
159
+ """
160
+ Get Web hook
161
+
162
+ :param webhook_id:
163
+ :param webhook_name:
164
+ :return: Web hook execution object
165
+ """
166
+ if webhook_id is None and webhook_name is None:
167
+ raise exceptions.PlatformException('400', 'Must provide webhook_id or webhook_name id')
168
+ elif webhook_id is None:
169
+ webhooks_pages = self.list(
170
+ filters=entities.Filters(field='name', values=webhook_name, resource=entities.FiltersResource.WEBHOOK))
171
+ if webhooks_pages.items_count == 0:
172
+ raise exceptions.PlatformException('404', 'Not found: web hook: {}'.format(webhook_name))
173
+ elif webhooks_pages.items_count > 1:
174
+ raise exceptions.PlatformException('404',
175
+ 'More than one webhooks found: web hook: {}'.format(webhook_name))
176
+ else:
177
+ webhook = webhooks_pages.items[0]
178
+ else:
179
+ success, response = self._client_api.gen_request(
180
+ req_type="get",
181
+ path="{}/{}".format(self._url, webhook_id)
182
+ )
183
+
184
+ # exception handling
185
+ if not success:
186
+ raise exceptions.PlatformException(response)
187
+
188
+ # return entity
189
+ webhook = entities.Webhook.from_json(client_api=self._client_api,
190
+ _json=response.json(),
191
+ project=self._project)
192
+ # verify input webhook name is same as the given id
193
+ if webhook_name is not None and webhook.name != webhook_name:
194
+ logger.warning(
195
+ "Mismatch found in webhooks.get: webhook_name is different then webhook.name:"
196
+ " {!r} != {!r}".format(
197
+ webhook_name,
198
+ webhook.name))
199
+
200
+ return webhook
201
+
202
+ def delete(self, webhook_id=None, webhook_name=None):
203
+ """
204
+ Delete Trigger object
205
+
206
+ :param webhook_id:
207
+ :param webhook_name:
208
+ :return: True
209
+ """
210
+ if webhook_id is None:
211
+ if webhook_name is None:
212
+ raise exceptions.PlatformException('400', 'Must provide either webhook name or webhook id')
213
+ else:
214
+ webhook_id = self.get(webhook_name=webhook_name).id
215
+
216
+ # request
217
+ success, response = self._client_api.gen_request(
218
+ req_type="delete",
219
+ path="{}/{}".format(self._url, webhook_id)
220
+ )
221
+ # exception handling
222
+ if not success:
223
+ raise exceptions.PlatformException(response)
224
+ return True
225
+
226
+ def update(self, webhook: entities.Webhook) -> entities.Webhook:
227
+ """
228
+
229
+ :param webhook: Webhook entity
230
+ :return: Webhook entity
231
+ """
232
+ assert isinstance(webhook, entities.Webhook)
233
+
234
+ # payload
235
+ payload = webhook.to_json()
236
+
237
+ # request
238
+ success, response = self._client_api.gen_request(req_type='patch',
239
+ path='{}/{}'.format(self._url, webhook.id),
240
+ json_req=payload)
241
+
242
+ # exception handling
243
+ if not success:
244
+ raise exceptions.PlatformException(response)
245
+
246
+ # return entity
247
+ return entities.Webhook.from_json(_json=response.json(),
248
+ client_api=self._client_api,
249
+ project=self._project)
@@ -1,22 +1,22 @@
1
- #! /usr/bin/env python3
2
- # This file is part of DTLPY.
3
- #
4
- # DTLPY is free software: you can redistribute it and/or modify
5
- # it under the terms of the GNU General Public License as published by
6
- # the Free Software Foundation, either version 3 of the License, or
7
- # (at your option) any later version.
8
- #
9
- # DTLPY is distributed in the hope that it will be useful,
10
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- # GNU General Public License for more details.
13
- #
14
- # You should have received a copy of the GNU General Public License
15
- # along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
16
- from .async_utils import AsyncResponse, AsyncThreadEventLoop
17
- from .events import Events
18
- from .cookie import CookieIO
19
- from .create_logger import DataloopLogger, DtlpyFilter
20
- from .reporter import Reporter
21
- from . import service_defaults
22
-
1
+ #! /usr/bin/env python3
2
+ # This file is part of DTLPY.
3
+ #
4
+ # DTLPY is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # DTLPY is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with DTLPY. If not, see <http://www.gnu.org/licenses/>.
16
+ from .async_utils import AsyncResponse, AsyncThreadEventLoop
17
+ from .events import Events
18
+ from .cookie import CookieIO
19
+ from .create_logger import DataloopLogger, DtlpyFilter
20
+ from .reporter import Reporter
21
+ from . import service_defaults
22
+