diff --git a/permissions/.gitattributes b/permissions/.gitattributes new file mode 100755 index 000000000..4d75d5900 --- /dev/null +++ b/permissions/.gitattributes @@ -0,0 +1,2 @@ +# This allows generated code to be indexed correctly +*.py linguist-generated=false \ No newline at end of file diff --git a/permissions/.gitignore b/permissions/.gitignore new file mode 100755 index 000000000..8ac3f51d4 --- /dev/null +++ b/permissions/.gitignore @@ -0,0 +1,7 @@ +.python-version +.DS_Store +venv/ +src/*.egg-info/ +__pycache__/ +.pytest_cache/ +.python-version` diff --git a/permissions/README.md b/permissions/README.md index 2d9a97e1e..5c644096e 100755 --- a/permissions/README.md +++ b/permissions/README.md @@ -16,44 +16,167 @@ from epilot.models import operations, shared s = epilot.Epilot( security=shared.Security( - epilot_auth="Bearer YOUR_BEARER_TOKEN_HERE", + epilot_auth="", ), ) - req = operations.AddAssignmentRequest( - role_id="123:owner", - user_id="1", + role_id='123:owner', + user_id='1', ) - + res = s.assignments.add_assignment(req) if res.assignment is not None: # handle response + pass ``` -## SDK Available Operations +## Available Resources and Operations -### assignments +### [assignments](docs/sdks/assignments/README.md) -* `add_assignment` - addAssignment -* `assign_roles` - assignRoles -* `get_assigned_roles_for_user` - getAssignedRolesForUser -* `list_all_assignments` - listAllAssignments -* `remove_assignment` - removeAssignment +* [add_assignment](docs/sdks/assignments/README.md#add_assignment) - addAssignment +* [assign_roles](docs/sdks/assignments/README.md#assign_roles) - assignRoles +* [get_assigned_roles_for_user](docs/sdks/assignments/README.md#get_assigned_roles_for_user) - getAssignedRolesForUser +* [list_all_assignments](docs/sdks/assignments/README.md#list_all_assignments) - listAllAssignments +* [remove_assignment](docs/sdks/assignments/README.md#remove_assignment) - removeAssignment -### roles +### [roles](docs/sdks/roles/README.md) -* `delete_role` - deleteRole -* `get_role` - getRole -* `list_all_roles` - listAllRoles -* `list_current_roles` - listCurrentRoles -* `put_role` - putRole -* `refresh_permissions` - refreshPermissions -* `search_roles` - searchRoles +* [delete_role](docs/sdks/roles/README.md#delete_role) - deleteRole +* [get_role](docs/sdks/roles/README.md#get_role) - getRole +* [list_all_roles](docs/sdks/roles/README.md#list_all_roles) - listAllRoles +* [list_current_roles](docs/sdks/roles/README.md#list_current_roles) - listCurrentRoles +* [put_role](docs/sdks/roles/README.md#put_role) - putRole +* [refresh_permissions](docs/sdks/roles/README.md#refresh_permissions) - refreshPermissions +* [search_roles](docs/sdks/roles/README.md#search_roles) - searchRoles + + + + + + + + + +# Pagination + +Some of the endpoints in this SDK support pagination. To use pagination, you make your SDK calls as usual, but the +returned response object will have a `Next` method that can be called to pull down the next group of results. If the +return value of `Next` is `None`, then there are no more pages to be fetched. + +Here's an example of one such pagination call: + + + + + +# Error Handling + +Handling errors in your SDK should largely match your expectations. All operations return a response object or raise an error. If Error objects are specified in your OpenAPI Spec, the SDK will raise the appropriate Error type. + + + + + + + +# Server Selection + +## Select Server by Index + +You can override the default server globally by passing a server index to the `server_idx: int` optional parameter when initializing the SDK client instance. The selected server will then be used as the default on the operations that use it. This table lists the indexes associated with the available servers: + +| # | Server | Variables | +| - | ------ | --------- | +| 0 | `https://permissions.sls.epilot.io` | None | + +For example: + + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), + server_idx=0 +) + +req = operations.AddAssignmentRequest( + role_id='123:owner', + user_id='1', +) + +res = s.assignments.add_assignment(req) + +if res.assignment is not None: + # handle response + pass +``` + + +## Override Server URL Per-Client + +The default server can also be overridden globally by passing a URL to the `server_url: str` optional parameter when initializing the SDK client instance. For example: + + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), + server_url="https://permissions.sls.epilot.io" +) + +req = operations.AddAssignmentRequest( + role_id='123:owner', + user_id='1', +) + +res = s.assignments.add_assignment(req) + +if res.assignment is not None: + # handle response + pass +``` + + + + + +# Custom HTTP Client + +The Python SDK makes API calls using the (requests)[https://pypi.org/project/requests/] HTTP library. In order to provide a convenient way to configure timeouts, cookies, proxies, custom headers, and other low-level configuration, you can initialize the SDK client with a custom `requests.Session` object. + + +For example, you could specify a header for every request that your sdk makes as follows: + +```python +import epilot +import requests + +http_client = requests.Session() +http_client.headers.update({'x-custom-header': 'someValue'}) +s = epilot.Epilot(client: http_client) +``` + + + + + + + + ### SDK Generated by [Speakeasy](https://docs.speakeasyapi.dev/docs/using-speakeasy/client-sdks) diff --git a/permissions/RELEASES.md b/permissions/RELEASES.md index 2cef85918..536eb39f1 100644 --- a/permissions/RELEASES.md +++ b/permissions/RELEASES.md @@ -34,4 +34,548 @@ Based on: ### Changes Based on: - OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml -- Speakeasy CLI 1.19.2 (2.16.5) https://github.com/speakeasy-api/speakeasy \ No newline at end of file +- Speakeasy CLI 1.19.2 (2.16.5) https://github.com/speakeasy-api/speakeasy + +## 2023-04-01 01:11:20 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.19.3 (2.16.7) https://github.com/speakeasy-api/speakeasy + +## 2023-04-06 01:05:45 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.19.6 (2.17.8) https://github.com/speakeasy-api/speakeasy + +## 2023-04-12 01:07:54 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.19.7 (2.17.9) https://github.com/speakeasy-api/speakeasy + +## 2023-04-14 01:08:25 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.20.0 (2.18.0) https://github.com/speakeasy-api/speakeasy + +## 2023-04-18 01:07:33 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.20.1 (2.18.1) https://github.com/speakeasy-api/speakeasy + +## 2023-04-19 01:10:32 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.20.2 (2.18.2) https://github.com/speakeasy-api/speakeasy + +## 2023-04-21 01:07:38 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.21.4 (2.19.1) https://github.com/speakeasy-api/speakeasy + +## 2023-04-22 01:08:54 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.22.1 (2.20.1) https://github.com/speakeasy-api/speakeasy + +## 2023-04-26 01:08:58 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.23.1 (2.21.1) https://github.com/speakeasy-api/speakeasy + +## 2023-04-27 01:10:51 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.25.1 (2.22.0) https://github.com/speakeasy-api/speakeasy + +## 2023-04-28 01:09:59 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.26.2 (2.23.2) https://github.com/speakeasy-api/speakeasy + +## 2023-04-29 01:08:31 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.26.4 (2.23.4) https://github.com/speakeasy-api/speakeasy + +## 2023-05-02 01:09:51 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.26.5 (2.23.6) https://github.com/speakeasy-api/speakeasy + +## 2023-05-03 01:09:48 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.27.0 (2.24.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-05 01:03:23 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.29.0 (2.26.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-06 01:04:16 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.29.1 (2.26.1) https://github.com/speakeasy-api/speakeasy + +## 2023-05-10 01:08:19 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.29.2 (2.26.2) https://github.com/speakeasy-api/speakeasy + +## 2023-05-11 01:09:33 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.30.0 (2.26.3) https://github.com/speakeasy-api/speakeasy + +## 2023-05-12 01:09:37 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.30.1 (2.26.4) https://github.com/speakeasy-api/speakeasy + +## 2023-05-13 01:06:55 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.31.1 (2.27.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-16 01:10:24 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.32.0 (2.28.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-17 01:12:17 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.33.2 (2.29.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-18 01:09:15 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.34.0 (2.30.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-19 01:10:48 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.35.0 (2.31.0) https://github.com/speakeasy-api/speakeasy + +## 2023-05-23 01:09:52 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.37.5 (2.32.2) https://github.com/speakeasy-api/speakeasy + +## 2023-05-27 01:11:06 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.39.0 (2.32.7) https://github.com/speakeasy-api/speakeasy + +## 2023-06-01 01:46:27 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.40.2 (2.34.2) https://github.com/speakeasy-api/speakeasy + +## 2023-06-02 01:22:20 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.40.3 (2.34.7) https://github.com/speakeasy-api/speakeasy + +## 2023-06-03 01:21:32 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.43.0 (2.35.3) https://github.com/speakeasy-api/speakeasy + +## 2023-06-07 01:24:20 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.44.2 (2.35.9) https://github.com/speakeasy-api/speakeasy + +## 2023-06-08 01:21:05 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.45.0 (2.37.0) https://github.com/speakeasy-api/speakeasy + +## 2023-06-09 01:23:31 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.45.2 (2.37.2) https://github.com/speakeasy-api/speakeasy + +## 2023-06-10 01:16:04 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.47.0 (2.39.0) https://github.com/speakeasy-api/speakeasy + +## 2023-06-11 01:38:08 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.47.1 (2.39.2) https://github.com/speakeasy-api/speakeasy + +## 2023-06-14 01:17:25 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.47.3 (2.40.1) https://github.com/speakeasy-api/speakeasy + +## 2023-06-16 01:17:37 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.48.0 (2.41.1) https://github.com/speakeasy-api/speakeasy + +## 2023-06-20 01:14:57 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.49.0 (2.41.4) https://github.com/speakeasy-api/speakeasy + +## 2023-06-21 01:41:24 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.49.1 (2.41.5) https://github.com/speakeasy-api/speakeasy + +## 2023-06-23 01:26:34 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.50.1 (2.43.2) https://github.com/speakeasy-api/speakeasy + +## 2023-06-27 01:27:42 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.51.1 (2.50.2) https://github.com/speakeasy-api/speakeasy + +## 2023-06-29 01:24:36 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.51.3 (2.52.2) https://github.com/speakeasy-api/speakeasy + +## 2023-07-01 01:41:45 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.52.0 (2.55.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-06 01:27:37 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.52.2 (2.57.2) https://github.com/speakeasy-api/speakeasy + +## 2023-07-07 01:36:02 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.53.0 (2.58.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-08 01:27:05 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.53.1 (2.58.2) https://github.com/speakeasy-api/speakeasy + +## 2023-07-11 01:19:51 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.56.0 (2.61.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-12 01:25:39 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.56.4 (2.61.5) https://github.com/speakeasy-api/speakeasy + +## 2023-07-13 01:37:28 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.57.0 (2.62.1) https://github.com/speakeasy-api/speakeasy + +## 2023-07-14 01:27:57 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.59.0 (2.65.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-17 01:39:45 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.60.0 (2.66.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-18 01:48:13 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.61.0 (2.70.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-19 02:36:49 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.62.1 (2.70.2) https://github.com/speakeasy-api/speakeasy + +## 2023-07-22 01:13:53 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.64.0 (2.71.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-26 01:14:59 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.65.0 (2.73.0) https://github.com/speakeasy-api/speakeasy + +## 2023-07-27 01:06:34 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.65.1 (2.73.1) https://github.com/speakeasy-api/speakeasy + +## 2023-07-28 01:07:34 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.65.2 (2.75.1) https://github.com/speakeasy-api/speakeasy + +## 2023-08-01 01:15:07 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.66.1 (2.75.2) https://github.com/speakeasy-api/speakeasy + +## 2023-08-03 01:08:37 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.68.1 (2.77.1) https://github.com/speakeasy-api/speakeasy + +## 2023-08-04 01:10:59 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.68.3 (2.81.1) https://github.com/speakeasy-api/speakeasy + +## 2023-08-08 01:06:51 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.69.1 (2.82.0) https://github.com/speakeasy-api/speakeasy + +## 2023-08-15 00:57:21 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.72.0 (2.84.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.41.0] permissions + +## 2023-08-19 00:55:13 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.74.3 (2.86.6) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.41.1] permissions + +## 2023-08-25 00:58:29 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.74.11 (2.87.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.41.2] permissions + +## 2023-08-26 00:56:00 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.74.16 (2.88.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.42.0] permissions + +## 2023-08-29 00:58:40 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.74.17 (2.88.5) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.42.1] permissions + +## 2023-08-31 00:58:44 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.76.1 (2.89.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.43.0] permissions + +## 2023-09-01 01:02:23 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.77.0 (2.91.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.0] permissions + +## 2023-09-02 00:56:33 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.77.2 (2.93.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.1] permissions + +## 2023-09-05 00:57:36 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.78.3 (2.96.3) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.2] permissions + +## 2023-09-12 00:57:14 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.82.5 (2.108.3) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.3] permissions + +## 2023-09-16 00:57:38 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.86.0 (2.115.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.4] permissions + +## 2023-09-20 00:59:04 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.88.0 (2.118.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.44.5] permissions + +## 2023-09-26 00:59:54 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.91.0 (2.129.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.45.0] permissions + +## 2023-09-27 00:59:58 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.91.2 (2.131.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.45.1] permissions + +## 2023-09-29 00:59:36 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.91.3 (2.139.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.46.0] permissions + +## 2023-10-01 01:07:29 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.92.2 (2.142.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.47.0] permissions + +## 2023-10-02 01:00:20 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.92.3 (2.143.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.47.1] permissions + +## 2023-10-05 00:59:51 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.94.0 (2.147.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.47.2] permissions + +## 2023-10-07 00:58:58 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.96.1 (2.150.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.48.0] permissions + +## 2023-10-13 01:01:25 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.99.1 (2.154.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.48.1] permissions + +## 2023-10-18 01:00:13 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.101.0 (2.161.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v2.0.0] permissions + +## 2023-10-21 00:58:20 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.104.0 (2.169.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v2.1.0] permissions + +## 2023-10-28 00:57:50 +### Changes +Based on: +- OpenAPI Doc 1.0.0 https://docs.api.epilot.io/permissions.yaml +- Speakeasy CLI 1.109.0 (2.173.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v2.1.1] permissions \ No newline at end of file diff --git a/permissions/USAGE.md b/permissions/USAGE.md index f8b544774..16bf95156 100755 --- a/permissions/USAGE.md +++ b/permissions/USAGE.md @@ -1,23 +1,25 @@ + + ```python import epilot from epilot.models import operations, shared s = epilot.Epilot( security=shared.Security( - epilot_auth="Bearer YOUR_BEARER_TOKEN_HERE", + epilot_auth="", ), ) - req = operations.AddAssignmentRequest( - role_id="123:owner", - user_id="1", + role_id='123:owner', + user_id='1', ) - + res = s.assignments.add_assignment(req) if res.assignment is not None: # handle response + pass ``` \ No newline at end of file diff --git a/permissions/docs/models/operations/addassignmentrequest.md b/permissions/docs/models/operations/addassignmentrequest.md new file mode 100755 index 000000000..342134dbe --- /dev/null +++ b/permissions/docs/models/operations/addassignmentrequest.md @@ -0,0 +1,9 @@ +# AddAssignmentRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `role_id` | *str* | :heavy_check_mark: | N/A | 123:owner | +| `user_id` | *str* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/permissions/docs/models/operations/addassignmentresponse.md b/permissions/docs/models/operations/addassignmentresponse.md new file mode 100755 index 000000000..bf9582687 --- /dev/null +++ b/permissions/docs/models/operations/addassignmentresponse.md @@ -0,0 +1,11 @@ +# AddAssignmentResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `assignment` | [Optional[shared.Assignment]](../../models/shared/assignment.md) | :heavy_minus_sign: | ok | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/assignrolesrequest.md b/permissions/docs/models/operations/assignrolesrequest.md new file mode 100755 index 000000000..b943e0bc0 --- /dev/null +++ b/permissions/docs/models/operations/assignrolesrequest.md @@ -0,0 +1,9 @@ +# AssignRolesRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `request_body` | List[*str*] | :heavy_minus_sign: | N/A | | +| `user_id` | *str* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/permissions/docs/models/operations/assignrolesresponse.md b/permissions/docs/models/operations/assignrolesresponse.md new file mode 100755 index 000000000..84436512b --- /dev/null +++ b/permissions/docs/models/operations/assignrolesresponse.md @@ -0,0 +1,11 @@ +# AssignRolesResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `assignments` | List[*str*] | :heavy_minus_sign: | ok | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/deleterolerequest.md b/permissions/docs/models/operations/deleterolerequest.md new file mode 100755 index 000000000..8e93fb49c --- /dev/null +++ b/permissions/docs/models/operations/deleterolerequest.md @@ -0,0 +1,8 @@ +# DeleteRoleRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `role_id` | *str* | :heavy_check_mark: | N/A | 123:owner | \ No newline at end of file diff --git a/permissions/docs/models/operations/deleteroleresponse.md b/permissions/docs/models/operations/deleteroleresponse.md new file mode 100755 index 000000000..dcd2b03e5 --- /dev/null +++ b/permissions/docs/models/operations/deleteroleresponse.md @@ -0,0 +1,11 @@ +# DeleteRoleResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `role` | [Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]](../../models/shared/role.md) | :heavy_minus_sign: | ok | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/getassignedrolesforuserrequest.md b/permissions/docs/models/operations/getassignedrolesforuserrequest.md new file mode 100755 index 000000000..e92783d08 --- /dev/null +++ b/permissions/docs/models/operations/getassignedrolesforuserrequest.md @@ -0,0 +1,8 @@ +# GetAssignedRolesForUserRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `user_id` | *str* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/permissions/docs/models/operations/getassignedrolesforuserresponse.md b/permissions/docs/models/operations/getassignedrolesforuserresponse.md new file mode 100755 index 000000000..bc8015774 --- /dev/null +++ b/permissions/docs/models/operations/getassignedrolesforuserresponse.md @@ -0,0 +1,11 @@ +# GetAssignedRolesForUserResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `assignments` | List[*str*] | :heavy_minus_sign: | ok | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/getrolerequest.md b/permissions/docs/models/operations/getrolerequest.md new file mode 100755 index 000000000..b8a06dd42 --- /dev/null +++ b/permissions/docs/models/operations/getrolerequest.md @@ -0,0 +1,8 @@ +# GetRoleRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `role_id` | *str* | :heavy_check_mark: | N/A | 123:owner | \ No newline at end of file diff --git a/permissions/docs/models/operations/getroleresponse.md b/permissions/docs/models/operations/getroleresponse.md new file mode 100755 index 000000000..db646dabf --- /dev/null +++ b/permissions/docs/models/operations/getroleresponse.md @@ -0,0 +1,11 @@ +# GetRoleResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `role` | [Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]](../../models/shared/role.md) | :heavy_minus_sign: | ok | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/listallassignments200applicationjson.md b/permissions/docs/models/operations/listallassignments200applicationjson.md new file mode 100755 index 000000000..638eaf396 --- /dev/null +++ b/permissions/docs/models/operations/listallassignments200applicationjson.md @@ -0,0 +1,10 @@ +# ListAllAssignments200ApplicationJSON + +ok + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| `assignments` | List[[shared.Assignment](../../models/shared/assignment.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/permissions/docs/models/operations/listallassignmentsresponse.md b/permissions/docs/models/operations/listallassignmentsresponse.md new file mode 100755 index 000000000..d01032017 --- /dev/null +++ b/permissions/docs/models/operations/listallassignmentsresponse.md @@ -0,0 +1,11 @@ +# ListAllAssignmentsResponse + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | +| `list_all_assignments_200_application_json_object` | [Optional[ListAllAssignments200ApplicationJSON]](../../models/operations/listallassignments200applicationjson.md) | :heavy_minus_sign: | ok | \ No newline at end of file diff --git a/permissions/docs/models/operations/listallroles200applicationjson.md b/permissions/docs/models/operations/listallroles200applicationjson.md new file mode 100755 index 000000000..57960a85f --- /dev/null +++ b/permissions/docs/models/operations/listallroles200applicationjson.md @@ -0,0 +1,10 @@ +# ListAllRoles200ApplicationJSON + +ok + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `roles` | List[[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]](../../models/shared/role.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/permissions/docs/models/operations/listallrolesresponse.md b/permissions/docs/models/operations/listallrolesresponse.md new file mode 100755 index 000000000..d2c22c810 --- /dev/null +++ b/permissions/docs/models/operations/listallrolesresponse.md @@ -0,0 +1,11 @@ +# ListAllRolesResponse + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | +| `list_all_roles_200_application_json_object` | [Optional[ListAllRoles200ApplicationJSON]](../../models/operations/listallroles200applicationjson.md) | :heavy_minus_sign: | ok | \ No newline at end of file diff --git a/permissions/docs/models/operations/listcurrentroles200applicationjson.md b/permissions/docs/models/operations/listcurrentroles200applicationjson.md new file mode 100755 index 000000000..ee9d0781e --- /dev/null +++ b/permissions/docs/models/operations/listcurrentroles200applicationjson.md @@ -0,0 +1,10 @@ +# ListCurrentRoles200ApplicationJSON + +ok + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `roles` | List[[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]](../../models/shared/role.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/permissions/docs/models/operations/listcurrentrolesresponse.md b/permissions/docs/models/operations/listcurrentrolesresponse.md new file mode 100755 index 000000000..0f97667f0 --- /dev/null +++ b/permissions/docs/models/operations/listcurrentrolesresponse.md @@ -0,0 +1,11 @@ +# ListCurrentRolesResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | +| `list_current_roles_200_application_json_object` | [Optional[ListCurrentRoles200ApplicationJSON]](../../models/operations/listcurrentroles200applicationjson.md) | :heavy_minus_sign: | ok | \ No newline at end of file diff --git a/permissions/docs/models/operations/putrolerequest.md b/permissions/docs/models/operations/putrolerequest.md new file mode 100755 index 000000000..162b90895 --- /dev/null +++ b/permissions/docs/models/operations/putrolerequest.md @@ -0,0 +1,9 @@ +# PutRoleRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `role_payload` | [Optional[Union[shared.RolePayload1, shared.RolePayload2, shared.RolePayload3, shared.RolePayload4]]](../../models/shared/rolepayload.md) | :heavy_minus_sign: | N/A | | +| `role_id` | *str* | :heavy_check_mark: | N/A | 123:owner | \ No newline at end of file diff --git a/permissions/docs/models/operations/putroleresponse.md b/permissions/docs/models/operations/putroleresponse.md new file mode 100755 index 000000000..5daf23737 --- /dev/null +++ b/permissions/docs/models/operations/putroleresponse.md @@ -0,0 +1,11 @@ +# PutRoleResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `role` | [Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]](../../models/shared/role.md) | :heavy_minus_sign: | ok | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/refreshpermissionsresponse.md b/permissions/docs/models/operations/refreshpermissionsresponse.md new file mode 100755 index 000000000..41b4cad3b --- /dev/null +++ b/permissions/docs/models/operations/refreshpermissionsresponse.md @@ -0,0 +1,10 @@ +# RefreshPermissionsResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/removeassignmentrequest.md b/permissions/docs/models/operations/removeassignmentrequest.md new file mode 100755 index 000000000..dafe901f7 --- /dev/null +++ b/permissions/docs/models/operations/removeassignmentrequest.md @@ -0,0 +1,9 @@ +# RemoveAssignmentRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `role_id` | *str* | :heavy_check_mark: | N/A | 123:owner | +| `user_id` | *str* | :heavy_check_mark: | N/A | 1 | \ No newline at end of file diff --git a/permissions/docs/models/operations/removeassignmentresponse.md b/permissions/docs/models/operations/removeassignmentresponse.md new file mode 100755 index 000000000..5c1878c67 --- /dev/null +++ b/permissions/docs/models/operations/removeassignmentresponse.md @@ -0,0 +1,11 @@ +# RemoveAssignmentResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `assignment` | [Optional[shared.Assignment]](../../models/shared/assignment.md) | :heavy_minus_sign: | ok | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/permissions/docs/models/operations/searchroles200applicationjson.md b/permissions/docs/models/operations/searchroles200applicationjson.md new file mode 100755 index 000000000..1a33af171 --- /dev/null +++ b/permissions/docs/models/operations/searchroles200applicationjson.md @@ -0,0 +1,11 @@ +# SearchRoles200ApplicationJSON + +ok + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `hits` | *Optional[float]* | :heavy_minus_sign: | N/A | +| `results` | List[[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]](../../models/shared/role.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/permissions/docs/models/operations/searchrolesresponse.md b/permissions/docs/models/operations/searchrolesresponse.md new file mode 100755 index 000000000..61b903806 --- /dev/null +++ b/permissions/docs/models/operations/searchrolesresponse.md @@ -0,0 +1,11 @@ +# SearchRolesResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | +| `search_roles_200_application_json_object` | [Optional[SearchRoles200ApplicationJSON]](../../models/operations/searchroles200applicationjson.md) | :heavy_minus_sign: | ok | \ No newline at end of file diff --git a/permissions/docs/models/shared/assignment.md b/permissions/docs/models/shared/assignment.md new file mode 100755 index 000000000..4cbe718ba --- /dev/null +++ b/permissions/docs/models/shared/assignment.md @@ -0,0 +1,11 @@ +# Assignment + +A role attached to an user + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `roles` | List[*str*] | :heavy_minus_sign: | N/A | | +| `user_id` | *Optional[str]* | :heavy_minus_sign: | Id of a user | 1 | \ No newline at end of file diff --git a/permissions/docs/models/shared/grant.md b/permissions/docs/models/shared/grant.md new file mode 100755 index 000000000..af18f8a5e --- /dev/null +++ b/permissions/docs/models/shared/grant.md @@ -0,0 +1,11 @@ +# Grant + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `action` | *str* | :heavy_check_mark: | N/A | entity-read | +| `conditions` | List[[Union[GrantConditionEqualsCondition]](../../models/shared/grantcondition.md)] | :heavy_minus_sign: | N/A | | +| `effect` | [Optional[GrantEffect]](../../models/shared/granteffect.md) | :heavy_minus_sign: | N/A | | +| `resource` | *Optional[str]* | :heavy_minus_sign: | N/A | entity:123:contact:f7c22299-ca72-4bca-8538-0a88eeefc947 | \ No newline at end of file diff --git a/permissions/docs/models/shared/grantcondition.md b/permissions/docs/models/shared/grantcondition.md new file mode 100755 index 000000000..2d8d76746 --- /dev/null +++ b/permissions/docs/models/shared/grantcondition.md @@ -0,0 +1,11 @@ +# GrantCondition + + +## Supported Types + +### GrantConditionEqualsCondition + +```python +grantCondition: shared.GrantConditionEqualsCondition = /* values here */ +``` + diff --git a/permissions/docs/models/shared/grantconditionequalscondition.md b/permissions/docs/models/shared/grantconditionequalscondition.md new file mode 100755 index 000000000..ece470994 --- /dev/null +++ b/permissions/docs/models/shared/grantconditionequalscondition.md @@ -0,0 +1,12 @@ +# GrantConditionEqualsCondition + +Check if attribute equals to any of the values + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `attribute` | *str* | :heavy_check_mark: | N/A | workflows.primary.task_name | +| `operation` | [GrantConditionEqualsConditionOperation](../../models/shared/grantconditionequalsconditionoperation.md) | :heavy_check_mark: | N/A | | +| `values` | List[*Any*] | :heavy_check_mark: | N/A | Qualification | \ No newline at end of file diff --git a/permissions/docs/models/shared/grantconditionequalsconditionoperation.md b/permissions/docs/models/shared/grantconditionequalsconditionoperation.md new file mode 100755 index 000000000..ba51982e9 --- /dev/null +++ b/permissions/docs/models/shared/grantconditionequalsconditionoperation.md @@ -0,0 +1,8 @@ +# GrantConditionEqualsConditionOperation + + +## Values + +| Name | Value | +| -------- | -------- | +| `EQUALS` | equals | \ No newline at end of file diff --git a/permissions/docs/models/shared/granteffect.md b/permissions/docs/models/shared/granteffect.md new file mode 100755 index 000000000..cbb9eea64 --- /dev/null +++ b/permissions/docs/models/shared/granteffect.md @@ -0,0 +1,9 @@ +# GrantEffect + + +## Values + +| Name | Value | +| ------- | ------- | +| `ALLOW` | allow | +| `DENY` | deny | \ No newline at end of file diff --git a/permissions/docs/models/shared/orgrole.md b/permissions/docs/models/shared/orgrole.md new file mode 100755 index 000000000..d5fea3b4c --- /dev/null +++ b/permissions/docs/models/shared/orgrole.md @@ -0,0 +1,16 @@ +# OrgRole + +A role automatically applied to all users in an organization. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [OrgRoleType](../../models/shared/orgroletype.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/orgroletype.md b/permissions/docs/models/shared/orgroletype.md new file mode 100755 index 000000000..31f37ee35 --- /dev/null +++ b/permissions/docs/models/shared/orgroletype.md @@ -0,0 +1,8 @@ +# OrgRoleType + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `ORG_ROLE` | org_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/partnerrole.md b/permissions/docs/models/shared/partnerrole.md new file mode 100755 index 000000000..3a1728649 --- /dev/null +++ b/permissions/docs/models/shared/partnerrole.md @@ -0,0 +1,17 @@ +# PartnerRole + +A role that appears in another organization's role list that can be assigned but not modified by the partner organization. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `partner_org_id` | *Optional[str]* | :heavy_minus_sign: | N/A | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [PartnerRoleType](../../models/shared/partnerroletype.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/partnerroletype.md b/permissions/docs/models/shared/partnerroletype.md new file mode 100755 index 000000000..b22bcaed3 --- /dev/null +++ b/permissions/docs/models/shared/partnerroletype.md @@ -0,0 +1,8 @@ +# PartnerRoleType + + +## Values + +| Name | Value | +| -------------- | -------------- | +| `PARTNER_ROLE` | partner_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/role.md b/permissions/docs/models/shared/role.md new file mode 100755 index 000000000..a4520b45d --- /dev/null +++ b/permissions/docs/models/shared/role.md @@ -0,0 +1,29 @@ +# Role + + +## Supported Types + +### UserRole + +```python +role: shared.UserRole = /* values here */ +``` + +### OrgRole + +```python +role: shared.OrgRole = /* values here */ +``` + +### ShareRole + +```python +role: shared.ShareRole = /* values here */ +``` + +### PartnerRole + +```python +role: shared.PartnerRole = /* values here */ +``` + diff --git a/permissions/docs/models/shared/rolepayload.md b/permissions/docs/models/shared/rolepayload.md new file mode 100755 index 000000000..e1af1d0ed --- /dev/null +++ b/permissions/docs/models/shared/rolepayload.md @@ -0,0 +1,29 @@ +# RolePayload + + +## Supported Types + +### RolePayload1 + +```python +rolePayload: shared.RolePayload1 = /* values here */ +``` + +### RolePayload2 + +```python +rolePayload: shared.RolePayload2 = /* values here */ +``` + +### RolePayload3 + +```python +rolePayload: shared.RolePayload3 = /* values here */ +``` + +### RolePayload4 + +```python +rolePayload: shared.RolePayload4 = /* values here */ +``` + diff --git a/permissions/docs/models/shared/rolepayload1.md b/permissions/docs/models/shared/rolepayload1.md new file mode 100755 index 000000000..e94492960 --- /dev/null +++ b/permissions/docs/models/shared/rolepayload1.md @@ -0,0 +1,16 @@ +# RolePayload1 + +A standard user role. Must be explicitly assigned to users. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [RolePayload1Type](../../models/shared/rolepayload1type.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload1type.md b/permissions/docs/models/shared/rolepayload1type.md new file mode 100755 index 000000000..346fdc114 --- /dev/null +++ b/permissions/docs/models/shared/rolepayload1type.md @@ -0,0 +1,8 @@ +# RolePayload1Type + + +## Values + +| Name | Value | +| ----------- | ----------- | +| `USER_ROLE` | user_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload2.md b/permissions/docs/models/shared/rolepayload2.md new file mode 100755 index 000000000..7716866ab --- /dev/null +++ b/permissions/docs/models/shared/rolepayload2.md @@ -0,0 +1,16 @@ +# RolePayload2 + +A role automatically applied to all users in an organization. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [RolePayload2Type](../../models/shared/rolepayload2type.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload2type.md b/permissions/docs/models/shared/rolepayload2type.md new file mode 100755 index 000000000..0ca059fda --- /dev/null +++ b/permissions/docs/models/shared/rolepayload2type.md @@ -0,0 +1,8 @@ +# RolePayload2Type + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `ORG_ROLE` | org_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload3.md b/permissions/docs/models/shared/rolepayload3.md new file mode 100755 index 000000000..985c92c04 --- /dev/null +++ b/permissions/docs/models/shared/rolepayload3.md @@ -0,0 +1,16 @@ +# RolePayload3 + +A role that can be assigned to users in other organizations for sharing purposes. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [RolePayload3Type](../../models/shared/rolepayload3type.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload3type.md b/permissions/docs/models/shared/rolepayload3type.md new file mode 100755 index 000000000..9d40b89bc --- /dev/null +++ b/permissions/docs/models/shared/rolepayload3type.md @@ -0,0 +1,8 @@ +# RolePayload3Type + + +## Values + +| Name | Value | +| ------------ | ------------ | +| `SHARE_ROLE` | share_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload4.md b/permissions/docs/models/shared/rolepayload4.md new file mode 100755 index 000000000..8592c8635 --- /dev/null +++ b/permissions/docs/models/shared/rolepayload4.md @@ -0,0 +1,17 @@ +# RolePayload4 + +A role that appears in another organization's role list that can be assigned but not modified by the partner organization. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `partner_org_id` | *Optional[str]* | :heavy_minus_sign: | N/A | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [RolePayload4Type](../../models/shared/rolepayload4type.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolepayload4type.md b/permissions/docs/models/shared/rolepayload4type.md new file mode 100755 index 000000000..0e6fb5367 --- /dev/null +++ b/permissions/docs/models/shared/rolepayload4type.md @@ -0,0 +1,8 @@ +# RolePayload4Type + + +## Values + +| Name | Value | +| -------------- | -------------- | +| `PARTNER_ROLE` | partner_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/rolesearchinput.md b/permissions/docs/models/shared/rolesearchinput.md new file mode 100755 index 000000000..319a44dc5 --- /dev/null +++ b/permissions/docs/models/shared/rolesearchinput.md @@ -0,0 +1,13 @@ +# RoleSearchInput + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- | +| `limit` | *Optional[float]* | :heavy_minus_sign: | The Number of roles to return | 1 | +| `offset` | *Optional[float]* | :heavy_minus_sign: | The number of roles to skip before starting to collect the result set | 1 | +| `org_ids` | List[*str*] | :heavy_minus_sign: | List of organization ids to filter by | 123,456 | +| `query` | *Optional[str]* | :heavy_minus_sign: | Input to search across fields | Administrator | +| `role_ids` | List[*str*] | :heavy_minus_sign: | List of role ids to filter by | 123:manager,456:owner | +| `slugs` | List[*str*] | :heavy_minus_sign: | List of role slugs to filter by | manager,owner | \ No newline at end of file diff --git a/permissions/docs/models/shared/security.md b/permissions/docs/models/shared/security.md new file mode 100755 index 000000000..7e7da0ee3 --- /dev/null +++ b/permissions/docs/models/shared/security.md @@ -0,0 +1,9 @@ +# Security + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `epilot_auth` | *Optional[str]* | :heavy_minus_sign: | N/A | | +| `epilot_org` | *Optional[str]* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/sharerole.md b/permissions/docs/models/shared/sharerole.md new file mode 100755 index 000000000..7064c1974 --- /dev/null +++ b/permissions/docs/models/shared/sharerole.md @@ -0,0 +1,16 @@ +# ShareRole + +A role that can be assigned to users in other organizations for sharing purposes. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [ShareRoleType](../../models/shared/shareroletype.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/shareroletype.md b/permissions/docs/models/shared/shareroletype.md new file mode 100755 index 000000000..fa8aa236e --- /dev/null +++ b/permissions/docs/models/shared/shareroletype.md @@ -0,0 +1,8 @@ +# ShareRoleType + + +## Values + +| Name | Value | +| ------------ | ------------ | +| `SHARE_ROLE` | share_role | \ No newline at end of file diff --git a/permissions/docs/models/shared/userrole.md b/permissions/docs/models/shared/userrole.md new file mode 100755 index 000000000..8a11c8098 --- /dev/null +++ b/permissions/docs/models/shared/userrole.md @@ -0,0 +1,16 @@ +# UserRole + +A standard user role. Must be explicitly assigned to users. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | date and time then the role will expire | 2028-07-21T17:32:28Z | +| `grants` | List[[Grant](../../models/shared/grant.md)] | :heavy_check_mark: | List of grants (permissions) applied to the role | | +| `id` | *str* | :heavy_check_mark: | Format: : | 123:owner | +| `name` | *str* | :heavy_check_mark: | Human-friendly name for the role | Owner | +| `organization_id` | *str* | :heavy_check_mark: | Id of an organization | 123 | +| `slug` | *str* | :heavy_check_mark: | URL-friendly name for the role | owner | +| `type` | [UserRoleType](../../models/shared/userroletype.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/permissions/docs/models/shared/userroletype.md b/permissions/docs/models/shared/userroletype.md new file mode 100755 index 000000000..90a67a625 --- /dev/null +++ b/permissions/docs/models/shared/userroletype.md @@ -0,0 +1,8 @@ +# UserRoleType + + +## Values + +| Name | Value | +| ----------- | ----------- | +| `USER_ROLE` | user_role | \ No newline at end of file diff --git a/permissions/docs/sdks/assignments/README.md b/permissions/docs/sdks/assignments/README.md new file mode 100755 index 000000000..6b266db9d --- /dev/null +++ b/permissions/docs/sdks/assignments/README.md @@ -0,0 +1,208 @@ +# Assignments +(*assignments*) + +## Overview + +Assign roles to users + +### Available Operations + +* [add_assignment](#add_assignment) - addAssignment +* [assign_roles](#assign_roles) - assignRoles +* [get_assigned_roles_for_user](#get_assigned_roles_for_user) - getAssignedRolesForUser +* [list_all_assignments](#list_all_assignments) - listAllAssignments +* [remove_assignment](#remove_assignment) - removeAssignment + +## add_assignment + +Assign a user to a role. + +Use the `x-epilot-org-id` header to assign share roles to users in other orgs + + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.AddAssignmentRequest( + role_id='123:owner', + user_id='1', +) + +res = s.assignments.add_assignment(req) + +if res.assignment is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| `request` | [operations.AddAssignmentRequest](../../models/operations/addassignmentrequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.AddAssignmentResponse](../../models/operations/addassignmentresponse.md)** + + +## assign_roles + +Assign / unassign roles to users. + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.AssignRolesRequest( + request_body=[ + '123:owner', + ], + user_id='1', +) + +res = s.assignments.assign_roles(req) + +if res.assignments is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| `request` | [operations.AssignRolesRequest](../../models/operations/assignrolesrequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.AssignRolesResponse](../../models/operations/assignrolesresponse.md)** + + +## get_assigned_roles_for_user + +Get list of assigned roles by user id + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.GetAssignedRolesForUserRequest( + user_id='1', +) + +res = s.assignments.get_assigned_roles_for_user(req) + +if res.assignments is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | +| `request` | [operations.GetAssignedRolesForUserRequest](../../models/operations/getassignedrolesforuserrequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.GetAssignedRolesForUserResponse](../../models/operations/getassignedrolesforuserresponse.md)** + + +## list_all_assignments + +Returns list of all assignments in organization + +### Example Usage + +```python +import epilot +from epilot.models import shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + + +res = s.assignments.list_all_assignments() + +if res.list_all_assignments_200_application_json_object is not None: + # handle response + pass +``` + + +### Response + +**[operations.ListAllAssignmentsResponse](../../models/operations/listallassignmentsresponse.md)** + + +## remove_assignment + +Remove role assignment from user + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.RemoveAssignmentRequest( + role_id='123:owner', + user_id='1', +) + +res = s.assignments.remove_assignment(req) + +if res.assignment is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| `request` | [operations.RemoveAssignmentRequest](../../models/operations/removeassignmentrequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.RemoveAssignmentResponse](../../models/operations/removeassignmentresponse.md)** + diff --git a/permissions/docs/sdks/epilot/README.md b/permissions/docs/sdks/epilot/README.md new file mode 100755 index 000000000..96e52122f --- /dev/null +++ b/permissions/docs/sdks/epilot/README.md @@ -0,0 +1,9 @@ +# Epilot SDK + + +## Overview + +Permissions API: Flexible Role-based Access Control for epilot + +### Available Operations + diff --git a/permissions/docs/sdks/roles/README.md b/permissions/docs/sdks/roles/README.md new file mode 100755 index 000000000..e6144555f --- /dev/null +++ b/permissions/docs/sdks/roles/README.md @@ -0,0 +1,312 @@ +# Roles +(*roles*) + +## Overview + +Manage roles and grants + +### Available Operations + +* [delete_role](#delete_role) - deleteRole +* [get_role](#get_role) - getRole +* [list_all_roles](#list_all_roles) - listAllRoles +* [list_current_roles](#list_current_roles) - listCurrentRoles +* [put_role](#put_role) - putRole +* [refresh_permissions](#refresh_permissions) - refreshPermissions +* [search_roles](#search_roles) - searchRoles + +## delete_role + +Delete role by id + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.DeleteRoleRequest( + role_id='123:owner', +) + +res = s.roles.delete_role(req) + +if res.role is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `request` | [operations.DeleteRoleRequest](../../models/operations/deleterolerequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.DeleteRoleResponse](../../models/operations/deleteroleresponse.md)** + + +## get_role + +Get role by id + +### Example Usage + +```python +import epilot +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.GetRoleRequest( + role_id='123:owner', +) + +res = s.roles.get_role(req) + +if res.role is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `request` | [operations.GetRoleRequest](../../models/operations/getrolerequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.GetRoleResponse](../../models/operations/getroleresponse.md)** + + +## list_all_roles + +Returns list of all roles in organization + +### Example Usage + +```python +import epilot +from epilot.models import shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + + +res = s.roles.list_all_roles() + +if res.list_all_roles_200_application_json_object is not None: + # handle response + pass +``` + + +### Response + +**[operations.ListAllRolesResponse](../../models/operations/listallrolesresponse.md)** + + +## list_current_roles + +Returns roles and grants assigned to current user + +### Example Usage + +```python +import epilot +from epilot.models import shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + + +res = s.roles.list_current_roles() + +if res.list_current_roles_200_application_json_object is not None: + # handle response + pass +``` + + +### Response + +**[operations.ListCurrentRolesResponse](../../models/operations/listcurrentrolesresponse.md)** + + +## put_role + +Create or update role + +### Example Usage + +```python +import epilot +import dateutil.parser +from epilot.models import operations, shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = operations.PutRoleRequest( + shared.RolePayload1( + expires_at=dateutil.parser.isoparse('2028-07-21T17:32:28Z'), + grants=[ + shared.Grant( + action='entity-read', + conditions=[ + shared.GrantConditionEqualsCondition( + attribute='workflows.primary.task_name', + operation=shared.GrantConditionEqualsConditionOperation.EQUALS, + values=[ + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + 'string', + ], + ), + ], + resource='entity:123:contact:f7c22299-ca72-4bca-8538-0a88eeefc947', + ), + ], + id='123:owner', + name='Owner', + organization_id='123', + slug='owner', + type=shared.RolePayload1Type.USER_ROLE, + ), + role_id='123:owner', +) + +res = s.roles.put_role(req) + +if res.role is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `request` | [operations.PutRoleRequest](../../models/operations/putrolerequest.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.PutRoleResponse](../../models/operations/putroleresponse.md)** + + +## refresh_permissions + +Makes sure the user has a role in the organization + +### Example Usage + +```python +import epilot +from epilot.models import shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + + +res = s.roles.refresh_permissions() + +if res.status_code == 200: + # handle response + pass +``` + + +### Response + +**[operations.RefreshPermissionsResponse](../../models/operations/refreshpermissionsresponse.md)** + + +## search_roles + +Search Roles + +### Example Usage + +```python +import epilot +from epilot.models import shared + +s = epilot.Epilot( + security=shared.Security( + epilot_auth="", + ), +) + +req = shared.RoleSearchInput( + limit=1, + offset=1, + org_ids=[ + '123', + '456', + ], + query='Administrator', + role_ids=[ + '123:manager', + '456:owner', + ], + slugs=[ + 'manager', + 'owner', + ], +) + +res = s.roles.search_roles(req) + +if res.search_roles_200_application_json_object is not None: + # handle response + pass +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | +| `request` | [shared.RoleSearchInput](../../models/shared/rolesearchinput.md) | :heavy_check_mark: | The request object to use for the request. | + + +### Response + +**[operations.SearchRolesResponse](../../models/operations/searchrolesresponse.md)** + diff --git a/permissions/files.gen b/permissions/files.gen index aa755ab0c..67019e79d 100755 --- a/permissions/files.gen +++ b/permissions/files.gen @@ -1,3 +1,4 @@ +src/epilot/sdkconfiguration.py src/epilot/assignments.py src/epilot/roles.py src/epilot/sdk.py @@ -5,6 +6,7 @@ pylintrc setup.py src/epilot/__init__.py src/epilot/models/__init__.py +src/epilot/models/errors/sdkerror.py src/epilot/utils/__init__.py src/epilot/utils/retries.py src/epilot/utils/utils.py @@ -24,11 +26,66 @@ src/epilot/models/operations/__init__.py src/epilot/models/shared/assignment.py src/epilot/models/shared/userrole.py src/epilot/models/shared/grant.py -src/epilot/models/shared/equalscondition.py +src/epilot/models/shared/grantcondition.py src/epilot/models/shared/orgrole.py src/epilot/models/shared/sharerole.py src/epilot/models/shared/partnerrole.py +src/epilot/models/shared/rolepayload.py src/epilot/models/shared/rolesearchinput.py src/epilot/models/shared/security.py src/epilot/models/shared/__init__.py -USAGE.md \ No newline at end of file +src/epilot/models/errors/__init__.py +USAGE.md +docs/models/operations/addassignmentrequest.md +docs/models/operations/addassignmentresponse.md +docs/models/operations/assignrolesrequest.md +docs/models/operations/assignrolesresponse.md +docs/models/operations/getassignedrolesforuserrequest.md +docs/models/operations/getassignedrolesforuserresponse.md +docs/models/operations/listallassignments200applicationjson.md +docs/models/operations/listallassignmentsresponse.md +docs/models/operations/removeassignmentrequest.md +docs/models/operations/removeassignmentresponse.md +docs/models/operations/deleterolerequest.md +docs/models/operations/deleteroleresponse.md +docs/models/operations/getrolerequest.md +docs/models/operations/getroleresponse.md +docs/models/operations/listallroles200applicationjson.md +docs/models/operations/listallrolesresponse.md +docs/models/operations/listcurrentroles200applicationjson.md +docs/models/operations/listcurrentrolesresponse.md +docs/models/operations/putrolerequest.md +docs/models/operations/putroleresponse.md +docs/models/operations/refreshpermissionsresponse.md +docs/models/operations/searchroles200applicationjson.md +docs/models/operations/searchrolesresponse.md +docs/models/shared/assignment.md +docs/models/shared/role.md +docs/models/shared/userroletype.md +docs/models/shared/userrole.md +docs/models/shared/granteffect.md +docs/models/shared/grant.md +docs/models/shared/grantconditionequalsconditionoperation.md +docs/models/shared/grantconditionequalscondition.md +docs/models/shared/grantcondition.md +docs/models/shared/orgroletype.md +docs/models/shared/orgrole.md +docs/models/shared/shareroletype.md +docs/models/shared/sharerole.md +docs/models/shared/partnerroletype.md +docs/models/shared/partnerrole.md +docs/models/shared/rolepayload4type.md +docs/models/shared/rolepayload4.md +docs/models/shared/rolepayload3type.md +docs/models/shared/rolepayload3.md +docs/models/shared/rolepayload2type.md +docs/models/shared/rolepayload2.md +docs/models/shared/rolepayload1type.md +docs/models/shared/rolepayload1.md +docs/models/shared/rolepayload.md +docs/models/shared/rolesearchinput.md +docs/models/shared/security.md +docs/sdks/epilot/README.md +docs/sdks/assignments/README.md +docs/sdks/roles/README.md +.gitattributes \ No newline at end of file diff --git a/permissions/gen.yaml b/permissions/gen.yaml index ea94d4574..fdcda56a5 100644 --- a/permissions/gen.yaml +++ b/permissions/gen.yaml @@ -2,15 +2,24 @@ configVersion: 1.0.0 management: docChecksum: 2e01724bb1e55ab32f2eaf23de0044cf docVersion: 1.0.0 - speakeasyVersion: 1.19.2 - generationVersion: 2.16.5 + speakeasyVersion: 1.109.0 + generationVersion: 2.173.0 generation: - telemetryEnabled: false + repoURL: https://github.com/epilot-dev/sdk-python.git sdkClassName: epilot - sdkFlattening: true singleTagPerOp: false + telemetryEnabled: false +features: + python: + core: 3.3.1 + globalSecurity: 2.82.0 + globalServerURLs: 2.82.0 python: - version: 1.2.2 + version: 2.1.1 author: epilot description: Python Client SDK for Epilot + flattenGlobalSecurity: false + installationURL: https://github.com/epilot-dev/sdk-python.git#subdirectory=permissions + maxMethodParams: 0 packageName: epilot-permissions + repoSubDirectory: permissions diff --git a/permissions/pylintrc b/permissions/pylintrc index 79b8008d0..1ed32214e 100755 --- a/permissions/pylintrc +++ b/permissions/pylintrc @@ -88,7 +88,7 @@ persistent=yes # Minimum Python version to use for version dependent checks. Will default to # the version used to run pylint. -py-version=3.9 +py-version=3.8 # Discover python modules and packages in the file system subtree. recursive=no @@ -116,20 +116,15 @@ argument-naming-style=snake_case #argument-rgx= # Naming style matching correct attribute names. -attr-naming-style=snake_case +#attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- # style. If left empty, attribute names will be checked with the set naming # style. -#attr-rgx= +attr-rgx=[^\W\d][^\W]*|__.*__$ # Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - bar, - baz, - toto, - tutu, - tata +bad-names= # Bad variable names regexes, separated by a comma. If names match any regex, # they will always be refused @@ -439,7 +434,13 @@ disable=raw-checker-failed, trailing-newlines, too-many-public-methods, too-many-locals, - too-many-lines + too-many-lines, + using-constant-test, + too-many-statements, + cyclic-import, + too-many-nested-blocks, + too-many-boolean-expressions, + no-else-raise # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -620,7 +621,7 @@ additional-builtins= allow-global-unused-variables=yes # List of names allowed to shadow builtins -allowed-redefined-builtins= +allowed-redefined-builtins=id,object # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. diff --git a/permissions/setup.py b/permissions/setup.py index b12150d8f..8887843be 100755 --- a/permissions/setup.py +++ b/permissions/setup.py @@ -10,30 +10,31 @@ setuptools.setup( name="epilot-permissions", - version="1.2.2", + version="2.1.1", author="epilot", description="Python Client SDK for Epilot", long_description=long_description, long_description_content_type="text/markdown", packages=setuptools.find_packages(where="src"), install_requires=[ - "certifi==2022.12.07", - "charset-normalizer==2.1.1", - "dataclasses-json-speakeasy==0.5.8", - "idna==3.3", - "marshmallow==3.17.1", - "marshmallow-enum==1.5.1", - "mypy-extensions==0.4.3", - "packaging==21.3", - "pyparsing==3.0.9", - "python-dateutil==2.8.2", - "requests==2.28.1", - "six==1.16.0", - "typing-inspect==0.8.0", - "typing_extensions==4.3.0", - "urllib3==1.26.12", - "pylint==2.16.2", + "certifi>=2023.7.22", + "charset-normalizer>=3.2.0", + "dataclasses-json>=0.6.1", + "idna>=3.4", + "jsonpath-python>=1.0.6 ", + "marshmallow>=3.19.0", + "mypy-extensions>=1.0.0", + "packaging>=23.1", + "python-dateutil>=2.8.2", + "requests>=2.31.0", + "six>=1.16.0", + "typing-inspect>=0.9.0", + "typing_extensions>=4.7.1", + "urllib3>=2.0.4", ], + extras_require={ + "dev":["pylint==2.16.2"] + }, package_dir={'': 'src'}, - python_requires='>=3.9' + python_requires='>=3.8' ) diff --git a/permissions/src/epilot/__init__.py b/permissions/src/epilot/__init__.py index b9e232018..e6c0deeb6 100755 --- a/permissions/src/epilot/__init__.py +++ b/permissions/src/epilot/__init__.py @@ -1,3 +1,4 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" from .sdk import * +from .sdkconfiguration import * diff --git a/permissions/src/epilot/assignments.py b/permissions/src/epilot/assignments.py index 80feb031b..9920cbc46 100755 --- a/permissions/src/epilot/assignments.py +++ b/permissions/src/epilot/assignments.py @@ -1,42 +1,34 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" -import requests as requests_http -from . import utils -from epilot.models import operations, shared -from typing import Optional +from .sdkconfiguration import SDKConfiguration +from epilot import utils +from epilot.models import errors, operations, shared +from typing import List, Optional class Assignments: r"""Assign roles to users""" - _client: requests_http.Session - _security_client: requests_http.Session - _server_url: str - _language: str - _sdk_version: str - _gen_version: str - - def __init__(self, client: requests_http.Session, security_client: requests_http.Session, server_url: str, language: str, sdk_version: str, gen_version: str) -> None: - self._client = client - self._security_client = security_client - self._server_url = server_url - self._language = language - self._sdk_version = sdk_version - self._gen_version = gen_version + sdk_configuration: SDKConfiguration + + def __init__(self, sdk_config: SDKConfiguration) -> None: + self.sdk_configuration = sdk_config + def add_assignment(self, request: operations.AddAssignmentRequest) -> operations.AddAssignmentResponse: r"""addAssignment Assign a user to a role. - + Use the `x-epilot-org-id` header to assign share roles to users in other orgs - """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.AddAssignmentRequest, base_url, '/v1/permissions/assignments/{userId}/{roleId}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.security_client - client = self._security_client - - http_res = client.request('POST', url) + http_res = client.request('POST', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.AddAssignmentResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) @@ -45,23 +37,27 @@ def add_assignment(self, request: operations.AddAssignmentRequest) -> operations if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[shared.Assignment]) res.assignment = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def assign_roles(self, request: operations.AssignRolesRequest) -> operations.AssignRolesResponse: r"""assignRoles Assign / unassign roles to users. """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.AssignRolesRequest, base_url, '/v1/permissions/assignments/{userId}', request) - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "request_body", 'json') + req_content_type, data, form = utils.serialize_request_body(request, "request_body", False, True, 'json') if req_content_type not in ('multipart/form-data', 'multipart/mixed'): headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client http_res = client.request('PUT', url, data=data, files=form, headers=headers) content_type = http_res.headers.get('Content-Type') @@ -70,46 +66,56 @@ def assign_roles(self, request: operations.AssignRolesRequest) -> operations.Ass if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[list[str]]) + out = utils.unmarshal_json(http_res.text, Optional[List[str]]) res.assignments = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def get_assigned_roles_for_user(self, request: operations.GetAssignedRolesForUserRequest) -> operations.GetAssignedRolesForUserResponse: r"""getAssignedRolesForUser Get list of assigned roles by user id """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.GetAssignedRolesForUserRequest, base_url, '/v1/permissions/assignments/{userId}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.security_client - client = self._security_client - - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.GetAssignedRolesForUserResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[list[str]]) + out = utils.unmarshal_json(http_res.text, Optional[List[str]]) res.assignments = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def list_all_assignments(self) -> operations.ListAllAssignmentsResponse: r"""listAllAssignments Returns list of all assignments in organization """ - base_url = self._server_url - - url = base_url.removesuffix('/') + '/v1/permissions/assignments' + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + url = base_url + '/v1/permissions/assignments' + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.ListAllAssignmentsResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) @@ -118,21 +124,26 @@ def list_all_assignments(self) -> operations.ListAllAssignmentsResponse: if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[operations.ListAllAssignments200ApplicationJSON]) res.list_all_assignments_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def remove_assignment(self, request: operations.RemoveAssignmentRequest) -> operations.RemoveAssignmentResponse: r"""removeAssignment Remove role assignment from user """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.RemoveAssignmentRequest, base_url, '/v1/permissions/assignments/{userId}/{roleId}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.security_client - client = self._security_client - - http_res = client.request('DELETE', url) + http_res = client.request('DELETE', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.RemoveAssignmentResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) @@ -141,6 +152,8 @@ def remove_assignment(self, request: operations.RemoveAssignmentRequest) -> oper if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[shared.Assignment]) res.assignment = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res diff --git a/permissions/src/epilot/models/__init__.py b/permissions/src/epilot/models/__init__.py index 889f8adcf..36628d6cc 100755 --- a/permissions/src/epilot/models/__init__.py +++ b/permissions/src/epilot/models/__init__.py @@ -1,2 +1,3 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" +# __init__.py diff --git a/permissions/src/epilot/models/errors/__init__.py b/permissions/src/epilot/models/errors/__init__.py new file mode 100755 index 000000000..cfd848441 --- /dev/null +++ b/permissions/src/epilot/models/errors/__init__.py @@ -0,0 +1,4 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from .sdkerror import SDKError +__all__ = ["SDKError"] diff --git a/permissions/src/epilot/models/errors/sdkerror.py b/permissions/src/epilot/models/errors/sdkerror.py new file mode 100755 index 000000000..6bb02bbd6 --- /dev/null +++ b/permissions/src/epilot/models/errors/sdkerror.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests as requests_http + + +class SDKError(Exception): + """Represents an error returned by the API.""" + message: str + status_code: int + body: str + raw_response: requests_http.Response + + def __init__(self, message: str, status_code: int, body: str, raw_response: requests_http.Response): + self.message = message + self.status_code = status_code + self.body = body + self.raw_response = raw_response + + def __str__(self): + body = '' + if len(self.body) > 0: + body = f'\n{self.body}' + + return f'{self.message}: Status {self.status_code}{body}' diff --git a/permissions/src/epilot/models/operations/__init__.py b/permissions/src/epilot/models/operations/__init__.py index 28dd7873f..eb6201bc5 100755 --- a/permissions/src/epilot/models/operations/__init__.py +++ b/permissions/src/epilot/models/operations/__init__.py @@ -13,4 +13,4 @@ from .removeassignment import * from .searchroles import * -__all__ = ["AddAssignmentRequest","AddAssignmentResponse","AssignRolesRequest","AssignRolesResponse","DeleteRoleRequest","DeleteRoleResponse","GetAssignedRolesForUserRequest","GetAssignedRolesForUserResponse","GetRoleRequest","GetRoleResponse","ListAllAssignments200ApplicationJSON","ListAllAssignmentsResponse","ListAllRoles200ApplicationJSON","ListAllRolesResponse","ListCurrentRoles200ApplicationJSON","ListCurrentRolesResponse","PutRoleRequest","PutRoleRequestBody1","PutRoleRequestBody1TypeEnum","PutRoleRequestBody2","PutRoleRequestBody2TypeEnum","PutRoleRequestBody3","PutRoleRequestBody3TypeEnum","PutRoleRequestBody4","PutRoleRequestBody4TypeEnum","PutRoleResponse","RefreshPermissionsResponse","RemoveAssignmentRequest","RemoveAssignmentResponse","SearchRoles200ApplicationJSON","SearchRolesResponse"] +__all__ = ["AddAssignmentRequest","AddAssignmentResponse","AssignRolesRequest","AssignRolesResponse","DeleteRoleRequest","DeleteRoleResponse","GetAssignedRolesForUserRequest","GetAssignedRolesForUserResponse","GetRoleRequest","GetRoleResponse","ListAllAssignments200ApplicationJSON","ListAllAssignmentsResponse","ListAllRoles200ApplicationJSON","ListAllRolesResponse","ListCurrentRoles200ApplicationJSON","ListCurrentRolesResponse","PutRoleRequest","PutRoleResponse","RefreshPermissionsResponse","RemoveAssignmentRequest","RemoveAssignmentResponse","SearchRoles200ApplicationJSON","SearchRolesResponse"] diff --git a/permissions/src/epilot/models/operations/addassignment.py b/permissions/src/epilot/models/operations/addassignment.py index 3748607b6..3edbb22b9 100755 --- a/permissions/src/epilot/models/operations/addassignment.py +++ b/permissions/src/epilot/models/operations/addassignment.py @@ -9,17 +9,21 @@ @dataclasses.dataclass class AddAssignmentRequest: + role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) + user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - + + @dataclasses.dataclass class AddAssignmentResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" assignment: Optional[shared_assignment.Assignment] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + + diff --git a/permissions/src/epilot/models/operations/assignroles.py b/permissions/src/epilot/models/operations/assignroles.py index 937f84599..41d813d9f 100755 --- a/permissions/src/epilot/models/operations/assignroles.py +++ b/permissions/src/epilot/models/operations/assignroles.py @@ -3,22 +3,26 @@ from __future__ import annotations import dataclasses import requests as requests_http -from typing import Optional +from typing import List, Optional @dataclasses.dataclass class AssignRolesRequest: + user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) + request_body: Optional[List[str]] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) - user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - request_body: Optional[list[str]] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) - + + @dataclasses.dataclass class AssignRolesResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + assignments: Optional[List[str]] = dataclasses.field(default=None) + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - assignments: Optional[list[str]] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/deleterole.py b/permissions/src/epilot/models/operations/deleterole.py index fb133d553..dfaf1b4ba 100755 --- a/permissions/src/epilot/models/operations/deleterole.py +++ b/permissions/src/epilot/models/operations/deleterole.py @@ -3,21 +3,29 @@ from __future__ import annotations import dataclasses import requests as requests_http -from typing import Any, Optional +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole +from typing import Optional, Union @dataclasses.dataclass class DeleteRoleRequest: + role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - + + @dataclasses.dataclass class DeleteRoleResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + role: Optional[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]] = dataclasses.field(default=None) + r"""ok""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - role: Optional[Any] = dataclasses.field(default=None) - r"""ok""" - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/getassignedrolesforuser.py b/permissions/src/epilot/models/operations/getassignedrolesforuser.py index adcb672fb..5aa86f481 100755 --- a/permissions/src/epilot/models/operations/getassignedrolesforuser.py +++ b/permissions/src/epilot/models/operations/getassignedrolesforuser.py @@ -3,21 +3,25 @@ from __future__ import annotations import dataclasses import requests as requests_http -from typing import Optional +from typing import List, Optional @dataclasses.dataclass class GetAssignedRolesForUserRequest: + user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - + + @dataclasses.dataclass class GetAssignedRolesForUserResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + assignments: Optional[List[str]] = dataclasses.field(default=None) + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - assignments: Optional[list[str]] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/getrole.py b/permissions/src/epilot/models/operations/getrole.py index 3091ee262..64e6ee61e 100755 --- a/permissions/src/epilot/models/operations/getrole.py +++ b/permissions/src/epilot/models/operations/getrole.py @@ -3,21 +3,29 @@ from __future__ import annotations import dataclasses import requests as requests_http -from typing import Any, Optional +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole +from typing import Optional, Union @dataclasses.dataclass class GetRoleRequest: + role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - + + @dataclasses.dataclass class GetRoleResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + role: Optional[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]] = dataclasses.field(default=None) + r"""ok""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - role: Optional[Any] = dataclasses.field(default=None) - r"""ok""" - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/listallassignments.py b/permissions/src/epilot/models/operations/listallassignments.py index 5f538ab14..800161ac9 100755 --- a/permissions/src/epilot/models/operations/listallassignments.py +++ b/permissions/src/epilot/models/operations/listallassignments.py @@ -6,23 +6,27 @@ from ..shared import assignment as shared_assignment from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Optional +from typing import List, Optional @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class ListAllAssignments200ApplicationJSON: r"""ok""" + assignments: Optional[List[shared_assignment.Assignment]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('assignments'), 'exclude': lambda f: f is None }}) - assignments: Optional[list[shared_assignment.Assignment]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('assignments'), 'exclude': lambda f: f is None }}) - + + @dataclasses.dataclass class ListAllAssignmentsResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" list_all_assignments_200_application_json_object: Optional[ListAllAssignments200ApplicationJSON] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + + diff --git a/permissions/src/epilot/models/operations/listallroles.py b/permissions/src/epilot/models/operations/listallroles.py index 3729090b5..bdc8468fb 100755 --- a/permissions/src/epilot/models/operations/listallroles.py +++ b/permissions/src/epilot/models/operations/listallroles.py @@ -3,25 +3,33 @@ from __future__ import annotations import dataclasses import requests as requests_http +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Any, Optional +from typing import List, Optional, Union @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class ListAllRoles200ApplicationJSON: r"""ok""" + roles: Optional[List[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) - roles: Optional[list[Any]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) - + + @dataclasses.dataclass class ListAllRolesResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" list_all_roles_200_application_json_object: Optional[ListAllRoles200ApplicationJSON] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + + diff --git a/permissions/src/epilot/models/operations/listcurrentroles.py b/permissions/src/epilot/models/operations/listcurrentroles.py index ac36bd0ab..874f2a454 100755 --- a/permissions/src/epilot/models/operations/listcurrentroles.py +++ b/permissions/src/epilot/models/operations/listcurrentroles.py @@ -3,25 +3,33 @@ from __future__ import annotations import dataclasses import requests as requests_http +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Any, Optional +from typing import List, Optional, Union @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class ListCurrentRoles200ApplicationJSON: r"""ok""" + roles: Optional[List[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) - roles: Optional[list[Any]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) - + + @dataclasses.dataclass class ListCurrentRolesResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" list_current_roles_200_application_json_object: Optional[ListCurrentRoles200ApplicationJSON] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + + diff --git a/permissions/src/epilot/models/operations/putrole.py b/permissions/src/epilot/models/operations/putrole.py index ac66a51e6..6f50100f4 100755 --- a/permissions/src/epilot/models/operations/putrole.py +++ b/permissions/src/epilot/models/operations/putrole.py @@ -2,123 +2,32 @@ from __future__ import annotations import dataclasses -import dateutil.parser import requests as requests_http -from ..shared import grant as shared_grant -from dataclasses_json import Undefined, dataclass_json -from datetime import datetime -from enum import Enum -from epilot import utils -from marshmallow import fields -from typing import Any, Optional +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import rolepayload as shared_rolepayload +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole +from typing import Optional, Union -class PutRoleRequestBody4TypeEnum(str, Enum): - PARTNER_ROLE = "partner_role" - -@dataclass_json(undefined=Undefined.EXCLUDE) -@dataclasses.dataclass -class PutRoleRequestBody4: - r"""A role that appears in another organization's role list that can be assigned but not modified by the partner organization.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" - id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" - organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" - slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: PutRoleRequestBody4TypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - partner_org_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('partner_org_id'), 'exclude': lambda f: f is None }}) - -class PutRoleRequestBody3TypeEnum(str, Enum): - SHARE_ROLE = "share_role" - - -@dataclass_json(undefined=Undefined.EXCLUDE) -@dataclasses.dataclass -class PutRoleRequestBody3: - r"""A role that can be assigned to users in other organizations for sharing purposes.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" - id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" - organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" - slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: PutRoleRequestBody3TypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - -class PutRoleRequestBody2TypeEnum(str, Enum): - ORG_ROLE = "org_role" - - -@dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass -class PutRoleRequestBody2: - r"""A role automatically applied to all users in an organization.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" - id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" - organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" - slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: PutRoleRequestBody2TypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" +class PutRoleRequest: + role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) + role_payload: Optional[Union[shared_rolepayload.RolePayload1, shared_rolepayload.RolePayload2, shared_rolepayload.RolePayload3, shared_rolepayload.RolePayload4]] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) -class PutRoleRequestBody1TypeEnum(str, Enum): - USER_ROLE = "user_role" -@dataclass_json(undefined=Undefined.EXCLUDE) -@dataclasses.dataclass -class PutRoleRequestBody1: - r"""A standard user role. Must be explicitly assigned to users.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" - id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" - name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" - organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" - slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: PutRoleRequestBody1TypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - - -@dataclasses.dataclass -class PutRoleRequest: - - role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - request_body: Optional[Any] = dataclasses.field(default=None, metadata={'request': { 'media_type': 'application/json' }}) - @dataclasses.dataclass class PutRoleResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + role: Optional[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]] = dataclasses.field(default=None) + r"""ok""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - role: Optional[Any] = dataclasses.field(default=None) - r"""ok""" - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/refreshpermissions.py b/permissions/src/epilot/models/operations/refreshpermissions.py index 27b56b681..71fef1100 100755 --- a/permissions/src/epilot/models/operations/refreshpermissions.py +++ b/permissions/src/epilot/models/operations/refreshpermissions.py @@ -8,8 +8,11 @@ @dataclasses.dataclass class RefreshPermissionsResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + diff --git a/permissions/src/epilot/models/operations/removeassignment.py b/permissions/src/epilot/models/operations/removeassignment.py index 5fc8d5ba5..2645e34e5 100755 --- a/permissions/src/epilot/models/operations/removeassignment.py +++ b/permissions/src/epilot/models/operations/removeassignment.py @@ -9,17 +9,21 @@ @dataclasses.dataclass class RemoveAssignmentRequest: + role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) + user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - role_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'roleId', 'style': 'simple', 'explode': False }}) - user_id: str = dataclasses.field(metadata={'path_param': { 'field_name': 'userId', 'style': 'simple', 'explode': False }}) - + + @dataclasses.dataclass class RemoveAssignmentResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" assignment: Optional[shared_assignment.Assignment] = dataclasses.field(default=None) - r"""ok""" - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) - \ No newline at end of file + r"""ok""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" + + diff --git a/permissions/src/epilot/models/operations/searchroles.py b/permissions/src/epilot/models/operations/searchroles.py index 473d7c36e..99f07ddf9 100755 --- a/permissions/src/epilot/models/operations/searchroles.py +++ b/permissions/src/epilot/models/operations/searchroles.py @@ -3,26 +3,34 @@ from __future__ import annotations import dataclasses import requests as requests_http +from ..shared import orgrole as shared_orgrole +from ..shared import partnerrole as shared_partnerrole +from ..shared import sharerole as shared_sharerole +from ..shared import userrole as shared_userrole from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Any, Optional +from typing import List, Optional, Union @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class SearchRoles200ApplicationJSON: r"""ok""" + hits: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('hits'), 'exclude': lambda f: f is None }}) + results: Optional[List[Union[shared_userrole.UserRole, shared_orgrole.OrgRole, shared_sharerole.ShareRole, shared_partnerrole.PartnerRole]]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('results'), 'exclude': lambda f: f is None }}) - hits: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('hits'), 'exclude': lambda f: f is None }}) - results: Optional[list[Any]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('results'), 'exclude': lambda f: f is None }}) - + + @dataclasses.dataclass class SearchRolesResponse: - - content_type: str = dataclasses.field() - status_code: int = dataclasses.field() - raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None) + r"""Raw HTTP response; suitable for custom response parsing""" search_roles_200_application_json_object: Optional[SearchRoles200ApplicationJSON] = dataclasses.field(default=None) - r"""ok""" - \ No newline at end of file + r"""ok""" + + diff --git a/permissions/src/epilot/models/shared/__init__.py b/permissions/src/epilot/models/shared/__init__.py index e7b107624..9736a9774 100755 --- a/permissions/src/epilot/models/shared/__init__.py +++ b/permissions/src/epilot/models/shared/__init__.py @@ -1,13 +1,14 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" from .assignment import * -from .equalscondition import * from .grant import * +from .grantcondition import * from .orgrole import * from .partnerrole import * +from .rolepayload import * from .rolesearchinput import * from .security import * from .sharerole import * from .userrole import * -__all__ = ["Assignment","EqualsCondition","EqualsConditionOperationEnum","Grant","GrantEffectEnum","OrgRole","OrgRoleTypeEnum","PartnerRole","PartnerRoleTypeEnum","RoleSearchInput","Security","ShareRole","ShareRoleTypeEnum","UserRole","UserRoleTypeEnum"] +__all__ = ["Assignment","Grant","GrantCondition","GrantConditionEqualsCondition","GrantConditionEqualsConditionOperation","GrantEffect","OrgRole","OrgRoleType","PartnerRole","PartnerRoleType","RolePayload","RolePayload1","RolePayload1Type","RolePayload2","RolePayload2Type","RolePayload3","RolePayload3Type","RolePayload4","RolePayload4Type","RoleSearchInput","Security","ShareRole","ShareRoleType","UserRole","UserRoleType"] diff --git a/permissions/src/epilot/models/shared/assignment.py b/permissions/src/epilot/models/shared/assignment.py index cb4267477..572cf540a 100755 --- a/permissions/src/epilot/models/shared/assignment.py +++ b/permissions/src/epilot/models/shared/assignment.py @@ -4,15 +4,15 @@ import dataclasses from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Optional +from typing import List, Optional @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class Assignment: r"""A role attached to an user""" - - roles: Optional[list[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) + roles: Optional[List[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('roles'), 'exclude': lambda f: f is None }}) user_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('user_id'), 'exclude': lambda f: f is None }}) - r"""Id of a user""" - \ No newline at end of file + r"""Id of a user""" + + diff --git a/permissions/src/epilot/models/shared/equalscondition.py b/permissions/src/epilot/models/shared/equalscondition.py deleted file mode 100755 index 86a025c17..000000000 --- a/permissions/src/epilot/models/shared/equalscondition.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" - -from __future__ import annotations -import dataclasses -from dataclasses_json import Undefined, dataclass_json -from enum import Enum -from epilot import utils -from typing import Any - -class EqualsConditionOperationEnum(str, Enum): - EQUALS = "equals" - - -@dataclass_json(undefined=Undefined.EXCLUDE) -@dataclasses.dataclass -class EqualsCondition: - r"""Check if attribute equals to any of the values""" - - attribute: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('attribute') }}) - operation: EqualsConditionOperationEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('operation') }}) - values: list[Any] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('values') }}) - \ No newline at end of file diff --git a/permissions/src/epilot/models/shared/grant.py b/permissions/src/epilot/models/shared/grant.py index 2306b7a20..22333db30 100755 --- a/permissions/src/epilot/models/shared/grant.py +++ b/permissions/src/epilot/models/shared/grant.py @@ -2,22 +2,23 @@ from __future__ import annotations import dataclasses +from ..shared import grantcondition as shared_grantcondition from dataclasses_json import Undefined, dataclass_json from enum import Enum from epilot import utils -from typing import Any, Optional +from typing import List, Optional, Union -class GrantEffectEnum(str, Enum): - ALLOW = "allow" - DENY = "deny" +class GrantEffect(str, Enum): + ALLOW = 'allow' + DENY = 'deny' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class Grant: + action: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('action') }}) + conditions: Optional[List[Union[shared_grantcondition.GrantConditionEqualsCondition]]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('conditions'), 'exclude': lambda f: f is None }}) + effect: Optional[GrantEffect] = dataclasses.field(default=GrantEffect.ALLOW, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('effect'), 'exclude': lambda f: f is None }}) + resource: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('resource'), 'exclude': lambda f: f is None }}) - action: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('action') }}) - conditions: Optional[list[Any]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('conditions'), 'exclude': lambda f: f is None }}) - effect: Optional[GrantEffectEnum] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('effect'), 'exclude': lambda f: f is None }}) - resource: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('resource'), 'exclude': lambda f: f is None }}) - \ No newline at end of file + diff --git a/permissions/src/epilot/models/shared/grantcondition.py b/permissions/src/epilot/models/shared/grantcondition.py new file mode 100755 index 000000000..31b78b1a2 --- /dev/null +++ b/permissions/src/epilot/models/shared/grantcondition.py @@ -0,0 +1,27 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +from dataclasses_json import Undefined, dataclass_json +from enum import Enum +from epilot import utils +from typing import Any, List + +class GrantConditionEqualsConditionOperation(str, Enum): + EQUALS = 'equals' + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GrantConditionEqualsCondition: + r"""Check if attribute equals to any of the values""" + attribute: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('attribute') }}) + operation: GrantConditionEqualsConditionOperation = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('operation') }}) + values: List[Any] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('values') }}) + + + + +@dataclasses.dataclass +class GrantCondition: + pass diff --git a/permissions/src/epilot/models/shared/orgrole.py b/permissions/src/epilot/models/shared/orgrole.py index ca4b05bdc..3551e1c5b 100755 --- a/permissions/src/epilot/models/shared/orgrole.py +++ b/permissions/src/epilot/models/shared/orgrole.py @@ -8,29 +8,28 @@ from datetime import datetime from enum import Enum from epilot import utils -from marshmallow import fields -from typing import Optional +from typing import List, Optional -class OrgRoleTypeEnum(str, Enum): - ORG_ROLE = "org_role" +class OrgRoleType(str, Enum): + ORG_ROLE = 'org_role' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class OrgRole: r"""A role automatically applied to all users in an organization.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" + r"""Format: :""" name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" + r"""Human-friendly name for the role""" organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" + r"""Id of an organization""" slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: OrgRoleTypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - \ No newline at end of file + r"""URL-friendly name for the role""" + type: OrgRoleType = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + diff --git a/permissions/src/epilot/models/shared/partnerrole.py b/permissions/src/epilot/models/shared/partnerrole.py index 6258bf9fe..60819871b 100755 --- a/permissions/src/epilot/models/shared/partnerrole.py +++ b/permissions/src/epilot/models/shared/partnerrole.py @@ -8,30 +8,29 @@ from datetime import datetime from enum import Enum from epilot import utils -from marshmallow import fields -from typing import Optional +from typing import List, Optional -class PartnerRoleTypeEnum(str, Enum): - PARTNER_ROLE = "partner_role" +class PartnerRoleType(str, Enum): + PARTNER_ROLE = 'partner_role' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class PartnerRole: r"""A role that appears in another organization's role list that can be assigned but not modified by the partner organization.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" + r"""Format: :""" name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" + r"""Human-friendly name for the role""" organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" + r"""Id of an organization""" slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: PartnerRoleTypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - partner_org_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('partner_org_id'), 'exclude': lambda f: f is None }}) - \ No newline at end of file + r"""URL-friendly name for the role""" + type: PartnerRoleType = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + partner_org_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('partner_org_id'), 'exclude': lambda f: f is None }}) + + diff --git a/permissions/src/epilot/models/shared/rolepayload.py b/permissions/src/epilot/models/shared/rolepayload.py new file mode 100755 index 000000000..ebeb6cd9d --- /dev/null +++ b/permissions/src/epilot/models/shared/rolepayload.py @@ -0,0 +1,113 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import dateutil.parser +from ..shared import grant as shared_grant +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from enum import Enum +from epilot import utils +from typing import List, Optional + +class RolePayload4Type(str, Enum): + PARTNER_ROLE = 'partner_role' + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class RolePayload4: + r"""A role that appears in another organization's role list that can be assigned but not modified by the partner organization.""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" + id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""Format: :""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""Human-friendly name for the role""" + organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) + r"""Id of an organization""" + slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) + r"""URL-friendly name for the role""" + type: RolePayload4Type = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + partner_org_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('partner_org_id'), 'exclude': lambda f: f is None }}) + + + +class RolePayload3Type(str, Enum): + SHARE_ROLE = 'share_role' + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class RolePayload3: + r"""A role that can be assigned to users in other organizations for sharing purposes.""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" + id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""Format: :""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""Human-friendly name for the role""" + organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) + r"""Id of an organization""" + slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) + r"""URL-friendly name for the role""" + type: RolePayload3Type = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + + +class RolePayload2Type(str, Enum): + ORG_ROLE = 'org_role' + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class RolePayload2: + r"""A role automatically applied to all users in an organization.""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" + id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""Format: :""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""Human-friendly name for the role""" + organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) + r"""Id of an organization""" + slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) + r"""URL-friendly name for the role""" + type: RolePayload2Type = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + + +class RolePayload1Type(str, Enum): + USER_ROLE = 'user_role' + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class RolePayload1: + r"""A standard user role. Must be explicitly assigned to users.""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" + id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) + r"""Format: :""" + name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) + r"""Human-friendly name for the role""" + organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) + r"""Id of an organization""" + slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) + r"""URL-friendly name for the role""" + type: RolePayload1Type = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + + + +@dataclasses.dataclass +class RolePayload: + pass diff --git a/permissions/src/epilot/models/shared/rolesearchinput.py b/permissions/src/epilot/models/shared/rolesearchinput.py index 6509274b9..869a091e3 100755 --- a/permissions/src/epilot/models/shared/rolesearchinput.py +++ b/permissions/src/epilot/models/shared/rolesearchinput.py @@ -4,23 +4,23 @@ import dataclasses from dataclasses_json import Undefined, dataclass_json from epilot import utils -from typing import Optional +from typing import List, Optional @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class RoleSearchInput: - - limit: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('limit'), 'exclude': lambda f: f is None }}) - r"""The Number of roles to return""" - offset: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('offset'), 'exclude': lambda f: f is None }}) - r"""The number of roles to skip before starting to collect the result set""" - org_ids: Optional[list[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('org_ids'), 'exclude': lambda f: f is None }}) - r"""List of organization ids to filter by""" + limit: Optional[float] = dataclasses.field(default=50, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('limit'), 'exclude': lambda f: f is None }}) + r"""The Number of roles to return""" + offset: Optional[float] = dataclasses.field(default=0, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('offset'), 'exclude': lambda f: f is None }}) + r"""The number of roles to skip before starting to collect the result set""" + org_ids: Optional[List[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('org_ids'), 'exclude': lambda f: f is None }}) + r"""List of organization ids to filter by""" query: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('query'), 'exclude': lambda f: f is None }}) - r"""Input to search across fields""" - role_ids: Optional[list[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('role_ids'), 'exclude': lambda f: f is None }}) - r"""List of role ids to filter by""" - slugs: Optional[list[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slugs'), 'exclude': lambda f: f is None }}) - r"""List of role slugs to filter by""" - \ No newline at end of file + r"""Input to search across fields""" + role_ids: Optional[List[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('role_ids'), 'exclude': lambda f: f is None }}) + r"""List of role ids to filter by""" + slugs: Optional[List[str]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slugs'), 'exclude': lambda f: f is None }}) + r"""List of role slugs to filter by""" + + diff --git a/permissions/src/epilot/models/shared/security.py b/permissions/src/epilot/models/shared/security.py index 0dedc5e9a..95a8719c2 100755 --- a/permissions/src/epilot/models/shared/security.py +++ b/permissions/src/epilot/models/shared/security.py @@ -7,7 +7,7 @@ @dataclasses.dataclass class Security: + epilot_auth: Optional[str] = dataclasses.field(default=None, metadata={'security': { 'scheme': True, 'type': 'http', 'sub_type': 'bearer', 'field_name': 'Authorization' }}) + epilot_org: Optional[str] = dataclasses.field(default=None, metadata={'security': { 'scheme': True, 'type': 'apiKey', 'sub_type': 'header', 'field_name': 'x-epilot-org-id' }}) - epilot_auth: Optional[str] = dataclasses.field(default=None, metadata={'security': { 'scheme': True, 'type': 'http', 'sub_type': 'bearer', 'field_name': 'Authorization' }}) - epilot_org: Optional[str] = dataclasses.field(default=None, metadata={'security': { 'scheme': True, 'type': 'apiKey', 'sub_type': 'header', 'field_name': 'x-epilot-org-id' }}) - \ No newline at end of file + diff --git a/permissions/src/epilot/models/shared/sharerole.py b/permissions/src/epilot/models/shared/sharerole.py index fc54c73ef..5c4bb6c6a 100755 --- a/permissions/src/epilot/models/shared/sharerole.py +++ b/permissions/src/epilot/models/shared/sharerole.py @@ -8,29 +8,28 @@ from datetime import datetime from enum import Enum from epilot import utils -from marshmallow import fields -from typing import Optional +from typing import List, Optional -class ShareRoleTypeEnum(str, Enum): - SHARE_ROLE = "share_role" +class ShareRoleType(str, Enum): + SHARE_ROLE = 'share_role' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class ShareRole: r"""A role that can be assigned to users in other organizations for sharing purposes.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" + r"""Format: :""" name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" + r"""Human-friendly name for the role""" organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" + r"""Id of an organization""" slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: ShareRoleTypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - \ No newline at end of file + r"""URL-friendly name for the role""" + type: ShareRoleType = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + diff --git a/permissions/src/epilot/models/shared/userrole.py b/permissions/src/epilot/models/shared/userrole.py index bdf6d71c7..a5a7a93bc 100755 --- a/permissions/src/epilot/models/shared/userrole.py +++ b/permissions/src/epilot/models/shared/userrole.py @@ -8,29 +8,28 @@ from datetime import datetime from enum import Enum from epilot import utils -from marshmallow import fields -from typing import Optional +from typing import List, Optional -class UserRoleTypeEnum(str, Enum): - USER_ROLE = "user_role" +class UserRoleType(str, Enum): + USER_ROLE = 'user_role' @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass class UserRole: r"""A standard user role. Must be explicitly assigned to users.""" - - grants: list[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) - r"""List of grants (permissions) applied to the role""" + grants: List[shared_grant.Grant] = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('grants') }}) + r"""List of grants (permissions) applied to the role""" id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id') }}) - r"""Format: :""" + r"""Format: :""" name: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name') }}) - r"""Human-friendly name for the role""" + r"""Human-friendly name for the role""" organization_id: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('organization_id') }}) - r"""Id of an organization""" + r"""Id of an organization""" slug: str = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug') }}) - r"""URL-friendly name for the role""" - type: UserRoleTypeEnum = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) - expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'mm_field': fields.DateTime(format='iso'), 'exclude': lambda f: f is None }}) - r"""date and time then the role will expire""" - \ No newline at end of file + r"""URL-friendly name for the role""" + type: UserRoleType = dataclasses.field(metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type') }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expires_at'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + r"""date and time then the role will expire""" + + diff --git a/permissions/src/epilot/roles.py b/permissions/src/epilot/roles.py index bfd3fa55d..b186fc47f 100755 --- a/permissions/src/epilot/roles.py +++ b/permissions/src/epilot/roles.py @@ -1,85 +1,88 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" -import requests as requests_http -from . import utils -from epilot.models import operations, shared -from typing import Any, Optional +from .sdkconfiguration import SDKConfiguration +from epilot import utils +from epilot.models import errors, operations, shared +from typing import Optional, Union class Roles: r"""Manage roles and grants""" - _client: requests_http.Session - _security_client: requests_http.Session - _server_url: str - _language: str - _sdk_version: str - _gen_version: str - - def __init__(self, client: requests_http.Session, security_client: requests_http.Session, server_url: str, language: str, sdk_version: str, gen_version: str) -> None: - self._client = client - self._security_client = security_client - self._server_url = server_url - self._language = language - self._sdk_version = sdk_version - self._gen_version = gen_version + sdk_configuration: SDKConfiguration + + def __init__(self, sdk_config: SDKConfiguration) -> None: + self.sdk_configuration = sdk_config + def delete_role(self, request: operations.DeleteRoleRequest) -> operations.DeleteRoleResponse: r"""deleteRole Delete role by id """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.DeleteRoleRequest, base_url, '/v1/permissions/roles/{roleId}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.security_client - client = self._security_client - - http_res = client.request('DELETE', url) + http_res = client.request('DELETE', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.DeleteRoleResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[Any]) + out = utils.unmarshal_json(http_res.text, Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]) res.role = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def get_role(self, request: operations.GetRoleRequest) -> operations.GetRoleResponse: r"""getRole Get role by id """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.GetRoleRequest, base_url, '/v1/permissions/roles/{roleId}', request) + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.security_client - client = self._security_client - - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.GetRoleResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[Any]) + out = utils.unmarshal_json(http_res.text, Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]) res.role = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def list_all_roles(self) -> operations.ListAllRolesResponse: r"""listAllRoles Returns list of all roles in organization """ - base_url = self._server_url - - url = base_url.removesuffix('/') + '/v1/permissions/roles' + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + url = base_url + '/v1/permissions/roles' + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.ListAllRolesResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) @@ -88,21 +91,26 @@ def list_all_roles(self) -> operations.ListAllRolesResponse: if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[operations.ListAllRoles200ApplicationJSON]) res.list_all_roles_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def list_current_roles(self) -> operations.ListCurrentRolesResponse: r"""listCurrentRoles Returns roles and grants assigned to current user """ - base_url = self._server_url - - url = base_url.removesuffix('/') + '/v1/permissions/me' + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + url = base_url + '/v1/permissions/me' + headers = {} + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.ListCurrentRolesResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) @@ -111,23 +119,27 @@ def list_current_roles(self) -> operations.ListCurrentRolesResponse: if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[operations.ListCurrentRoles200ApplicationJSON]) res.list_current_roles_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def put_role(self, request: operations.PutRoleRequest) -> operations.PutRoleResponse: r"""putRole Create or update role """ - base_url = self._server_url + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) url = utils.generate_url(operations.PutRoleRequest, base_url, '/v1/permissions/roles/{roleId}', request) - headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "request_body", 'json') + req_content_type, data, form = utils.serialize_request_body(request, "role_payload", False, True, 'json') if req_content_type not in ('multipart/form-data', 'multipart/mixed'): headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client http_res = client.request('PUT', url, data=data, files=form, headers=headers) content_type = http_res.headers.get('Content-Type') @@ -136,46 +148,51 @@ def put_role(self, request: operations.PutRoleRequest) -> operations.PutRoleResp if http_res.status_code == 200: if utils.match_content_type(content_type, 'application/json'): - out = utils.unmarshal_json(http_res.text, Optional[Any]) + out = utils.unmarshal_json(http_res.text, Optional[Union[shared.UserRole, shared.OrgRole, shared.ShareRole, shared.PartnerRole]]) res.role = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res + def refresh_permissions(self) -> operations.RefreshPermissionsResponse: r"""refreshPermissions Makes sure the user has a role in the organization """ - base_url = self._server_url - - url = base_url.removesuffix('/') + '/v1/permissions/refresh' + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + url = base_url + '/v1/permissions/refresh' + headers = {} + headers['Accept'] = '*/*' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client - http_res = client.request('GET', url) + http_res = client.request('GET', url, headers=headers) content_type = http_res.headers.get('Content-Type') res = operations.RefreshPermissionsResponse(status_code=http_res.status_code, content_type=content_type, raw_response=http_res) - if http_res.status_code == 200: - pass return res + def search_roles(self, request: shared.RoleSearchInput) -> operations.SearchRolesResponse: r"""searchRoles Search Roles """ - base_url = self._server_url - - url = base_url.removesuffix('/') + '/v1/permissions/roles:search' + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + url = base_url + '/v1/permissions/roles:search' headers = {} - req_content_type, data, form = utils.serialize_request_body(request, "request", 'json') + req_content_type, data, form = utils.serialize_request_body(request, "request", False, True, 'json') if req_content_type not in ('multipart/form-data', 'multipart/mixed'): headers['content-type'] = req_content_type + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent - client = self._security_client + client = self.sdk_configuration.security_client http_res = client.request('POST', url, data=data, files=form, headers=headers) content_type = http_res.headers.get('Content-Type') @@ -186,6 +203,8 @@ def search_roles(self, request: shared.RoleSearchInput) -> operations.SearchRole if utils.match_content_type(content_type, 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[operations.SearchRoles200ApplicationJSON]) res.search_roles_200_application_json_object = out + else: + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) return res diff --git a/permissions/src/epilot/sdk.py b/permissions/src/epilot/sdk.py index b498e6a08..a2f48def6 100755 --- a/permissions/src/epilot/sdk.py +++ b/permissions/src/epilot/sdk.py @@ -1,81 +1,61 @@ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" import requests as requests_http -from . import utils from .assignments import Assignments from .roles import Roles +from .sdkconfiguration import SDKConfiguration +from epilot import utils from epilot.models import shared - -SERVERS = [ - "https://permissions.sls.epilot.io", -] -"""Contains the list of servers available to the SDK""" +from typing import Dict class Epilot: - r"""Flexible Role-based Access Control for epilot""" + r"""Permissions API: Flexible Role-based Access Control for epilot""" assignments: Assignments r"""Assign roles to users""" roles: Roles r"""Manage roles and grants""" - _client: requests_http.Session - _security_client: requests_http.Session - _server_url: str = SERVERS[0] - _language: str = "python" - _sdk_version: str = "1.2.2" - _gen_version: str = "2.16.5" + sdk_configuration: SDKConfiguration def __init__(self, security: shared.Security = None, + server_idx: int = None, server_url: str = None, - url_params: dict[str, str] = None, - client: requests_http.Session = None + url_params: Dict[str, str] = None, + client: requests_http.Session = None, + retry_config: utils.RetryConfig = None ) -> None: """Instantiates the SDK configuring it with the provided parameters. :param security: The security details required for authentication :type security: shared.Security + :param server_idx: The index of the server to use for all operations + :type server_idx: int :param server_url: The server URL to use for all operations :type server_url: str :param url_params: Parameters to optionally template the server URL with - :type url_params: dict[str, str] + :type url_params: Dict[str, str] :param client: The requests.Session HTTP client to use for all operations - :type client: requests_http.Session + :type client: requests_http.Session + :param retry_config: The utils.RetryConfig to use globally + :type retry_config: utils.RetryConfig """ - self._client = requests_http.Session() + if client is None: + client = requests_http.Session() - if server_url is not None: - if url_params is not None: - self._server_url = utils.template_url(server_url, url_params) - else: - self._server_url = server_url - - if client is not None: - self._client = client + security_client = utils.configure_security_client(client, security) - self._security_client = utils.configure_security_client(self._client, security) + if server_url is not None: + if url_params is not None: + server_url = utils.template_url(server_url, url_params) + self.sdk_configuration = SDKConfiguration(client, security_client, server_url, server_idx, retry_config=retry_config) + self._init_sdks() def _init_sdks(self): - self.assignments = Assignments( - self._client, - self._security_client, - self._server_url, - self._language, - self._sdk_version, - self._gen_version - ) - - self.roles = Roles( - self._client, - self._security_client, - self._server_url, - self._language, - self._sdk_version, - self._gen_version - ) - + self.assignments = Assignments(self.sdk_configuration) + self.roles = Roles(self.sdk_configuration) \ No newline at end of file diff --git a/permissions/src/epilot/sdkconfiguration.py b/permissions/src/epilot/sdkconfiguration.py new file mode 100755 index 000000000..3da259373 --- /dev/null +++ b/permissions/src/epilot/sdkconfiguration.py @@ -0,0 +1,34 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests +from dataclasses import dataclass +from typing import Dict, Tuple +from .utils.retries import RetryConfig +from .utils import utils + + +SERVERS = [ + 'https://permissions.sls.epilot.io', +] +"""Contains the list of servers available to the SDK""" + +@dataclass +class SDKConfiguration: + client: requests.Session + security_client: requests.Session + server_url: str = '' + server_idx: int = 0 + language: str = 'python' + openapi_doc_version: str = '1.0.0' + sdk_version: str = '2.1.1' + gen_version: str = '2.173.0' + user_agent: str = 'speakeasy-sdk/python 2.1.1 2.173.0 1.0.0 epilot-permissions' + retry_config: RetryConfig = None + + def get_server_details(self) -> Tuple[str, Dict[str, str]]: + if self.server_url: + return utils.remove_suffix(self.server_url, '/'), {} + if self.server_idx is None: + self.server_idx = 0 + + return SERVERS[self.server_idx], {} diff --git a/permissions/src/epilot/utils/retries.py b/permissions/src/epilot/utils/retries.py index c6251d948..25f49a1f2 100755 --- a/permissions/src/epilot/utils/retries.py +++ b/permissions/src/epilot/utils/retries.py @@ -2,6 +2,7 @@ import random import time +from typing import List import requests @@ -24,16 +25,17 @@ class RetryConfig: backoff: BackoffStrategy retry_connection_errors: bool - def __init__(self, strategy: str, retry_connection_errors: bool): + def __init__(self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool): self.strategy = strategy + self.backoff = backoff self.retry_connection_errors = retry_connection_errors class Retries: config: RetryConfig - status_codes: list[str] + status_codes: List[str] - def __init__(self, config: RetryConfig, status_codes: list[str]): + def __init__(self, config: RetryConfig, status_codes: List[str]): self.config = config self.status_codes = status_codes diff --git a/permissions/src/epilot/utils/utils.py b/permissions/src/epilot/utils/utils.py index 9d4fba324..3ab126104 100755 --- a/permissions/src/epilot/utils/utils.py +++ b/permissions/src/epilot/utils/utils.py @@ -3,11 +3,14 @@ import base64 import json import re +import sys from dataclasses import Field, dataclass, fields, is_dataclass, make_dataclass from datetime import date, datetime +from decimal import Decimal from email.message import Message from enum import Enum -from typing import Any, Callable, Optional, Tuple, Union, get_args, get_origin +from typing import (Any, Callable, Dict, List, Optional, Tuple, Union, + get_args, get_origin) from xmlrpc.client import boolean import dateutil.parser @@ -17,14 +20,14 @@ class SecurityClient: client: requests.Session - query_params: dict[str, str] = {} + query_params: Dict[str, str] = {} def __init__(self, client: requests.Session): self.client = client def request(self, method, url, **kwargs): params = kwargs.get('params', {}) - kwargs["params"] = self.query_params | params + kwargs["params"] = {**self.query_params, **params} return self.client.request(method, url, **kwargs) @@ -67,7 +70,7 @@ def _parse_security_option(client: SecurityClient, option: dataclass): client, metadata, getattr(option, opt_field.name)) -def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme: any): +def _parse_security_scheme(client: SecurityClient, scheme_metadata: Dict, scheme: any): scheme_type = scheme_metadata.get('type') sub_type = scheme_metadata.get('sub_type') @@ -91,7 +94,7 @@ def _parse_security_scheme(client: SecurityClient, scheme_metadata: dict, scheme client, scheme_metadata, scheme_metadata, scheme) -def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: dict, security_metadata: dict, value: any): +def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: Dict, security_metadata: Dict, value: any): scheme_type = scheme_metadata.get('type') sub_type = scheme_metadata.get('sub_type') @@ -112,7 +115,8 @@ def _parse_security_scheme_value(client: SecurityClient, scheme_metadata: dict, client.client.headers[header_name] = value elif scheme_type == 'http': if sub_type == 'bearer': - client.client.headers[header_name] = value + client.client.headers[header_name] = value.lower().startswith( + 'bearer ') and value or f'Bearer {value}' else: raise Exception('not supported') else: @@ -141,7 +145,8 @@ def _parse_basic_auth_scheme(client: SecurityClient, scheme: dataclass): client.client.headers['Authorization'] = f'Basic {base64.b64encode(data).decode()}' -def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass, gbls: dict[str, dict[str, dict[str, Any]]] = None) -> str: +def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass, + gbls: Dict[str, Dict[str, Dict[str, Any]]] = None) -> str: path_param_fields: Tuple[Field, ...] = fields(clazz) for field in path_param_fields: request_metadata = field.metadata.get('request') @@ -152,71 +157,80 @@ def generate_url(clazz: type, server_url: str, path: str, path_params: dataclass if param_metadata is None: continue - if param_metadata.get('style', 'simple') == 'simple': - param = getattr( - path_params, field.name) if path_params is not None else None - param = _populate_from_globals( - field.name, param, 'pathParam', gbls) - - if param is None: - continue - - if isinstance(param, list): - pp_vals: list[str] = [] - for pp_val in param: - if pp_val is None: - continue - pp_vals.append(_val_to_string(pp_val)) - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - elif isinstance(param, dict): - pp_vals: list[str] = [] - for pp_key in param: - if param[pp_key] is None: - continue - if param_metadata.get('explode'): - pp_vals.append( - f"{pp_key}={_val_to_string(param[pp_key])}") - else: - pp_vals.append( - f"{pp_key},{_val_to_string(param[pp_key])}") - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - elif not isinstance(param, (str, int, float, complex, bool)): - pp_vals: list[str] = [] - param_fields: Tuple[Field, ...] = fields(param) - for param_field in param_fields: - param_value_metadata = param_field.metadata.get( - 'path_param') - if not param_value_metadata: - continue + param = getattr( + path_params, field.name) if path_params is not None else None + param = _populate_from_globals( + field.name, param, 'pathParam', gbls) - parm_name = param_value_metadata.get( - 'field_name', field.name) + if param is None: + continue - param_field_val = getattr(param, param_field.name) - if param_field_val is None: - continue - if param_metadata.get('explode'): - pp_vals.append( - f"{parm_name}={_val_to_string(param_field_val)}") - else: - pp_vals.append( - f"{parm_name},{_val_to_string(param_field_val)}") - path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) - else: + f_name = param_metadata.get("field_name", field.name) + serialization = param_metadata.get('serialization', '') + if serialization != '': + serialized_params = _get_serialized_params( + param_metadata, f_name, param) + for key, value in serialized_params.items(): path = path.replace( - '{' + param_metadata.get('field_name', field.name) + '}', _val_to_string(param), 1) + '{' + key + '}', value, 1) + else: + if param_metadata.get('style', 'simple') == 'simple': + if isinstance(param, List): + pp_vals: List[str] = [] + for pp_val in param: + if pp_val is None: + continue + pp_vals.append(_val_to_string(pp_val)) + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + elif isinstance(param, Dict): + pp_vals: List[str] = [] + for pp_key in param: + if param[pp_key] is None: + continue + if param_metadata.get('explode'): + pp_vals.append( + f"{pp_key}={_val_to_string(param[pp_key])}") + else: + pp_vals.append( + f"{pp_key},{_val_to_string(param[pp_key])}") + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + elif not isinstance(param, (str, int, float, complex, bool, Decimal)): + pp_vals: List[str] = [] + param_fields: Tuple[Field, ...] = fields(param) + for param_field in param_fields: + param_value_metadata = param_field.metadata.get( + 'path_param') + if not param_value_metadata: + continue + + parm_name = param_value_metadata.get( + 'field_name', field.name) + + param_field_val = getattr(param, param_field.name) + if param_field_val is None: + continue + if param_metadata.get('explode'): + pp_vals.append( + f"{parm_name}={_val_to_string(param_field_val)}") + else: + pp_vals.append( + f"{parm_name},{_val_to_string(param_field_val)}") + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', ",".join(pp_vals), 1) + else: + path = path.replace( + '{' + param_metadata.get('field_name', field.name) + '}', _val_to_string(param), 1) - return server_url.removesuffix("/") + path + return remove_suffix(server_url, '/') + path def is_optional(field): return get_origin(field) is Union and type(None) in get_args(field) -def template_url(url_with_params: str, params: dict[str, str]) -> str: +def template_url(url_with_params: str, params: Dict[str, str]) -> str: for key, value in params.items(): url_with_params = url_with_params.replace( '{' + key + '}', value) @@ -224,8 +238,9 @@ def template_url(url_with_params: str, params: dict[str, str]) -> str: return url_with_params -def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[str, dict[str, Any]]] = None) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} +def get_query_params(clazz: type, query_params: dataclass, gbls: Dict[str, Dict[str, Dict[str, Any]]] = None) -> Dict[ + str, List[str]]: + params: Dict[str, List[str]] = {} param_fields: Tuple[Field, ...] = fields(clazz) for field in param_fields: @@ -246,26 +261,33 @@ def get_query_params(clazz: type, query_params: dataclass, gbls: dict[str, dict[ f_name = metadata.get("field_name") serialization = metadata.get('serialization', '') if serialization != '': - params = params | _get_serialized_query_params( - metadata, f_name, value) + serialized_parms = _get_serialized_params(metadata, f_name, value) + for key, value in serialized_parms.items(): + if key in params: + params[key].extend(value) + else: + params[key] = [value] else: style = metadata.get('style', 'form') if style == 'deepObject': - params = params | _get_deep_object_query_params( - metadata, f_name, value) + params = {**params, **_get_deep_object_query_params( + metadata, f_name, value)} elif style == 'form': - params = params | _get_form_query_params( - metadata, f_name, value) + params = {**params, **_get_delimited_query_params( + metadata, f_name, value, ",")} + elif style == 'pipeDelimited': + params = {**params, **_get_delimited_query_params( + metadata, f_name, value, "|")} else: raise Exception('not yet implemented') return params -def get_headers(headers_params: dataclass) -> dict[str, str]: +def get_headers(headers_params: dataclass) -> Dict[str, str]: if headers_params is None: return {} - headers: dict[str, str] = {} + headers: Dict[str, str] = {} param_fields: Tuple[Field, ...] = fields(headers_params) for field in param_fields: @@ -282,8 +304,8 @@ def get_headers(headers_params: dataclass) -> dict[str, str]: return headers -def _get_serialized_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} +def _get_serialized_params(metadata: Dict, field_name: str, obj: any) -> Dict[str, str]: + params: Dict[str, str] = {} serialization = metadata.get('serialization', '') if serialization == 'json': @@ -292,8 +314,8 @@ def _get_serialized_query_params(metadata: dict, field_name: str, obj: any) -> d return params -def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} +def _get_deep_object_query_params(metadata: Dict, field_name: str, obj: any) -> Dict[str, List[str]]: + params: Dict[str, List[str]] = {} if obj is None: return params @@ -309,27 +331,30 @@ def _get_deep_object_query_params(metadata: dict, field_name: str, obj: any) -> if obj_val is None: continue - if isinstance(obj_val, list): + if isinstance(obj_val, List): for val in obj_val: if val is None: continue - if params.get(f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]') is None: - params[f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ + if params.get( + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]') is None: + params[ + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ ] params[ - f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'].append(_val_to_string(val)) + f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'].append( + _val_to_string(val)) else: params[ f'{metadata.get("field_name", field_name)}[{obj_param_metadata.get("field_name", obj_field.name)}]'] = [ _val_to_string(obj_val)] - elif isinstance(obj, dict): + elif isinstance(obj, Dict): for key, value in obj.items(): if value is None: continue - if isinstance(value, list): + if isinstance(value, List): for val in value: if val is None: continue @@ -355,28 +380,36 @@ def _get_query_param_field_name(obj_field: Field) -> str: return obj_param_metadata.get("field_name", obj_field.name) -def _get_form_query_params(metadata: dict, field_name: str, obj: any) -> dict[str, list[str]]: - return _populate_form(field_name, metadata.get("explode", True), obj, _get_query_param_field_name) +def _get_delimited_query_params(metadata: Dict, field_name: str, obj: any, delimiter: str) -> Dict[ + str, List[str]]: + return _populate_form(field_name, metadata.get("explode", True), obj, _get_query_param_field_name, delimiter) SERIALIZATION_METHOD_TO_CONTENT_TYPE = { - 'json': 'application/json', - 'form': 'application/x-www-form-urlencoded', + 'json': 'application/json', + 'form': 'application/x-www-form-urlencoded', 'multipart': 'multipart/form-data', - 'raw': 'application/octet-stream', - 'string': 'text/plain', + 'raw': 'application/octet-stream', + 'string': 'text/plain', } -def serialize_request_body(request: dataclass, request_field_name: str, serialization_method: str) -> Tuple[str, any, any]: +def serialize_request_body(request: dataclass, request_field_name: str, nullable: bool, optional: bool, serialization_method: str, encoder=None) -> Tuple[ + str, any, any]: if request is None: - return None, None, None, None + if not nullable and optional: + return None, None, None if not is_dataclass(request) or not hasattr(request, request_field_name): - return serialize_content_type(request_field_name, SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request) + return serialize_content_type(request_field_name, SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], + request, encoder) request_val = getattr(request, request_field_name) + if request_val is None: + if not nullable and optional: + return None, None, None + request_fields: Tuple[Field, ...] = fields(request) request_metadata = None @@ -388,12 +421,13 @@ def serialize_request_body(request: dataclass, request_field_name: str, serializ if request_metadata is None: raise Exception('invalid request type') - return serialize_content_type(request_field_name, request_metadata.get('media_type', 'application/octet-stream'), request_val) + return serialize_content_type(request_field_name, request_metadata.get('media_type', 'application/octet-stream'), + request_val) -def serialize_content_type(field_name: str, media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: +def serialize_content_type(field_name: str, media_type: str, request: dataclass, encoder=None) -> Tuple[str, any, List[List[any]]]: if re.match(r'(application|text)\/.*?\+*json.*', media_type) is not None: - return media_type, marshal_json(request), None + return media_type, marshal_json(request, encoder), None if re.match(r'multipart\/.*', media_type) is not None: return serialize_multipart_form(media_type, request) if re.match(r'application\/x-www-form-urlencoded.*', media_type) is not None: @@ -407,8 +441,8 @@ def serialize_content_type(field_name: str, media_type: str, request: dataclass) f"invalid request body type {type(request)} for mediaType {media_type}") -def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, list[list[any]]]: - form: list[list[any]] = [] +def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, any, List[List[any]]]: + form: List[List[any]] = [] request_fields = fields(request) for field in request_fields: @@ -449,7 +483,7 @@ def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, else: field_name = field_metadata.get( "field_name", field.name) - if isinstance(val, list): + if isinstance(val, List): for value in val: if value is None: continue @@ -460,8 +494,8 @@ def serialize_multipart_form(media_type: str, request: dataclass) -> Tuple[str, return media_type, None, form -def serialize_dict(original: dict, explode: bool, field_name, existing: Optional[dict[str, list[str]]]) -> dict[ - str, list[str]]: +def serialize_dict(original: Dict, explode: bool, field_name, existing: Optional[Dict[str, List[str]]]) -> Dict[ + str, List[str]]: if existing is None: existing = [] @@ -481,8 +515,8 @@ def serialize_dict(original: dict, explode: bool, field_name, existing: Optional return existing -def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: - form: dict[str, list[str]] = {} +def serialize_form_data(field_name: str, data: dataclass) -> Dict[str, any]: + form: Dict[str, List[str]] = {} if is_dataclass(data): for field in fields(data): @@ -500,12 +534,12 @@ def serialize_form_data(field_name: str, data: dataclass) -> dict[str, any]: form[field_name] = [marshal_json(val)] else: if metadata.get('style', 'form') == 'form': - form = form | _populate_form( - field_name, metadata.get('explode', True), val, _get_form_field_name) + form = {**form, **_populate_form( + field_name, metadata.get('explode', True), val, _get_form_field_name, ",")} else: raise Exception( f'Invalid form style for field {field.name}') - elif isinstance(data, dict): + elif isinstance(data, Dict): for key, value in data.items(): form[key] = [_val_to_string(value)] else: @@ -523,8 +557,9 @@ def _get_form_field_name(obj_field: Field) -> str: return obj_param_metadata.get("field_name", obj_field.name) -def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_func: Callable) -> dict[str, list[str]]: - params: dict[str, list[str]] = {} +def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_func: Callable, delimiter: str) -> \ + Dict[str, List[str]]: + params: Dict[str, List[str]] = {} if obj is None: return params @@ -546,11 +581,11 @@ def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_f params[obj_field_name] = [_val_to_string(val)] else: items.append( - f'{obj_field_name},{_val_to_string(val)}') + f'{obj_field_name}{delimiter}{_val_to_string(val)}') if len(items) > 0: - params[field_name] = [','.join(items)] - elif isinstance(obj, dict): + params[field_name] = [delimiter.join(items)] + elif isinstance(obj, Dict): items = [] for key, value in obj.items(): if value is None: @@ -559,11 +594,11 @@ def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_f if explode: params[key] = _val_to_string(value) else: - items.append(f'{key},{_val_to_string(value)}') + items.append(f'{key}{delimiter}{_val_to_string(value)}') if len(items) > 0: - params[field_name] = [','.join(items)] - elif isinstance(obj, list): + params[field_name] = [delimiter.join(items)] + elif isinstance(obj, List): items = [] for value in obj: @@ -578,7 +613,8 @@ def _populate_form(field_name: str, explode: boolean, obj: any, get_field_name_f items.append(_val_to_string(value)) if len(items) > 0: - params[field_name] = [','.join([str(item) for item in items])] + params[field_name] = [delimiter.join( + [str(item) for item in items])] else: params[field_name] = [_val_to_string(obj)] @@ -616,7 +652,7 @@ def _serialize_header(explode: bool, obj: any) -> str: if len(items) > 0: return ','.join(items) - elif isinstance(obj, dict): + elif isinstance(obj, Dict): items = [] for key, value in obj.items(): @@ -631,7 +667,7 @@ def _serialize_header(explode: bool, obj: any) -> str: if len(items) > 0: return ','.join([str(item) for item in items]) - elif isinstance(obj, list): + elif isinstance(obj, List): items = [] for value in obj: @@ -648,20 +684,28 @@ def _serialize_header(explode: bool, obj: any) -> str: return '' -def unmarshal_json(data, typ): - unmarhsal = make_dataclass('Unmarhsal', [('res', typ)], +def unmarshal_json(data, typ, decoder=None): + unmarshal = make_dataclass('Unmarshal', [('res', typ)], bases=(DataClassJsonMixin,)) json_dict = json.loads(data) - out = unmarhsal.from_dict({"res": json_dict}) - return out.res + try: + out = unmarshal.from_dict({"res": json_dict}) + except AttributeError as attr_err: + raise AttributeError( + f'unable to unmarshal {data} as {typ}') from attr_err + + return out.res if decoder is None else decoder(out.res) -def marshal_json(val): +def marshal_json(val, encoder=None): marshal = make_dataclass('Marshal', [('res', type(val))], bases=(DataClassJsonMixin,)) marshaller = marshal(res=val) json_dict = marshaller.to_dict() - return json.dumps(json_dict["res"]) + + val = json_dict["res"] if encoder is None else encoder(json_dict["res"]) + + return json.dumps(val) def match_content_type(content_type: str, pattern: str) -> boolean: @@ -705,6 +749,106 @@ def datefromisoformat(date_str: str): return dateutil.parser.parse(date_str).date() +def bigintencoder(optional: bool): + def bigintencode(val: int): + if optional and val is None: + return None + return str(val) + + return bigintencode + + +def bigintdecoder(val): + if isinstance(val, float): + raise ValueError(f"{val} is a float") + return int(val) + + +def decimalencoder(optional: bool, as_str: bool): + def decimalencode(val: Decimal): + if optional and val is None: + return None + + if as_str: + return str(val) + + return float(val) + + return decimalencode + + +def decimaldecoder(val): + return Decimal(str(val)) + + +def map_encoder(optional: bool, value_encoder: Callable): + def map_encode(val: Dict): + if optional and val is None: + return None + + encoded = {} + for key, value in val.items(): + encoded[key] = value_encoder(value) + + return encoded + + return map_encode + + +def map_decoder(value_decoder: Callable): + def map_decode(val: Dict): + decoded = {} + for key, value in val.items(): + decoded[key] = value_decoder(value) + + return decoded + + return map_decode + + +def list_encoder(optional: bool, value_encoder: Callable): + def list_encode(val: List): + if optional and val is None: + return None + + encoded = [] + for value in val: + encoded.append(value_encoder(value)) + + return encoded + + return list_encode + + +def list_decoder(value_decoder: Callable): + def list_decode(val: List): + decoded = [] + for value in val: + decoded.append(value_decoder(value)) + + return decoded + + return list_decode + +def union_encoder(all_encoders: Dict[str, Callable]): + def selective_encoder(val: any): + if type(val) in all_encoders: + return all_encoders[type(val)](val) + return val + return selective_encoder + +def union_decoder(all_decoders: List[Callable]): + def selective_decoder(val: any): + decoded = val + for decoder in all_decoders: + try: + decoded = decoder(val) + break + except (TypeError, ValueError): + continue + return decoded + return selective_decoder + def get_field_name(name): def override(_, _field_name=name): return _field_name @@ -718,12 +862,12 @@ def _val_to_string(val): if isinstance(val, datetime): return val.isoformat().replace('+00:00', 'Z') if isinstance(val, Enum): - return val.value + return str(val.value) return str(val) -def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: dict[str, dict[str, dict[str, Any]]]): +def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: Dict[str, Dict[str, Dict[str, Any]]]): if value is None and gbls is not None: if 'parameters' in gbls: if param_type in gbls['parameters']: @@ -733,3 +877,16 @@ def _populate_from_globals(param_name: str, value: any, param_type: str, gbls: d value = global_value return value + + +def decoder_with_discriminator(field_name): + def decode_fx(obj): + kls = getattr(sys.modules['sdk.models.shared'], obj[field_name]) + return unmarshal_json(json.dumps(obj), kls) + return decode_fx + + +def remove_suffix(input_string, suffix): + if suffix and input_string.endswith(suffix): + return input_string[:-len(suffix)] + return input_string