frameio 0.0.28__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 (385) hide show
  1. frameio/__init__.py +1158 -0
  2. frameio/account_permissions/__init__.py +4 -0
  3. frameio/account_permissions/client.py +193 -0
  4. frameio/account_permissions/raw_client.py +333 -0
  5. frameio/accounts/__init__.py +4 -0
  6. frameio/accounts/client.py +162 -0
  7. frameio/accounts/raw_client.py +309 -0
  8. frameio/client.py +439 -0
  9. frameio/comments/__init__.py +38 -0
  10. frameio/comments/client.py +654 -0
  11. frameio/comments/raw_client.py +1316 -0
  12. frameio/comments/types/__init__.py +40 -0
  13. frameio/comments/types/comments_show_request_include.py +5 -0
  14. frameio/comments/types/create_comment_params_data.py +33 -0
  15. frameio/comments/types/update_comment_params_data.py +33 -0
  16. frameio/core/__init__.py +122 -0
  17. frameio/core/api_error.py +23 -0
  18. frameio/core/client_wrapper.py +95 -0
  19. frameio/core/custom_pagination.py +152 -0
  20. frameio/core/datetime_utils.py +28 -0
  21. frameio/core/file.py +67 -0
  22. frameio/core/force_multipart.py +18 -0
  23. frameio/core/http_client.py +663 -0
  24. frameio/core/http_response.py +55 -0
  25. frameio/core/http_sse/__init__.py +42 -0
  26. frameio/core/http_sse/_api.py +112 -0
  27. frameio/core/http_sse/_decoders.py +61 -0
  28. frameio/core/http_sse/_exceptions.py +7 -0
  29. frameio/core/http_sse/_models.py +17 -0
  30. frameio/core/jsonable_encoder.py +100 -0
  31. frameio/core/pagination.py +82 -0
  32. frameio/core/pydantic_utilities.py +361 -0
  33. frameio/core/query_encoder.py +58 -0
  34. frameio/core/remove_none_from_dict.py +11 -0
  35. frameio/core/request_options.py +35 -0
  36. frameio/core/serialization.py +276 -0
  37. frameio/core/unchecked_base_model.py +376 -0
  38. frameio/environment.py +7 -0
  39. frameio/errors/__init__.py +53 -0
  40. frameio/errors/bad_request_error.py +11 -0
  41. frameio/errors/forbidden_error.py +11 -0
  42. frameio/errors/not_found_error.py +11 -0
  43. frameio/errors/too_many_requests_error.py +11 -0
  44. frameio/errors/unauthorized_error.py +11 -0
  45. frameio/errors/unprocessable_entity_error.py +10 -0
  46. frameio/files/__init__.py +58 -0
  47. frameio/files/client.py +1171 -0
  48. frameio/files/raw_client.py +2517 -0
  49. frameio/files/types/__init__.py +56 -0
  50. frameio/files/types/file_copy_params_data.py +15 -0
  51. frameio/files/types/file_create_local_upload_params_data.py +20 -0
  52. frameio/files/types/file_create_params_data.py +31 -0
  53. frameio/files/types/file_create_remote_upload_params_data.py +20 -0
  54. frameio/files/types/file_move_params_data.py +15 -0
  55. frameio/files/types/file_update_params_data.py +15 -0
  56. frameio/files/types/files_copy_request_copy_comments.py +5 -0
  57. frameio/folders/__init__.py +39 -0
  58. frameio/folders/client.py +1004 -0
  59. frameio/folders/raw_client.py +2074 -0
  60. frameio/folders/types/__init__.py +42 -0
  61. frameio/folders/types/folder_copy_params_data.py +15 -0
  62. frameio/folders/types/folder_create_params_data.py +15 -0
  63. frameio/folders/types/folder_move_params_data.py +15 -0
  64. frameio/folders/types/folder_update_params_data.py +15 -0
  65. frameio/metadata/__init__.py +37 -0
  66. frameio/metadata/client.py +293 -0
  67. frameio/metadata/raw_client.py +509 -0
  68. frameio/metadata/types/__init__.py +38 -0
  69. frameio/metadata/types/bulk_update_metadata_params_data.py +23 -0
  70. frameio/metadata/types/bulk_update_metadata_params_data_values_item.py +13 -0
  71. frameio/metadata_fields/__init__.py +103 -0
  72. frameio/metadata_fields/client.py +536 -0
  73. frameio/metadata_fields/raw_client.py +996 -0
  74. frameio/metadata_fields/types/__init__.py +105 -0
  75. frameio/metadata_fields/types/create_field_definition_params_data.py +112 -0
  76. frameio/metadata_fields/types/update_field_definition_params_data.py +118 -0
  77. frameio/project_permissions/__init__.py +4 -0
  78. frameio/project_permissions/client.py +426 -0
  79. frameio/project_permissions/raw_client.py +824 -0
  80. frameio/projects/__init__.py +38 -0
  81. frameio/projects/client.py +604 -0
  82. frameio/projects/raw_client.py +1286 -0
  83. frameio/projects/types/__init__.py +40 -0
  84. frameio/projects/types/project_params_data.py +20 -0
  85. frameio/projects/types/project_update_params_data.py +26 -0
  86. frameio/projects/types/project_update_params_data_status.py +5 -0
  87. frameio/py.typed +0 -0
  88. frameio/shares/__init__.py +64 -0
  89. frameio/shares/client.py +1217 -0
  90. frameio/shares/raw_client.py +2511 -0
  91. frameio/shares/types/__init__.py +61 -0
  92. frameio/shares/types/add_asset_params_data.py +15 -0
  93. frameio/shares/types/add_reviewers_to_share_params_data.py +18 -0
  94. frameio/shares/types/add_reviewers_to_share_params_data_reviewers.py +27 -0
  95. frameio/shares/types/create_share_params_data.py +26 -0
  96. frameio/shares/types/remove_reviewer_params_data.py +13 -0
  97. frameio/shares/types/remove_reviewer_params_data_reviewers.py +27 -0
  98. frameio/shares/types/update_share_params_data.py +34 -0
  99. frameio/shares/types/update_share_params_data_access.py +5 -0
  100. frameio/types/__init__.py +983 -0
  101. frameio/types/account.py +70 -0
  102. frameio/types/account_roles_item.py +5 -0
  103. frameio/types/account_user_role.py +23 -0
  104. frameio/types/account_user_role_role.py +5 -0
  105. frameio/types/account_user_roles_response.py +27 -0
  106. frameio/types/accounts_response.py +23 -0
  107. frameio/types/add_asset_response.py +13 -0
  108. frameio/types/add_asset_response_data.py +15 -0
  109. frameio/types/asset_common.py +48 -0
  110. frameio/types/asset_common_type.py +5 -0
  111. frameio/types/asset_common_with_includes.py +58 -0
  112. frameio/types/asset_common_with_includes_type.py +5 -0
  113. frameio/types/asset_include.py +5 -0
  114. frameio/types/asset_share_params.py +39 -0
  115. frameio/types/asset_share_params_access.py +5 -0
  116. frameio/types/asset_with_includes.py +76 -0
  117. frameio/types/assets_with_includes_response.py +23 -0
  118. frameio/types/bad_request.py +13 -0
  119. frameio/types/bad_request_errors_item.py +15 -0
  120. frameio/types/bad_request_errors_item_source.py +12 -0
  121. frameio/types/boolean_value.py +12 -0
  122. frameio/types/children_type.py +3 -0
  123. frameio/types/comment.py +59 -0
  124. frameio/types/comment_include.py +5 -0
  125. frameio/types/comment_response.py +13 -0
  126. frameio/types/comment_with_includes.py +17 -0
  127. frameio/types/comment_with_includes_response.py +13 -0
  128. frameio/types/comments_with_includes_response.py +23 -0
  129. frameio/types/date_definition.py +49 -0
  130. frameio/types/date_definition_field_configuration.py +21 -0
  131. frameio/types/date_definition_field_configuration_display_format.py +7 -0
  132. frameio/types/date_definition_field_configuration_time_format.py +5 -0
  133. frameio/types/date_definition_field_type.py +10 -0
  134. frameio/types/date_definition_params.py +17 -0
  135. frameio/types/date_definition_params_field_configuration.py +23 -0
  136. frameio/types/date_definition_params_field_configuration_display_format.py +7 -0
  137. frameio/types/date_definition_params_field_configuration_time_format.py +7 -0
  138. frameio/types/date_definition_with_includes.py +13 -0
  139. frameio/types/date_value.py +12 -0
  140. frameio/types/email.py +3 -0
  141. frameio/types/empty_json.py +5 -0
  142. frameio/types/field_definition.py +167 -0
  143. frameio/types/field_definition_include.py +5 -0
  144. frameio/types/field_definition_response.py +13 -0
  145. frameio/types/field_definition_with_includes.py +178 -0
  146. frameio/types/field_definitions_with_includes_response.py +27 -0
  147. frameio/types/field_value_common.py +29 -0
  148. frameio/types/file.py +60 -0
  149. frameio/types/file_copy_response.py +13 -0
  150. frameio/types/file_remote_upload_response.py +17 -0
  151. frameio/types/file_response.py +13 -0
  152. frameio/types/file_status.py +5 -0
  153. frameio/types/file_upload_status.py +41 -0
  154. frameio/types/file_upload_status_response.py +13 -0
  155. frameio/types/file_with_includes.py +25 -0
  156. frameio/types/file_with_includes_response.py +13 -0
  157. frameio/types/file_with_includes_status.py +5 -0
  158. frameio/types/file_with_media_links_include.py +19 -0
  159. frameio/types/file_with_upload_urls.py +16 -0
  160. frameio/types/file_with_upload_urls_response.py +13 -0
  161. frameio/types/folder.py +15 -0
  162. frameio/types/folder_copy_response.py +13 -0
  163. frameio/types/folder_response.py +13 -0
  164. frameio/types/folder_with_includes.py +63 -0
  165. frameio/types/folder_with_includes_response.py +13 -0
  166. frameio/types/folders_with_includes_response.py +23 -0
  167. frameio/types/forbidden.py +13 -0
  168. frameio/types/forbidden_errors_item.py +15 -0
  169. frameio/types/forbidden_errors_item_source.py +12 -0
  170. frameio/types/include.py +5 -0
  171. frameio/types/include_total_count.py +3 -0
  172. frameio/types/integer_value.py +12 -0
  173. frameio/types/json_error_response.py +13 -0
  174. frameio/types/json_error_response_errors_item.py +15 -0
  175. frameio/types/json_error_response_errors_item_source.py +12 -0
  176. frameio/types/links.py +22 -0
  177. frameio/types/long_text_definition.py +49 -0
  178. frameio/types/long_text_definition_field_configuration.py +10 -0
  179. frameio/types/long_text_definition_field_type.py +10 -0
  180. frameio/types/long_text_definition_params.py +15 -0
  181. frameio/types/long_text_definition_with_includes.py +13 -0
  182. frameio/types/media_link_common.py +17 -0
  183. frameio/types/media_links_collection.py +24 -0
  184. frameio/types/metadata_field.py +149 -0
  185. frameio/types/metadata_response.py +13 -0
  186. frameio/types/metadata_with_definition.py +21 -0
  187. frameio/types/multi_select_value.py +14 -0
  188. frameio/types/multi_user_value.py +20 -0
  189. frameio/types/multi_user_value_member_options_type.py +5 -0
  190. frameio/types/no_content.py +3 -0
  191. frameio/types/not_found.py +13 -0
  192. frameio/types/not_found_errors_item.py +15 -0
  193. frameio/types/not_found_errors_item_source.py +12 -0
  194. frameio/types/number_definition.py +43 -0
  195. frameio/types/number_definition_field_configuration.py +21 -0
  196. frameio/types/number_definition_field_configuration_number_format.py +7 -0
  197. frameio/types/number_definition_params.py +17 -0
  198. frameio/types/number_definition_params_field_configuration.py +23 -0
  199. frameio/types/number_definition_params_field_configuration_number_format.py +7 -0
  200. frameio/types/number_definition_with_includes.py +13 -0
  201. frameio/types/number_value.py +12 -0
  202. frameio/types/original_media_link.py +16 -0
  203. frameio/types/profile.py +34 -0
  204. frameio/types/profile_response.py +17 -0
  205. frameio/types/project.py +66 -0
  206. frameio/types/project_include.py +5 -0
  207. frameio/types/project_response.py +17 -0
  208. frameio/types/project_status.py +5 -0
  209. frameio/types/project_with_includes.py +18 -0
  210. frameio/types/project_with_includes_response.py +17 -0
  211. frameio/types/projects_with_includes_response.py +27 -0
  212. frameio/types/rating_definition.py +43 -0
  213. frameio/types/rating_definition_field_configuration.py +22 -0
  214. frameio/types/rating_definition_field_configuration_style.py +5 -0
  215. frameio/types/rating_definition_params.py +17 -0
  216. frameio/types/rating_definition_params_field_configuration.py +22 -0
  217. frameio/types/rating_definition_params_field_configuration_style.py +5 -0
  218. frameio/types/rating_definition_with_includes.py +13 -0
  219. frameio/types/remove_asset_response.py +13 -0
  220. frameio/types/remove_asset_response_data.py +15 -0
  221. frameio/types/rendition_media_link.py +19 -0
  222. frameio/types/request_after_opaque_cursor.py +5 -0
  223. frameio/types/request_page_size.py +3 -0
  224. frameio/types/select_definition.py +43 -0
  225. frameio/types/select_definition_field_configuration.py +18 -0
  226. frameio/types/select_definition_field_configuration_options_item.py +22 -0
  227. frameio/types/select_definition_params.py +17 -0
  228. frameio/types/select_definition_params_field_configuration.py +20 -0
  229. frameio/types/select_definition_params_field_configuration_options_item.py +20 -0
  230. frameio/types/select_definition_with_includes.py +13 -0
  231. frameio/types/select_multi_definition.py +49 -0
  232. frameio/types/select_multi_definition_field_configuration.py +18 -0
  233. frameio/types/select_multi_definition_field_configuration_options_item.py +22 -0
  234. frameio/types/select_multi_definition_field_type.py +10 -0
  235. frameio/types/select_multi_definition_params.py +17 -0
  236. frameio/types/select_multi_definition_params_field_configuration.py +20 -0
  237. frameio/types/select_multi_definition_params_field_configuration_options_item.py +20 -0
  238. frameio/types/select_multi_definition_with_includes.py +13 -0
  239. frameio/types/select_option.py +20 -0
  240. frameio/types/select_value.py +14 -0
  241. frameio/types/share.py +66 -0
  242. frameio/types/share_access.py +5 -0
  243. frameio/types/share_response.py +13 -0
  244. frameio/types/share_reviewers_response.py +27 -0
  245. frameio/types/shares_response.py +27 -0
  246. frameio/types/single_user_value.py +20 -0
  247. frameio/types/single_user_value_member_options_type.py +5 -0
  248. frameio/types/text_definition.py +49 -0
  249. frameio/types/text_definition_field_configuration.py +10 -0
  250. frameio/types/text_definition_field_type.py +10 -0
  251. frameio/types/text_definition_params.py +15 -0
  252. frameio/types/text_definition_with_includes.py +13 -0
  253. frameio/types/text_value.py +12 -0
  254. frameio/types/time_stamp.py +5 -0
  255. frameio/types/toggle_definition.py +43 -0
  256. frameio/types/toggle_definition_field_configuration.py +15 -0
  257. frameio/types/toggle_definition_params.py +17 -0
  258. frameio/types/toggle_definition_params_field_configuration.py +15 -0
  259. frameio/types/toggle_definition_with_includes.py +13 -0
  260. frameio/types/too_many_requests.py +13 -0
  261. frameio/types/too_many_requests_errors_item.py +15 -0
  262. frameio/types/too_many_requests_errors_item_source.py +12 -0
  263. frameio/types/unauthorized.py +13 -0
  264. frameio/types/unauthorized_errors_item.py +15 -0
  265. frameio/types/unauthorized_errors_item_source.py +12 -0
  266. frameio/types/unprocessable_entity.py +13 -0
  267. frameio/types/unprocessable_entity_errors_item.py +15 -0
  268. frameio/types/unprocessable_entity_errors_item_source.py +12 -0
  269. frameio/types/update_date_definition_params.py +17 -0
  270. frameio/types/update_date_definition_params_field_configuration.py +25 -0
  271. frameio/types/update_date_definition_params_field_configuration_display_format.py +7 -0
  272. frameio/types/update_date_definition_params_field_configuration_time_format.py +7 -0
  273. frameio/types/update_long_text_definition_params.py +15 -0
  274. frameio/types/update_number_definition_params.py +17 -0
  275. frameio/types/update_number_definition_params_field_configuration.py +25 -0
  276. frameio/types/update_number_definition_params_field_configuration_number_format.py +7 -0
  277. frameio/types/update_rating_definition_params.py +17 -0
  278. frameio/types/update_rating_definition_params_field_configuration.py +24 -0
  279. frameio/types/update_rating_definition_params_field_configuration_style.py +7 -0
  280. frameio/types/update_select_definition_params.py +17 -0
  281. frameio/types/update_select_definition_params_field_configuration.py +20 -0
  282. frameio/types/update_select_definition_params_field_configuration_options_item.py +20 -0
  283. frameio/types/update_select_multi_definition_params.py +19 -0
  284. frameio/types/update_select_multi_definition_params_field_configuration.py +20 -0
  285. frameio/types/update_select_multi_definition_params_field_configuration_options_item.py +20 -0
  286. frameio/types/update_text_definition_params.py +15 -0
  287. frameio/types/update_toggle_definition_params.py +17 -0
  288. frameio/types/update_toggle_definition_params_field_configuration.py +15 -0
  289. frameio/types/update_user_multi_definition_params.py +17 -0
  290. frameio/types/update_user_multi_definition_params_field_configuration.py +25 -0
  291. frameio/types/update_user_multi_definition_params_field_configuration_custom_members_item.py +20 -0
  292. frameio/types/update_user_multi_definition_params_field_configuration_custom_members_item_type.py +7 -0
  293. frameio/types/update_user_multi_definition_params_field_configuration_member_options_type.py +7 -0
  294. frameio/types/update_user_roles_params.py +17 -0
  295. frameio/types/update_user_roles_params_data.py +13 -0
  296. frameio/types/update_user_roles_params_data_role.py +7 -0
  297. frameio/types/update_user_roles_response.py +13 -0
  298. frameio/types/update_user_roles_response_data.py +13 -0
  299. frameio/types/update_user_roles_response_data_role.py +7 -0
  300. frameio/types/update_user_single_definition_params.py +17 -0
  301. frameio/types/update_user_single_definition_params_field_configuration.py +25 -0
  302. frameio/types/update_user_single_definition_params_field_configuration_custom_members_item.py +20 -0
  303. frameio/types/update_user_single_definition_params_field_configuration_custom_members_item_type.py +7 -0
  304. frameio/types/update_user_single_definition_params_field_configuration_member_options_type.py +7 -0
  305. frameio/types/upload_url.py +20 -0
  306. frameio/types/user.py +44 -0
  307. frameio/types/user_multi_definition.py +49 -0
  308. frameio/types/user_multi_definition_field_configuration.py +23 -0
  309. frameio/types/user_multi_definition_field_configuration_custom_members_item.py +20 -0
  310. frameio/types/user_multi_definition_field_configuration_custom_members_item_type.py +7 -0
  311. frameio/types/user_multi_definition_field_configuration_member_options_type.py +7 -0
  312. frameio/types/user_multi_definition_field_type.py +10 -0
  313. frameio/types/user_multi_definition_params.py +17 -0
  314. frameio/types/user_multi_definition_params_field_configuration.py +23 -0
  315. frameio/types/user_multi_definition_params_field_configuration_custom_members_item.py +20 -0
  316. frameio/types/user_multi_definition_params_field_configuration_custom_members_item_type.py +7 -0
  317. frameio/types/user_multi_definition_params_field_configuration_member_options_type.py +7 -0
  318. frameio/types/user_multi_definition_with_includes.py +13 -0
  319. frameio/types/user_role.py +19 -0
  320. frameio/types/user_role_role.py +7 -0
  321. frameio/types/user_roles_response.py +27 -0
  322. frameio/types/user_single_definition.py +49 -0
  323. frameio/types/user_single_definition_field_configuration.py +23 -0
  324. frameio/types/user_single_definition_field_configuration_custom_members_item.py +20 -0
  325. frameio/types/user_single_definition_field_configuration_custom_members_item_type.py +7 -0
  326. frameio/types/user_single_definition_field_configuration_member_options_type.py +7 -0
  327. frameio/types/user_single_definition_field_type.py +10 -0
  328. frameio/types/user_single_definition_params.py +17 -0
  329. frameio/types/user_single_definition_params_field_configuration.py +23 -0
  330. frameio/types/user_single_definition_params_field_configuration_custom_members_item.py +20 -0
  331. frameio/types/user_single_definition_params_field_configuration_custom_members_item_type.py +7 -0
  332. frameio/types/user_single_definition_params_field_configuration_member_options_type.py +7 -0
  333. frameio/types/user_single_definition_with_includes.py +13 -0
  334. frameio/types/user_value.py +18 -0
  335. frameio/types/user_value_type.py +5 -0
  336. frameio/types/uuid_.py +3 -0
  337. frameio/types/version_stack.py +50 -0
  338. frameio/types/version_stack_copy_response.py +13 -0
  339. frameio/types/version_stack_response.py +13 -0
  340. frameio/types/version_stack_with_includes.py +60 -0
  341. frameio/types/version_stack_with_includes_response.py +13 -0
  342. frameio/types/version_stacks_with_includes_response.py +19 -0
  343. frameio/types/webhook.py +36 -0
  344. frameio/types/webhook_create_response.py +17 -0
  345. frameio/types/webhook_create_response_data.py +15 -0
  346. frameio/types/webhook_events.py +5 -0
  347. frameio/types/webhook_response.py +13 -0
  348. frameio/types/webhook_with_includes.py +13 -0
  349. frameio/types/webhook_with_includes_response.py +13 -0
  350. frameio/types/webhooks_with_includes_response.py +23 -0
  351. frameio/types/workspace.py +40 -0
  352. frameio/types/workspace_include.py +5 -0
  353. frameio/types/workspace_params.py +17 -0
  354. frameio/types/workspace_params_data.py +15 -0
  355. frameio/types/workspace_response.py +17 -0
  356. frameio/types/workspace_with_includes.py +13 -0
  357. frameio/types/workspace_with_includes_response.py +17 -0
  358. frameio/types/workspaces_with_includes_response.py +27 -0
  359. frameio/users/__init__.py +4 -0
  360. frameio/users/client.py +100 -0
  361. frameio/users/raw_client.py +234 -0
  362. frameio/version.py +3 -0
  363. frameio/version_stacks/__init__.py +49 -0
  364. frameio/version_stacks/client.py +818 -0
  365. frameio/version_stacks/raw_client.py +1614 -0
  366. frameio/version_stacks/types/__init__.py +47 -0
  367. frameio/version_stacks/types/version_stack_copy_params_data.py +15 -0
  368. frameio/version_stacks/types/version_stack_create_params_data.py +19 -0
  369. frameio/version_stacks/types/version_stack_move_params_data.py +15 -0
  370. frameio/version_stacks/types/version_stacks_show_request_include.py +19 -0
  371. frameio/webhooks/__init__.py +34 -0
  372. frameio/webhooks/client.py +793 -0
  373. frameio/webhooks/raw_client.py +1347 -0
  374. frameio/webhooks/types/__init__.py +38 -0
  375. frameio/webhooks/types/webhook_create_params_data.py +18 -0
  376. frameio/webhooks/types/webhook_update_params_data.py +23 -0
  377. frameio/workspace_permissions/__init__.py +4 -0
  378. frameio/workspace_permissions/client.py +430 -0
  379. frameio/workspace_permissions/raw_client.py +824 -0
  380. frameio/workspaces/__init__.py +4 -0
  381. frameio/workspaces/client.py +563 -0
  382. frameio/workspaces/raw_client.py +1259 -0
  383. frameio-0.0.28.dist-info/METADATA +259 -0
  384. frameio-0.0.28.dist-info/RECORD +385 -0
  385. frameio-0.0.28.dist-info/WHEEL +4 -0
@@ -0,0 +1,1286 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import jsonable_encoder
10
+ from ..core.pagination import AsyncPager, SyncPager
11
+ from ..core.request_options import RequestOptions
12
+ from ..core.serialization import convert_and_respect_annotation_metadata
13
+ from ..core.unchecked_base_model import construct_type
14
+ from ..errors.bad_request_error import BadRequestError
15
+ from ..errors.forbidden_error import ForbiddenError
16
+ from ..errors.not_found_error import NotFoundError
17
+ from ..errors.too_many_requests_error import TooManyRequestsError
18
+ from ..errors.unauthorized_error import UnauthorizedError
19
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
20
+ from ..types.bad_request import BadRequest
21
+ from ..types.forbidden import Forbidden
22
+ from ..types.include_total_count import IncludeTotalCount
23
+ from ..types.not_found import NotFound
24
+ from ..types.project_response import ProjectResponse
25
+ from ..types.project_with_includes import ProjectWithIncludes
26
+ from ..types.project_with_includes_response import ProjectWithIncludesResponse
27
+ from ..types.projects_with_includes_response import ProjectsWithIncludesResponse
28
+ from ..types.request_after_opaque_cursor import RequestAfterOpaqueCursor
29
+ from ..types.request_page_size import RequestPageSize
30
+ from ..types.too_many_requests import TooManyRequests
31
+ from ..types.unauthorized import Unauthorized
32
+ from ..types.uuid_ import Uuid
33
+ from .types.project_params_data import ProjectParamsData
34
+ from .types.project_update_params_data import ProjectUpdateParamsData
35
+
36
+ # this is used as the default value for optional parameters
37
+ OMIT = typing.cast(typing.Any, ...)
38
+
39
+
40
+ class RawProjectsClient:
41
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
42
+ self._client_wrapper = client_wrapper
43
+
44
+ def show(
45
+ self,
46
+ account_id: Uuid,
47
+ project_id: Uuid,
48
+ *,
49
+ include: typing.Optional[typing.Literal["owner"]] = None,
50
+ request_options: typing.Optional[RequestOptions] = None,
51
+ ) -> HttpResponse[ProjectWithIncludesResponse]:
52
+ """
53
+ Show project details. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user
54
+
55
+ Parameters
56
+ ----------
57
+ account_id : Uuid
58
+
59
+
60
+ project_id : Uuid
61
+
62
+
63
+ include : typing.Optional[typing.Literal["owner"]]
64
+
65
+
66
+ request_options : typing.Optional[RequestOptions]
67
+ Request-specific configuration.
68
+
69
+ Returns
70
+ -------
71
+ HttpResponse[ProjectWithIncludesResponse]
72
+ OK
73
+ """
74
+ _response = self._client_wrapper.httpx_client.request(
75
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
76
+ method="GET",
77
+ params={
78
+ "include": include,
79
+ },
80
+ request_options=request_options,
81
+ )
82
+ try:
83
+ if 200 <= _response.status_code < 300:
84
+ _data = typing.cast(
85
+ ProjectWithIncludesResponse,
86
+ construct_type(
87
+ type_=ProjectWithIncludesResponse, # type: ignore
88
+ object_=_response.json(),
89
+ ),
90
+ )
91
+ return HttpResponse(response=_response, data=_data)
92
+ if _response.status_code == 400:
93
+ raise BadRequestError(
94
+ headers=dict(_response.headers),
95
+ body=typing.cast(
96
+ BadRequest,
97
+ construct_type(
98
+ type_=BadRequest, # type: ignore
99
+ object_=_response.json(),
100
+ ),
101
+ ),
102
+ )
103
+ if _response.status_code == 401:
104
+ raise UnauthorizedError(
105
+ headers=dict(_response.headers),
106
+ body=typing.cast(
107
+ Unauthorized,
108
+ construct_type(
109
+ type_=Unauthorized, # type: ignore
110
+ object_=_response.json(),
111
+ ),
112
+ ),
113
+ )
114
+ if _response.status_code == 403:
115
+ raise ForbiddenError(
116
+ headers=dict(_response.headers),
117
+ body=typing.cast(
118
+ Forbidden,
119
+ construct_type(
120
+ type_=Forbidden, # type: ignore
121
+ object_=_response.json(),
122
+ ),
123
+ ),
124
+ )
125
+ if _response.status_code == 404:
126
+ raise NotFoundError(
127
+ headers=dict(_response.headers),
128
+ body=typing.cast(
129
+ NotFound,
130
+ construct_type(
131
+ type_=NotFound, # type: ignore
132
+ object_=_response.json(),
133
+ ),
134
+ ),
135
+ )
136
+ if _response.status_code == 422:
137
+ raise UnprocessableEntityError(
138
+ headers=dict(_response.headers),
139
+ body=typing.cast(
140
+ typing.Any,
141
+ construct_type(
142
+ type_=typing.Any, # type: ignore
143
+ object_=_response.json(),
144
+ ),
145
+ ),
146
+ )
147
+ if _response.status_code == 429:
148
+ raise TooManyRequestsError(
149
+ headers=dict(_response.headers),
150
+ body=typing.cast(
151
+ TooManyRequests,
152
+ construct_type(
153
+ type_=TooManyRequests, # type: ignore
154
+ object_=_response.json(),
155
+ ),
156
+ ),
157
+ )
158
+ _response_json = _response.json()
159
+ except JSONDecodeError:
160
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
161
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
162
+
163
+ def delete(
164
+ self, account_id: Uuid, project_id: Uuid, *, request_options: typing.Optional[RequestOptions] = None
165
+ ) -> HttpResponse[None]:
166
+ """
167
+ Delete a project. <br>Rate Limits: 60 calls per 1.00 minute(s) per account_user
168
+
169
+ Parameters
170
+ ----------
171
+ account_id : Uuid
172
+
173
+
174
+ project_id : Uuid
175
+
176
+
177
+ request_options : typing.Optional[RequestOptions]
178
+ Request-specific configuration.
179
+
180
+ Returns
181
+ -------
182
+ HttpResponse[None]
183
+ """
184
+ _response = self._client_wrapper.httpx_client.request(
185
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
186
+ method="DELETE",
187
+ request_options=request_options,
188
+ )
189
+ try:
190
+ if 200 <= _response.status_code < 300:
191
+ return HttpResponse(response=_response, data=None)
192
+ if _response.status_code == 400:
193
+ raise BadRequestError(
194
+ headers=dict(_response.headers),
195
+ body=typing.cast(
196
+ BadRequest,
197
+ construct_type(
198
+ type_=BadRequest, # type: ignore
199
+ object_=_response.json(),
200
+ ),
201
+ ),
202
+ )
203
+ if _response.status_code == 401:
204
+ raise UnauthorizedError(
205
+ headers=dict(_response.headers),
206
+ body=typing.cast(
207
+ Unauthorized,
208
+ construct_type(
209
+ type_=Unauthorized, # type: ignore
210
+ object_=_response.json(),
211
+ ),
212
+ ),
213
+ )
214
+ if _response.status_code == 403:
215
+ raise ForbiddenError(
216
+ headers=dict(_response.headers),
217
+ body=typing.cast(
218
+ Forbidden,
219
+ construct_type(
220
+ type_=Forbidden, # type: ignore
221
+ object_=_response.json(),
222
+ ),
223
+ ),
224
+ )
225
+ if _response.status_code == 404:
226
+ raise NotFoundError(
227
+ headers=dict(_response.headers),
228
+ body=typing.cast(
229
+ NotFound,
230
+ construct_type(
231
+ type_=NotFound, # type: ignore
232
+ object_=_response.json(),
233
+ ),
234
+ ),
235
+ )
236
+ if _response.status_code == 422:
237
+ raise UnprocessableEntityError(
238
+ headers=dict(_response.headers),
239
+ body=typing.cast(
240
+ typing.Any,
241
+ construct_type(
242
+ type_=typing.Any, # type: ignore
243
+ object_=_response.json(),
244
+ ),
245
+ ),
246
+ )
247
+ if _response.status_code == 429:
248
+ raise TooManyRequestsError(
249
+ headers=dict(_response.headers),
250
+ body=typing.cast(
251
+ TooManyRequests,
252
+ construct_type(
253
+ type_=TooManyRequests, # type: ignore
254
+ object_=_response.json(),
255
+ ),
256
+ ),
257
+ )
258
+ _response_json = _response.json()
259
+ except JSONDecodeError:
260
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
261
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
262
+
263
+ def update(
264
+ self,
265
+ account_id: Uuid,
266
+ project_id: Uuid,
267
+ *,
268
+ data: ProjectUpdateParamsData,
269
+ request_options: typing.Optional[RequestOptions] = None,
270
+ ) -> HttpResponse[ProjectResponse]:
271
+ """
272
+ Update project details. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user
273
+
274
+ Parameters
275
+ ----------
276
+ account_id : Uuid
277
+
278
+
279
+ project_id : Uuid
280
+
281
+
282
+ data : ProjectUpdateParamsData
283
+
284
+ request_options : typing.Optional[RequestOptions]
285
+ Request-specific configuration.
286
+
287
+ Returns
288
+ -------
289
+ HttpResponse[ProjectResponse]
290
+ OK
291
+ """
292
+ _response = self._client_wrapper.httpx_client.request(
293
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
294
+ method="PATCH",
295
+ json={
296
+ "data": convert_and_respect_annotation_metadata(
297
+ object_=data, annotation=ProjectUpdateParamsData, direction="write"
298
+ ),
299
+ },
300
+ headers={
301
+ "content-type": "application/json",
302
+ },
303
+ request_options=request_options,
304
+ omit=OMIT,
305
+ )
306
+ try:
307
+ if 200 <= _response.status_code < 300:
308
+ _data = typing.cast(
309
+ ProjectResponse,
310
+ construct_type(
311
+ type_=ProjectResponse, # type: ignore
312
+ object_=_response.json(),
313
+ ),
314
+ )
315
+ return HttpResponse(response=_response, data=_data)
316
+ if _response.status_code == 400:
317
+ raise BadRequestError(
318
+ headers=dict(_response.headers),
319
+ body=typing.cast(
320
+ BadRequest,
321
+ construct_type(
322
+ type_=BadRequest, # type: ignore
323
+ object_=_response.json(),
324
+ ),
325
+ ),
326
+ )
327
+ if _response.status_code == 401:
328
+ raise UnauthorizedError(
329
+ headers=dict(_response.headers),
330
+ body=typing.cast(
331
+ Unauthorized,
332
+ construct_type(
333
+ type_=Unauthorized, # type: ignore
334
+ object_=_response.json(),
335
+ ),
336
+ ),
337
+ )
338
+ if _response.status_code == 403:
339
+ raise ForbiddenError(
340
+ headers=dict(_response.headers),
341
+ body=typing.cast(
342
+ Forbidden,
343
+ construct_type(
344
+ type_=Forbidden, # type: ignore
345
+ object_=_response.json(),
346
+ ),
347
+ ),
348
+ )
349
+ if _response.status_code == 404:
350
+ raise NotFoundError(
351
+ headers=dict(_response.headers),
352
+ body=typing.cast(
353
+ NotFound,
354
+ construct_type(
355
+ type_=NotFound, # type: ignore
356
+ object_=_response.json(),
357
+ ),
358
+ ),
359
+ )
360
+ if _response.status_code == 422:
361
+ raise UnprocessableEntityError(
362
+ headers=dict(_response.headers),
363
+ body=typing.cast(
364
+ typing.Any,
365
+ construct_type(
366
+ type_=typing.Any, # type: ignore
367
+ object_=_response.json(),
368
+ ),
369
+ ),
370
+ )
371
+ if _response.status_code == 429:
372
+ raise TooManyRequestsError(
373
+ headers=dict(_response.headers),
374
+ body=typing.cast(
375
+ TooManyRequests,
376
+ construct_type(
377
+ type_=TooManyRequests, # type: ignore
378
+ object_=_response.json(),
379
+ ),
380
+ ),
381
+ )
382
+ _response_json = _response.json()
383
+ except JSONDecodeError:
384
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
385
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
386
+
387
+ def index(
388
+ self,
389
+ account_id: Uuid,
390
+ workspace_id: Uuid,
391
+ *,
392
+ include: typing.Optional[typing.Literal["owner"]] = None,
393
+ after: typing.Optional[RequestAfterOpaqueCursor] = None,
394
+ page_size: typing.Optional[RequestPageSize] = None,
395
+ include_total_count: typing.Optional[IncludeTotalCount] = None,
396
+ request_options: typing.Optional[RequestOptions] = None,
397
+ ) -> SyncPager[ProjectWithIncludes, ProjectsWithIncludesResponse]:
398
+ """
399
+ List projects in a given workspace. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user
400
+
401
+ Parameters
402
+ ----------
403
+ account_id : Uuid
404
+
405
+
406
+ workspace_id : Uuid
407
+
408
+
409
+ include : typing.Optional[typing.Literal["owner"]]
410
+
411
+
412
+ after : typing.Optional[RequestAfterOpaqueCursor]
413
+ Opaque Cursor query param for requests returning paginated results.
414
+ <br/>
415
+ NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable.
416
+
417
+ page_size : typing.Optional[RequestPageSize]
418
+
419
+
420
+ include_total_count : typing.Optional[IncludeTotalCount]
421
+
422
+
423
+ request_options : typing.Optional[RequestOptions]
424
+ Request-specific configuration.
425
+
426
+ Returns
427
+ -------
428
+ SyncPager[ProjectWithIncludes, ProjectsWithIncludesResponse]
429
+ OK
430
+ """
431
+ _response = self._client_wrapper.httpx_client.request(
432
+ f"v4/accounts/{jsonable_encoder(account_id)}/workspaces/{jsonable_encoder(workspace_id)}/projects",
433
+ method="GET",
434
+ params={
435
+ "include": include,
436
+ "after": after,
437
+ "page_size": page_size,
438
+ "include_total_count": include_total_count,
439
+ },
440
+ request_options=request_options,
441
+ )
442
+ try:
443
+ if 200 <= _response.status_code < 300:
444
+ _parsed_response = typing.cast(
445
+ ProjectsWithIncludesResponse,
446
+ construct_type(
447
+ type_=ProjectsWithIncludesResponse, # type: ignore
448
+ object_=_response.json(),
449
+ ),
450
+ )
451
+ _items = _parsed_response.data
452
+ _has_next = False
453
+ _get_next = None
454
+ if _parsed_response.links is not None:
455
+ _parsed_next = _parsed_response.links.next
456
+ _has_next = _parsed_next is not None and _parsed_next != ""
457
+ _get_next = lambda: self.index(
458
+ account_id,
459
+ workspace_id,
460
+ include=include,
461
+ after=_parsed_next,
462
+ page_size=page_size,
463
+ include_total_count=include_total_count,
464
+ request_options=request_options,
465
+ )
466
+ return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response)
467
+ if _response.status_code == 400:
468
+ raise BadRequestError(
469
+ headers=dict(_response.headers),
470
+ body=typing.cast(
471
+ BadRequest,
472
+ construct_type(
473
+ type_=BadRequest, # type: ignore
474
+ object_=_response.json(),
475
+ ),
476
+ ),
477
+ )
478
+ if _response.status_code == 401:
479
+ raise UnauthorizedError(
480
+ headers=dict(_response.headers),
481
+ body=typing.cast(
482
+ Unauthorized,
483
+ construct_type(
484
+ type_=Unauthorized, # type: ignore
485
+ object_=_response.json(),
486
+ ),
487
+ ),
488
+ )
489
+ if _response.status_code == 403:
490
+ raise ForbiddenError(
491
+ headers=dict(_response.headers),
492
+ body=typing.cast(
493
+ Forbidden,
494
+ construct_type(
495
+ type_=Forbidden, # type: ignore
496
+ object_=_response.json(),
497
+ ),
498
+ ),
499
+ )
500
+ if _response.status_code == 404:
501
+ raise NotFoundError(
502
+ headers=dict(_response.headers),
503
+ body=typing.cast(
504
+ NotFound,
505
+ construct_type(
506
+ type_=NotFound, # type: ignore
507
+ object_=_response.json(),
508
+ ),
509
+ ),
510
+ )
511
+ if _response.status_code == 422:
512
+ raise UnprocessableEntityError(
513
+ headers=dict(_response.headers),
514
+ body=typing.cast(
515
+ typing.Any,
516
+ construct_type(
517
+ type_=typing.Any, # type: ignore
518
+ object_=_response.json(),
519
+ ),
520
+ ),
521
+ )
522
+ if _response.status_code == 429:
523
+ raise TooManyRequestsError(
524
+ headers=dict(_response.headers),
525
+ body=typing.cast(
526
+ TooManyRequests,
527
+ construct_type(
528
+ type_=TooManyRequests, # type: ignore
529
+ object_=_response.json(),
530
+ ),
531
+ ),
532
+ )
533
+ _response_json = _response.json()
534
+ except JSONDecodeError:
535
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
536
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
537
+
538
+ def create(
539
+ self,
540
+ account_id: Uuid,
541
+ workspace_id: Uuid,
542
+ *,
543
+ data: ProjectParamsData,
544
+ request_options: typing.Optional[RequestOptions] = None,
545
+ ) -> HttpResponse[ProjectResponse]:
546
+ """
547
+ Create project in a given workspace. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user
548
+
549
+ Parameters
550
+ ----------
551
+ account_id : Uuid
552
+
553
+
554
+ workspace_id : Uuid
555
+
556
+
557
+ data : ProjectParamsData
558
+
559
+ request_options : typing.Optional[RequestOptions]
560
+ Request-specific configuration.
561
+
562
+ Returns
563
+ -------
564
+ HttpResponse[ProjectResponse]
565
+ Created
566
+ """
567
+ _response = self._client_wrapper.httpx_client.request(
568
+ f"v4/accounts/{jsonable_encoder(account_id)}/workspaces/{jsonable_encoder(workspace_id)}/projects",
569
+ method="POST",
570
+ json={
571
+ "data": convert_and_respect_annotation_metadata(
572
+ object_=data, annotation=ProjectParamsData, direction="write"
573
+ ),
574
+ },
575
+ headers={
576
+ "content-type": "application/json",
577
+ },
578
+ request_options=request_options,
579
+ omit=OMIT,
580
+ )
581
+ try:
582
+ if 200 <= _response.status_code < 300:
583
+ _data = typing.cast(
584
+ ProjectResponse,
585
+ construct_type(
586
+ type_=ProjectResponse, # type: ignore
587
+ object_=_response.json(),
588
+ ),
589
+ )
590
+ return HttpResponse(response=_response, data=_data)
591
+ if _response.status_code == 400:
592
+ raise BadRequestError(
593
+ headers=dict(_response.headers),
594
+ body=typing.cast(
595
+ BadRequest,
596
+ construct_type(
597
+ type_=BadRequest, # type: ignore
598
+ object_=_response.json(),
599
+ ),
600
+ ),
601
+ )
602
+ if _response.status_code == 401:
603
+ raise UnauthorizedError(
604
+ headers=dict(_response.headers),
605
+ body=typing.cast(
606
+ Unauthorized,
607
+ construct_type(
608
+ type_=Unauthorized, # type: ignore
609
+ object_=_response.json(),
610
+ ),
611
+ ),
612
+ )
613
+ if _response.status_code == 403:
614
+ raise ForbiddenError(
615
+ headers=dict(_response.headers),
616
+ body=typing.cast(
617
+ Forbidden,
618
+ construct_type(
619
+ type_=Forbidden, # type: ignore
620
+ object_=_response.json(),
621
+ ),
622
+ ),
623
+ )
624
+ if _response.status_code == 404:
625
+ raise NotFoundError(
626
+ headers=dict(_response.headers),
627
+ body=typing.cast(
628
+ NotFound,
629
+ construct_type(
630
+ type_=NotFound, # type: ignore
631
+ object_=_response.json(),
632
+ ),
633
+ ),
634
+ )
635
+ if _response.status_code == 422:
636
+ raise UnprocessableEntityError(
637
+ headers=dict(_response.headers),
638
+ body=typing.cast(
639
+ typing.Any,
640
+ construct_type(
641
+ type_=typing.Any, # type: ignore
642
+ object_=_response.json(),
643
+ ),
644
+ ),
645
+ )
646
+ if _response.status_code == 429:
647
+ raise TooManyRequestsError(
648
+ headers=dict(_response.headers),
649
+ body=typing.cast(
650
+ TooManyRequests,
651
+ construct_type(
652
+ type_=TooManyRequests, # type: ignore
653
+ object_=_response.json(),
654
+ ),
655
+ ),
656
+ )
657
+ _response_json = _response.json()
658
+ except JSONDecodeError:
659
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
660
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
661
+
662
+
663
+ class AsyncRawProjectsClient:
664
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
665
+ self._client_wrapper = client_wrapper
666
+
667
+ async def show(
668
+ self,
669
+ account_id: Uuid,
670
+ project_id: Uuid,
671
+ *,
672
+ include: typing.Optional[typing.Literal["owner"]] = None,
673
+ request_options: typing.Optional[RequestOptions] = None,
674
+ ) -> AsyncHttpResponse[ProjectWithIncludesResponse]:
675
+ """
676
+ Show project details. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user
677
+
678
+ Parameters
679
+ ----------
680
+ account_id : Uuid
681
+
682
+
683
+ project_id : Uuid
684
+
685
+
686
+ include : typing.Optional[typing.Literal["owner"]]
687
+
688
+
689
+ request_options : typing.Optional[RequestOptions]
690
+ Request-specific configuration.
691
+
692
+ Returns
693
+ -------
694
+ AsyncHttpResponse[ProjectWithIncludesResponse]
695
+ OK
696
+ """
697
+ _response = await self._client_wrapper.httpx_client.request(
698
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
699
+ method="GET",
700
+ params={
701
+ "include": include,
702
+ },
703
+ request_options=request_options,
704
+ )
705
+ try:
706
+ if 200 <= _response.status_code < 300:
707
+ _data = typing.cast(
708
+ ProjectWithIncludesResponse,
709
+ construct_type(
710
+ type_=ProjectWithIncludesResponse, # type: ignore
711
+ object_=_response.json(),
712
+ ),
713
+ )
714
+ return AsyncHttpResponse(response=_response, data=_data)
715
+ if _response.status_code == 400:
716
+ raise BadRequestError(
717
+ headers=dict(_response.headers),
718
+ body=typing.cast(
719
+ BadRequest,
720
+ construct_type(
721
+ type_=BadRequest, # type: ignore
722
+ object_=_response.json(),
723
+ ),
724
+ ),
725
+ )
726
+ if _response.status_code == 401:
727
+ raise UnauthorizedError(
728
+ headers=dict(_response.headers),
729
+ body=typing.cast(
730
+ Unauthorized,
731
+ construct_type(
732
+ type_=Unauthorized, # type: ignore
733
+ object_=_response.json(),
734
+ ),
735
+ ),
736
+ )
737
+ if _response.status_code == 403:
738
+ raise ForbiddenError(
739
+ headers=dict(_response.headers),
740
+ body=typing.cast(
741
+ Forbidden,
742
+ construct_type(
743
+ type_=Forbidden, # type: ignore
744
+ object_=_response.json(),
745
+ ),
746
+ ),
747
+ )
748
+ if _response.status_code == 404:
749
+ raise NotFoundError(
750
+ headers=dict(_response.headers),
751
+ body=typing.cast(
752
+ NotFound,
753
+ construct_type(
754
+ type_=NotFound, # type: ignore
755
+ object_=_response.json(),
756
+ ),
757
+ ),
758
+ )
759
+ if _response.status_code == 422:
760
+ raise UnprocessableEntityError(
761
+ headers=dict(_response.headers),
762
+ body=typing.cast(
763
+ typing.Any,
764
+ construct_type(
765
+ type_=typing.Any, # type: ignore
766
+ object_=_response.json(),
767
+ ),
768
+ ),
769
+ )
770
+ if _response.status_code == 429:
771
+ raise TooManyRequestsError(
772
+ headers=dict(_response.headers),
773
+ body=typing.cast(
774
+ TooManyRequests,
775
+ construct_type(
776
+ type_=TooManyRequests, # type: ignore
777
+ object_=_response.json(),
778
+ ),
779
+ ),
780
+ )
781
+ _response_json = _response.json()
782
+ except JSONDecodeError:
783
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
784
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
785
+
786
+ async def delete(
787
+ self, account_id: Uuid, project_id: Uuid, *, request_options: typing.Optional[RequestOptions] = None
788
+ ) -> AsyncHttpResponse[None]:
789
+ """
790
+ Delete a project. <br>Rate Limits: 60 calls per 1.00 minute(s) per account_user
791
+
792
+ Parameters
793
+ ----------
794
+ account_id : Uuid
795
+
796
+
797
+ project_id : Uuid
798
+
799
+
800
+ request_options : typing.Optional[RequestOptions]
801
+ Request-specific configuration.
802
+
803
+ Returns
804
+ -------
805
+ AsyncHttpResponse[None]
806
+ """
807
+ _response = await self._client_wrapper.httpx_client.request(
808
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
809
+ method="DELETE",
810
+ request_options=request_options,
811
+ )
812
+ try:
813
+ if 200 <= _response.status_code < 300:
814
+ return AsyncHttpResponse(response=_response, data=None)
815
+ if _response.status_code == 400:
816
+ raise BadRequestError(
817
+ headers=dict(_response.headers),
818
+ body=typing.cast(
819
+ BadRequest,
820
+ construct_type(
821
+ type_=BadRequest, # type: ignore
822
+ object_=_response.json(),
823
+ ),
824
+ ),
825
+ )
826
+ if _response.status_code == 401:
827
+ raise UnauthorizedError(
828
+ headers=dict(_response.headers),
829
+ body=typing.cast(
830
+ Unauthorized,
831
+ construct_type(
832
+ type_=Unauthorized, # type: ignore
833
+ object_=_response.json(),
834
+ ),
835
+ ),
836
+ )
837
+ if _response.status_code == 403:
838
+ raise ForbiddenError(
839
+ headers=dict(_response.headers),
840
+ body=typing.cast(
841
+ Forbidden,
842
+ construct_type(
843
+ type_=Forbidden, # type: ignore
844
+ object_=_response.json(),
845
+ ),
846
+ ),
847
+ )
848
+ if _response.status_code == 404:
849
+ raise NotFoundError(
850
+ headers=dict(_response.headers),
851
+ body=typing.cast(
852
+ NotFound,
853
+ construct_type(
854
+ type_=NotFound, # type: ignore
855
+ object_=_response.json(),
856
+ ),
857
+ ),
858
+ )
859
+ if _response.status_code == 422:
860
+ raise UnprocessableEntityError(
861
+ headers=dict(_response.headers),
862
+ body=typing.cast(
863
+ typing.Any,
864
+ construct_type(
865
+ type_=typing.Any, # type: ignore
866
+ object_=_response.json(),
867
+ ),
868
+ ),
869
+ )
870
+ if _response.status_code == 429:
871
+ raise TooManyRequestsError(
872
+ headers=dict(_response.headers),
873
+ body=typing.cast(
874
+ TooManyRequests,
875
+ construct_type(
876
+ type_=TooManyRequests, # type: ignore
877
+ object_=_response.json(),
878
+ ),
879
+ ),
880
+ )
881
+ _response_json = _response.json()
882
+ except JSONDecodeError:
883
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
884
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
885
+
886
+ async def update(
887
+ self,
888
+ account_id: Uuid,
889
+ project_id: Uuid,
890
+ *,
891
+ data: ProjectUpdateParamsData,
892
+ request_options: typing.Optional[RequestOptions] = None,
893
+ ) -> AsyncHttpResponse[ProjectResponse]:
894
+ """
895
+ Update project details. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user
896
+
897
+ Parameters
898
+ ----------
899
+ account_id : Uuid
900
+
901
+
902
+ project_id : Uuid
903
+
904
+
905
+ data : ProjectUpdateParamsData
906
+
907
+ request_options : typing.Optional[RequestOptions]
908
+ Request-specific configuration.
909
+
910
+ Returns
911
+ -------
912
+ AsyncHttpResponse[ProjectResponse]
913
+ OK
914
+ """
915
+ _response = await self._client_wrapper.httpx_client.request(
916
+ f"v4/accounts/{jsonable_encoder(account_id)}/projects/{jsonable_encoder(project_id)}",
917
+ method="PATCH",
918
+ json={
919
+ "data": convert_and_respect_annotation_metadata(
920
+ object_=data, annotation=ProjectUpdateParamsData, direction="write"
921
+ ),
922
+ },
923
+ headers={
924
+ "content-type": "application/json",
925
+ },
926
+ request_options=request_options,
927
+ omit=OMIT,
928
+ )
929
+ try:
930
+ if 200 <= _response.status_code < 300:
931
+ _data = typing.cast(
932
+ ProjectResponse,
933
+ construct_type(
934
+ type_=ProjectResponse, # type: ignore
935
+ object_=_response.json(),
936
+ ),
937
+ )
938
+ return AsyncHttpResponse(response=_response, data=_data)
939
+ if _response.status_code == 400:
940
+ raise BadRequestError(
941
+ headers=dict(_response.headers),
942
+ body=typing.cast(
943
+ BadRequest,
944
+ construct_type(
945
+ type_=BadRequest, # type: ignore
946
+ object_=_response.json(),
947
+ ),
948
+ ),
949
+ )
950
+ if _response.status_code == 401:
951
+ raise UnauthorizedError(
952
+ headers=dict(_response.headers),
953
+ body=typing.cast(
954
+ Unauthorized,
955
+ construct_type(
956
+ type_=Unauthorized, # type: ignore
957
+ object_=_response.json(),
958
+ ),
959
+ ),
960
+ )
961
+ if _response.status_code == 403:
962
+ raise ForbiddenError(
963
+ headers=dict(_response.headers),
964
+ body=typing.cast(
965
+ Forbidden,
966
+ construct_type(
967
+ type_=Forbidden, # type: ignore
968
+ object_=_response.json(),
969
+ ),
970
+ ),
971
+ )
972
+ if _response.status_code == 404:
973
+ raise NotFoundError(
974
+ headers=dict(_response.headers),
975
+ body=typing.cast(
976
+ NotFound,
977
+ construct_type(
978
+ type_=NotFound, # type: ignore
979
+ object_=_response.json(),
980
+ ),
981
+ ),
982
+ )
983
+ if _response.status_code == 422:
984
+ raise UnprocessableEntityError(
985
+ headers=dict(_response.headers),
986
+ body=typing.cast(
987
+ typing.Any,
988
+ construct_type(
989
+ type_=typing.Any, # type: ignore
990
+ object_=_response.json(),
991
+ ),
992
+ ),
993
+ )
994
+ if _response.status_code == 429:
995
+ raise TooManyRequestsError(
996
+ headers=dict(_response.headers),
997
+ body=typing.cast(
998
+ TooManyRequests,
999
+ construct_type(
1000
+ type_=TooManyRequests, # type: ignore
1001
+ object_=_response.json(),
1002
+ ),
1003
+ ),
1004
+ )
1005
+ _response_json = _response.json()
1006
+ except JSONDecodeError:
1007
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1008
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1009
+
1010
+ async def index(
1011
+ self,
1012
+ account_id: Uuid,
1013
+ workspace_id: Uuid,
1014
+ *,
1015
+ include: typing.Optional[typing.Literal["owner"]] = None,
1016
+ after: typing.Optional[RequestAfterOpaqueCursor] = None,
1017
+ page_size: typing.Optional[RequestPageSize] = None,
1018
+ include_total_count: typing.Optional[IncludeTotalCount] = None,
1019
+ request_options: typing.Optional[RequestOptions] = None,
1020
+ ) -> AsyncPager[ProjectWithIncludes, ProjectsWithIncludesResponse]:
1021
+ """
1022
+ List projects in a given workspace. <br>Rate Limits: 100 calls per 1.00 minute(s) per account_user
1023
+
1024
+ Parameters
1025
+ ----------
1026
+ account_id : Uuid
1027
+
1028
+
1029
+ workspace_id : Uuid
1030
+
1031
+
1032
+ include : typing.Optional[typing.Literal["owner"]]
1033
+
1034
+
1035
+ after : typing.Optional[RequestAfterOpaqueCursor]
1036
+ Opaque Cursor query param for requests returning paginated results.
1037
+ <br/>
1038
+ NOTE: this value is auto-generated and included as part of links from a previous response. It is not intended to be human readable.
1039
+
1040
+ page_size : typing.Optional[RequestPageSize]
1041
+
1042
+
1043
+ include_total_count : typing.Optional[IncludeTotalCount]
1044
+
1045
+
1046
+ request_options : typing.Optional[RequestOptions]
1047
+ Request-specific configuration.
1048
+
1049
+ Returns
1050
+ -------
1051
+ AsyncPager[ProjectWithIncludes, ProjectsWithIncludesResponse]
1052
+ OK
1053
+ """
1054
+ _response = await self._client_wrapper.httpx_client.request(
1055
+ f"v4/accounts/{jsonable_encoder(account_id)}/workspaces/{jsonable_encoder(workspace_id)}/projects",
1056
+ method="GET",
1057
+ params={
1058
+ "include": include,
1059
+ "after": after,
1060
+ "page_size": page_size,
1061
+ "include_total_count": include_total_count,
1062
+ },
1063
+ request_options=request_options,
1064
+ )
1065
+ try:
1066
+ if 200 <= _response.status_code < 300:
1067
+ _parsed_response = typing.cast(
1068
+ ProjectsWithIncludesResponse,
1069
+ construct_type(
1070
+ type_=ProjectsWithIncludesResponse, # type: ignore
1071
+ object_=_response.json(),
1072
+ ),
1073
+ )
1074
+ _items = _parsed_response.data
1075
+ _has_next = False
1076
+ _get_next = None
1077
+ if _parsed_response.links is not None:
1078
+ _parsed_next = _parsed_response.links.next
1079
+ _has_next = _parsed_next is not None and _parsed_next != ""
1080
+
1081
+ async def _get_next():
1082
+ return await self.index(
1083
+ account_id,
1084
+ workspace_id,
1085
+ include=include,
1086
+ after=_parsed_next,
1087
+ page_size=page_size,
1088
+ include_total_count=include_total_count,
1089
+ request_options=request_options,
1090
+ )
1091
+
1092
+ return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response)
1093
+ if _response.status_code == 400:
1094
+ raise BadRequestError(
1095
+ headers=dict(_response.headers),
1096
+ body=typing.cast(
1097
+ BadRequest,
1098
+ construct_type(
1099
+ type_=BadRequest, # type: ignore
1100
+ object_=_response.json(),
1101
+ ),
1102
+ ),
1103
+ )
1104
+ if _response.status_code == 401:
1105
+ raise UnauthorizedError(
1106
+ headers=dict(_response.headers),
1107
+ body=typing.cast(
1108
+ Unauthorized,
1109
+ construct_type(
1110
+ type_=Unauthorized, # type: ignore
1111
+ object_=_response.json(),
1112
+ ),
1113
+ ),
1114
+ )
1115
+ if _response.status_code == 403:
1116
+ raise ForbiddenError(
1117
+ headers=dict(_response.headers),
1118
+ body=typing.cast(
1119
+ Forbidden,
1120
+ construct_type(
1121
+ type_=Forbidden, # type: ignore
1122
+ object_=_response.json(),
1123
+ ),
1124
+ ),
1125
+ )
1126
+ if _response.status_code == 404:
1127
+ raise NotFoundError(
1128
+ headers=dict(_response.headers),
1129
+ body=typing.cast(
1130
+ NotFound,
1131
+ construct_type(
1132
+ type_=NotFound, # type: ignore
1133
+ object_=_response.json(),
1134
+ ),
1135
+ ),
1136
+ )
1137
+ if _response.status_code == 422:
1138
+ raise UnprocessableEntityError(
1139
+ headers=dict(_response.headers),
1140
+ body=typing.cast(
1141
+ typing.Any,
1142
+ construct_type(
1143
+ type_=typing.Any, # type: ignore
1144
+ object_=_response.json(),
1145
+ ),
1146
+ ),
1147
+ )
1148
+ if _response.status_code == 429:
1149
+ raise TooManyRequestsError(
1150
+ headers=dict(_response.headers),
1151
+ body=typing.cast(
1152
+ TooManyRequests,
1153
+ construct_type(
1154
+ type_=TooManyRequests, # type: ignore
1155
+ object_=_response.json(),
1156
+ ),
1157
+ ),
1158
+ )
1159
+ _response_json = _response.json()
1160
+ except JSONDecodeError:
1161
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1162
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1163
+
1164
+ async def create(
1165
+ self,
1166
+ account_id: Uuid,
1167
+ workspace_id: Uuid,
1168
+ *,
1169
+ data: ProjectParamsData,
1170
+ request_options: typing.Optional[RequestOptions] = None,
1171
+ ) -> AsyncHttpResponse[ProjectResponse]:
1172
+ """
1173
+ Create project in a given workspace. <br>Rate Limits: 10 calls per 1.00 minute(s) per account_user
1174
+
1175
+ Parameters
1176
+ ----------
1177
+ account_id : Uuid
1178
+
1179
+
1180
+ workspace_id : Uuid
1181
+
1182
+
1183
+ data : ProjectParamsData
1184
+
1185
+ request_options : typing.Optional[RequestOptions]
1186
+ Request-specific configuration.
1187
+
1188
+ Returns
1189
+ -------
1190
+ AsyncHttpResponse[ProjectResponse]
1191
+ Created
1192
+ """
1193
+ _response = await self._client_wrapper.httpx_client.request(
1194
+ f"v4/accounts/{jsonable_encoder(account_id)}/workspaces/{jsonable_encoder(workspace_id)}/projects",
1195
+ method="POST",
1196
+ json={
1197
+ "data": convert_and_respect_annotation_metadata(
1198
+ object_=data, annotation=ProjectParamsData, direction="write"
1199
+ ),
1200
+ },
1201
+ headers={
1202
+ "content-type": "application/json",
1203
+ },
1204
+ request_options=request_options,
1205
+ omit=OMIT,
1206
+ )
1207
+ try:
1208
+ if 200 <= _response.status_code < 300:
1209
+ _data = typing.cast(
1210
+ ProjectResponse,
1211
+ construct_type(
1212
+ type_=ProjectResponse, # type: ignore
1213
+ object_=_response.json(),
1214
+ ),
1215
+ )
1216
+ return AsyncHttpResponse(response=_response, data=_data)
1217
+ if _response.status_code == 400:
1218
+ raise BadRequestError(
1219
+ headers=dict(_response.headers),
1220
+ body=typing.cast(
1221
+ BadRequest,
1222
+ construct_type(
1223
+ type_=BadRequest, # type: ignore
1224
+ object_=_response.json(),
1225
+ ),
1226
+ ),
1227
+ )
1228
+ if _response.status_code == 401:
1229
+ raise UnauthorizedError(
1230
+ headers=dict(_response.headers),
1231
+ body=typing.cast(
1232
+ Unauthorized,
1233
+ construct_type(
1234
+ type_=Unauthorized, # type: ignore
1235
+ object_=_response.json(),
1236
+ ),
1237
+ ),
1238
+ )
1239
+ if _response.status_code == 403:
1240
+ raise ForbiddenError(
1241
+ headers=dict(_response.headers),
1242
+ body=typing.cast(
1243
+ Forbidden,
1244
+ construct_type(
1245
+ type_=Forbidden, # type: ignore
1246
+ object_=_response.json(),
1247
+ ),
1248
+ ),
1249
+ )
1250
+ if _response.status_code == 404:
1251
+ raise NotFoundError(
1252
+ headers=dict(_response.headers),
1253
+ body=typing.cast(
1254
+ NotFound,
1255
+ construct_type(
1256
+ type_=NotFound, # type: ignore
1257
+ object_=_response.json(),
1258
+ ),
1259
+ ),
1260
+ )
1261
+ if _response.status_code == 422:
1262
+ raise UnprocessableEntityError(
1263
+ headers=dict(_response.headers),
1264
+ body=typing.cast(
1265
+ typing.Any,
1266
+ construct_type(
1267
+ type_=typing.Any, # type: ignore
1268
+ object_=_response.json(),
1269
+ ),
1270
+ ),
1271
+ )
1272
+ if _response.status_code == 429:
1273
+ raise TooManyRequestsError(
1274
+ headers=dict(_response.headers),
1275
+ body=typing.cast(
1276
+ TooManyRequests,
1277
+ construct_type(
1278
+ type_=TooManyRequests, # type: ignore
1279
+ object_=_response.json(),
1280
+ ),
1281
+ ),
1282
+ )
1283
+ _response_json = _response.json()
1284
+ except JSONDecodeError:
1285
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1286
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)