diff --git a/.mock/definition/__package__.yml b/.mock/definition/__package__.yml index 3013a3914..96876c561 100644 --- a/.mock/definition/__package__.yml +++ b/.mock/definition/__package__.yml @@ -1249,6 +1249,9 @@ types: project: type: integer docs: A unique integer value identifying this project. + recursive_scan: + type: optional + docs: Perform recursive scan regex_filter: type: optional docs: Cloud storage regex for filtering objects @@ -1325,6 +1328,9 @@ types: project: type: integer docs: A unique integer value identifying this project. + recursive_scan: + type: optional + docs: Perform recursive scan regex_filter: type: optional docs: Cloud storage regex for filtering objects @@ -1620,6 +1626,23 @@ types: docs: Last updated time source: openapi: openapi/openapi.yaml + ConfigurablePermissionOptionDefault: + discriminated: false + union: + - Role9E7Enum + - NullEnum + source: + openapi: openapi/openapi.yaml + inline: true + ConfigurablePermissionOption: + properties: + default: optional + label: optional + options: list + permission: string + tooltip: optional + source: + openapi: openapi/openapi.yaml ConvertedFormat: properties: export_type: @@ -2160,7 +2183,7 @@ types: occurs, contact the LEAP team for assistance with enabling custom scripts. default_role: - type: optional + type: optional docs: |- Default membership role for invited users @@ -2194,25 +2217,6 @@ types: quick view. source: openapi: openapi/openapi.yaml - DefaultRoleEnum: - enum: - - OW - - AD - - MA - - RE - - AN - - DI - - 'NO' - docs: |- - * `OW` - Owner - * `AD` - Administrator - * `MA` - Manager - * `RE` - Reviewer - * `AN` - Annotator - * `DI` - Deactivated - * `NO` - Not Activated - source: - openapi: openapi/openapi.yaml EditionEnum: enum: - Community @@ -3604,7 +3608,7 @@ types: * `MA` - Manager custom_scripts_enabled: string default_role: - type: optional + type: optional docs: |- Default membership role for invited users @@ -5698,6 +5702,35 @@ types: minLength: 1 source: openapi: openapi/openapi.yaml + OrganizationPermission: + properties: + default_role: string + id: integer + label: string + options: string + organization: integer + permission: + type: string + validation: + maxLength: 255 + roles: + type: optional> + docs: Explicit roles that have this permission within the organization. + tooltip: string + source: + openapi: openapi/openapi.yaml + OrganizationPermissionRequest: + properties: + permission: + type: string + validation: + minLength: 1 + maxLength: 255 + roles: + type: optional> + docs: Explicit roles that have this permission within the organization. + source: + openapi: openapi/openapi.yaml PaginatedAllRolesProjectListList: properties: count: integer diff --git a/.mock/definition/importStorage/azureSpi.yml b/.mock/definition/importStorage/azureSpi.yml index f88cad861..7ae699522 100644 --- a/.mock/definition/importStorage/azureSpi.yml +++ b/.mock/definition/importStorage/azureSpi.yml @@ -45,6 +45,7 @@ service: presign: true presign_ttl: 1 project: 1 + recursive_scan: true regex_filter: regex_filter status: initialized synchronizable: true @@ -91,6 +92,7 @@ service: presign: true presign_ttl: 1 project: 1 + recursive_scan: true regex_filter: regex_filter status: initialized synchronizable: true @@ -156,6 +158,7 @@ service: presign: true presign_ttl: 1 project: 1 + recursive_scan: true regex_filter: regex_filter status: initialized synchronizable: true @@ -245,6 +248,9 @@ service: project: type: optional docs: A unique integer value identifying this project. + recursive_scan: + type: optional + docs: Perform recursive scan regex_filter: type: optional docs: Cloud storage regex for filtering objects @@ -295,6 +301,7 @@ service: presign: true presign_ttl: 1 project: 1 + recursive_scan: true regex_filter: regex_filter status: initialized synchronizable: true @@ -342,6 +349,7 @@ service: presign: true presign_ttl: 1 project: 1 + recursive_scan: true regex_filter: regex_filter status: initialized synchronizable: true diff --git a/.mock/definition/organizations.yml b/.mock/definition/organizations.yml index 59cba9e71..4c0156410 100644 --- a/.mock/definition/organizations.yml +++ b/.mock/definition/organizations.yml @@ -200,7 +200,7 @@ service: will be raised. If this occurs, contact the LEAP team for assistance with enabling custom scripts. default_role: - type: optional + type: optional docs: |- Default membership role for invited users diff --git a/.mock/definition/organizations/permissions.yml b/.mock/definition/organizations/permissions.yml new file mode 100644 index 000000000..aaf7f88ca --- /dev/null +++ b/.mock/definition/organizations/permissions.yml @@ -0,0 +1,267 @@ +imports: + root: ../__package__.yml +service: + auth: false + base-path: '' + endpoints: + list: + path: /api/organizations/{id}/permissions + method: GET + auth: true + docs: >- + List all organization-level permission overrides for a given + organization. + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + display-name: List organization permission overrides + request: + name: PermissionsListRequest + query-parameters: + ordering: + type: optional + docs: Which field to use when ordering the results. + response: + docs: '' + type: list + examples: + - path-parameters: + id: 1 + response: + body: + - default_role: default_role + id: 1 + label: label + options: options + organization: 1 + permission: permission + roles: + - OW + tooltip: tooltip + audiences: + - public + create: + path: /api/organizations/{id}/permissions + method: POST + auth: true + docs: >- + Create a new organization-level permission override for a given + organization. + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + display-name: Create organization permission override + request: + body: root.OrganizationPermissionRequest + content-type: application/json + response: + docs: '' + type: root.OrganizationPermission + errors: + - root.BadRequestError + - root.ForbiddenError + examples: + - path-parameters: + id: 1 + request: + permission: permission + response: + body: + default_role: default_role + id: 1 + label: label + options: options + organization: 1 + permission: permission + roles: + - OW + tooltip: tooltip + audiences: + - public + get_options: + path: /api/organizations/{id}/permissions/options + method: GET + auth: true + docs: >- + Retrieve the list of configurable permission options (label, tooltip, + default role and allowed roles). + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + display-name: Get configurable permissions options + request: + name: PermissionsGetOptionsRequest + query-parameters: + ordering: + type: optional + docs: Which field to use when ordering the results. + response: + docs: '' + type: list + examples: + - path-parameters: + id: 1 + response: + body: + - default: OW + label: label + options: + - OW + permission: permission + tooltip: tooltip + audiences: + - public + get: + path: /api/organizations/{id}/permissions/{permission} + method: GET + auth: true + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + permission: string + display-name: Retrieve organization permission override + response: + docs: '' + type: root.OrganizationPermission + errors: + - root.ForbiddenError + - root.NotFoundError + examples: + - path-parameters: + id: 1 + permission: permission + response: + body: + default_role: default_role + id: 1 + label: label + options: options + organization: 1 + permission: permission + roles: + - OW + tooltip: tooltip + audiences: + - public + replace: + path: /api/organizations/{id}/permissions/{permission} + method: PUT + auth: true + docs: >- + Replace the organization-level permission override for a given + permission key. + source: + openapi: openapi/openapi.yaml + path-parameters: + id: + type: integer + docs: A unique integer value identifying this organization. + permission: + type: string + docs: Permission key to update within the organization. + display-name: Replace organization permission override + request: + body: root.OrganizationPermissionRequest + content-type: application/json + response: + docs: '' + type: root.OrganizationPermission + errors: + - root.BadRequestError + - root.ForbiddenError + - root.NotFoundError + examples: + - path-parameters: + id: 1 + permission: permission + request: + permission: permission + response: + body: + default_role: default_role + id: 1 + label: label + options: options + organization: 1 + permission: permission + roles: + - OW + tooltip: tooltip + audiences: + - public + delete: + path: /api/organizations/{id}/permissions/{permission} + method: DELETE + auth: true + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + permission: string + display-name: Delete organization permission override + errors: + - root.ForbiddenError + - root.NotFoundError + examples: + - path-parameters: + id: 1 + permission: permission + audiences: + - public + update: + path: /api/organizations/{id}/permissions/{permission} + method: PATCH + auth: true + docs: >- + Partially update the organization-level permission override for a given + permission key. + source: + openapi: openapi/openapi.yaml + path-parameters: + id: integer + permission: string + display-name: Update organization permission override + request: + name: PatchedOrganizationPermissionRequest + body: + properties: + permission: + type: optional + name: patchedOrganizationPermissionRequestPermission + roles: + type: optional> + docs: >- + Explicit roles that have this permission within the + organization. + content-type: application/json + response: + docs: '' + type: root.OrganizationPermission + errors: + - root.BadRequestError + - root.ForbiddenError + - root.NotFoundError + examples: + - path-parameters: + id: 1 + permission: permission + request: {} + response: + body: + default_role: default_role + id: 1 + label: label + options: options + organization: 1 + permission: permission + roles: + - OW + tooltip: tooltip + audiences: + - public + source: + openapi: openapi/openapi.yaml diff --git a/.mock/definition/prompts/versions.yml b/.mock/definition/prompts/versions.yml index da6eafc7e..95119f0fa 100644 --- a/.mock/definition/prompts/versions.yml +++ b/.mock/definition/prompts/versions.yml @@ -33,19 +33,12 @@ service: ordering: type: optional docs: Which field to use when ordering the results. - prompt_id: - type: integer - docs: >- - A unique integer value identifying the model ID to list versions - for. response: docs: '' type: list examples: - path-parameters: prompt_id: 1 - query-parameters: - prompt_id: 1 response: body: - created_at: '2024-01-15T09:30:00Z' diff --git a/.mock/openapi/openapi.yaml b/.mock/openapi/openapi.yaml index 06d0222d8..26d1f5dcb 100644 --- a/.mock/openapi/openapi.yaml +++ b/.mock/openapi/openapi.yaml @@ -5449,6 +5449,296 @@ paths: - organizations - members x-fern-sdk-method-name: get + /api/organizations/{id}/permissions: + get: + description: List all organization-level permission overrides for a given organization. + operationId: api_organizations_permissions_list + parameters: + - in: path + name: id + required: true + schema: + type: integer + - description: Which field to use when ordering the results. + in: query + name: ordering + required: false + schema: + type: string + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/OrganizationPermission' + type: array + description: '' + security: + - Token: [] + summary: List organization permission overrides + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: list + post: + description: Create a new organization-level permission override for a given organization. + operationId: api_organizations_permissions_create + parameters: + - in: path + name: id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermission' + description: '' + '400': + description: Bad Request + '403': + description: Permission Denied + security: + - Token: [] + summary: Create organization permission override + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: create + /api/organizations/{id}/permissions/options: + get: + description: Retrieve the list of configurable permission options (label, tooltip, default role and allowed roles). + operationId: api_organizations_permissions_options_list + parameters: + - in: path + name: id + required: true + schema: + type: integer + - description: Which field to use when ordering the results. + in: query + name: ordering + required: false + schema: + type: string + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ConfigurablePermissionOption' + type: array + description: '' + security: + - Token: [] + summary: Get configurable permissions options + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: get_options + /api/organizations/{id}/permissions/{permission}: + delete: + operationId: api_organizations_permissions_destroy + parameters: + - in: path + name: id + required: true + schema: + type: integer + - in: path + name: permission + required: true + schema: + type: string + responses: + '204': + description: Deleted + '403': + description: Permission Denied + '404': + description: Permission not found for organization + security: + - Token: [] + summary: Delete organization permission override + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: delete + get: + operationId: api_organizations_permissions_retrieve + parameters: + - in: path + name: id + required: true + schema: + type: integer + - in: path + name: permission + required: true + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermission' + description: '' + '403': + description: Permission Denied + '404': + description: Permission not found for organization + security: + - Token: [] + summary: Retrieve organization permission override + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: get + patch: + description: Partially update the organization-level permission override for a given permission key. + operationId: api_organizations_permissions_partial_update + parameters: + - in: path + name: id + required: true + schema: + type: integer + - in: path + name: permission + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedOrganizationPermissionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedOrganizationPermissionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedOrganizationPermissionRequest' + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermission' + description: '' + '400': + description: Bad Request + '403': + description: Permission Denied + '404': + description: Permission not found for organization + security: + - Token: [] + summary: Update organization permission override + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: update + put: + description: Replace the organization-level permission override for a given permission key. + operationId: api_organizations_permissions_update + parameters: + - description: A unique integer value identifying this organization. + in: path + name: id + required: true + schema: + type: integer + - description: Permission key to update within the organization. + in: path + name: permission + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/OrganizationPermissionRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPermission' + description: '' + '400': + description: Bad Request + '403': + description: Permission Denied + '404': + description: Permission not found for organization + security: + - Token: [] + summary: Replace organization permission override + tags: + - Organizations + - Permissions + x-fern-audiences: + - public + x-fern-sdk-group-name: + - organizations + - permissions + x-fern-sdk-method-name: replace /api/organizations/{id}/set-default-role: patch: description: Update the default role for members of a specific organization. @@ -9768,12 +10058,6 @@ paths: required: true schema: type: integer - - description: A unique integer value identifying the model ID to list versions for. - in: query - name: prompt_id - required: true - schema: - type: integer responses: '200': content: @@ -18601,6 +18885,10 @@ components: project: description: A unique integer value identifying this project. type: integer + recursive_scan: + description: Perform recursive scan + nullable: true + type: boolean regex_filter: description: Cloud storage regex for filtering objects nullable: true @@ -18696,6 +18984,10 @@ components: project: description: A unique integer value identifying this project. type: integer + recursive_scan: + description: Perform recursive scan + nullable: true + type: boolean regex_filter: description: Cloud storage regex for filtering objects nullable: true @@ -19275,6 +19567,27 @@ components: - task - updated_at type: object + ConfigurablePermissionOption: + properties: + default: + nullable: true + oneOf: + - $ref: '#/components/schemas/Role9e7Enum' + - $ref: '#/components/schemas/NullEnum' + label: + type: string + options: + items: + $ref: '#/components/schemas/Role9e7Enum' + type: array + permission: + type: string + tooltip: + type: string + required: + - options + - permission + type: object ConvertedFormat: properties: export_type: @@ -19921,7 +20234,7 @@ components: type: string default_role: allOf: - - $ref: '#/components/schemas/DefaultRoleEnum' + - $ref: '#/components/schemas/Role9e7Enum' description: |- Default membership role for invited users @@ -19963,24 +20276,6 @@ components: required: - organization type: object - DefaultRoleEnum: - description: |- - * `OW` - Owner - * `AD` - Administrator - * `MA` - Manager - * `RE` - Reviewer - * `AN` - Annotator - * `DI` - Deactivated - * `NO` - Not Activated - enum: - - OW - - AD - - MA - - RE - - AN - - DI - - 'NO' - type: string EditionEnum: description: |- * `Community` - Community @@ -21800,7 +22095,7 @@ components: type: string default_role: allOf: - - $ref: '#/components/schemas/DefaultRoleEnum' + - $ref: '#/components/schemas/Role9e7Enum' description: |- Default membership role for invited users @@ -24893,6 +25188,57 @@ components: required: - role type: object + OrganizationPermission: + properties: + default_role: + readOnly: true + type: string + id: + readOnly: true + type: integer + label: + readOnly: true + type: string + options: + readOnly: true + type: string + organization: + readOnly: true + type: integer + permission: + maxLength: 255 + type: string + roles: + description: Explicit roles that have this permission within the organization. + items: + $ref: '#/components/schemas/Role9e7Enum' + type: array + tooltip: + readOnly: true + type: string + required: + - default_role + - id + - label + - options + - organization + - permission + - tooltip + type: object + OrganizationPermissionRequest: + properties: + permission: + maxLength: 255 + minLength: 1 + type: string + roles: + description: Explicit roles that have this permission within the organization. + items: + $ref: '#/components/schemas/Role9e7Enum' + type: array + required: + - permission + type: object PaginatedAllRolesProjectListList: properties: count: @@ -25455,6 +25801,10 @@ components: project: description: A unique integer value identifying this project. type: integer + recursive_scan: + description: Perform recursive scan + nullable: true + type: boolean regex_filter: description: Cloud storage regex for filtering objects nullable: true @@ -25774,7 +26124,7 @@ components: type: string default_role: allOf: - - $ref: '#/components/schemas/DefaultRoleEnum' + - $ref: '#/components/schemas/Role9e7Enum' description: |- Default membership role for invited users @@ -26749,6 +27099,18 @@ components: user_id: type: integer type: object + PatchedOrganizationPermissionRequest: + properties: + permission: + maxLength: 255 + minLength: 1 + type: string + roles: + description: Explicit roles that have this permission within the organization. + items: + $ref: '#/components/schemas/Role9e7Enum' + type: array + type: object PatchedPauseRequest: description: |- A ModelSerializer that takes additional arguments for diff --git a/poetry.lock b/poetry.lock index 0fd9e4d5a..cd4f7d8e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -648,127 +648,151 @@ referencing = ">=0.31.0" [[package]] name = "lxml" -version = "6.0.1" +version = "6.0.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.8" files = [ - {file = "lxml-6.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b38e20c578149fdbba1fd3f36cb1928a3aaca4b011dfd41ba09d11fb396e1b9"}, - {file = "lxml-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a052cbd013b7140bbbb38a14e2329b6192478344c99097e378c691b7119551"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:21344d29c82ca8547ea23023bb8e7538fa5d4615a1773b991edf8176a870c1ea"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa8f130f4b2dc94baa909c17bb7994f0268a2a72b9941c872e8e558fd6709050"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4588806a721552692310ebe9f90c17ac6c7c5dac438cd93e3d74dd60531c3211"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:8466faa66b0353802fb7c054a400ac17ce2cf416e3ad8516eadeff9cba85b741"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50b5e54f6a9461b1e9c08b4a3420415b538d4773bd9df996b9abcbfe95f4f1fd"}, - {file = "lxml-6.0.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:6f393e10685b37f15b1daef8aa0d734ec61860bb679ec447afa0001a31e7253f"}, - {file = "lxml-6.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:07038c62fd0fe2743e2f5326f54d464715373c791035d7dda377b3c9a5d0ad77"}, - {file = "lxml-6.0.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7a44a5fb1edd11b3a65c12c23e1049c8ae49d90a24253ff18efbcb6aa042d012"}, - {file = "lxml-6.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a57d9eb9aadf311c9e8785230eec83c6abb9aef2adac4c0587912caf8f3010b8"}, - {file = "lxml-6.0.1-cp310-cp310-win32.whl", hash = "sha256:d877874a31590b72d1fa40054b50dc33084021bfc15d01b3a661d85a302af821"}, - {file = "lxml-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c43460f4aac016ee0e156bfa14a9de9b3e06249b12c228e27654ac3996a46d5b"}, - {file = "lxml-6.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:615bb6c73fed7929e3a477a3297a797892846b253d59c84a62c98bdce3849a0a"}, - {file = "lxml-6.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6acde83f7a3d6399e6d83c1892a06ac9b14ea48332a5fbd55d60b9897b9570a"}, - {file = "lxml-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d21c9cacb6a889cbb8eeb46c77ef2c1dd529cde10443fdeb1de847b3193c541"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:847458b7cd0d04004895f1fb2cca8e7c0f8ec923c49c06b7a72ec2d48ea6aca2"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1dc13405bf315d008fe02b1472d2a9d65ee1c73c0a06de5f5a45e6e404d9a1c0"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f540c229a8c0a770dcaf6d5af56a5295e0fc314fc7ef4399d543328054bcea"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:d2f73aef768c70e8deb8c4742fca4fd729b132fda68458518851c7735b55297e"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7f4066b85a4fa25ad31b75444bd578c3ebe6b8ed47237896341308e2ce923c3"}, - {file = "lxml-6.0.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0cce65db0cd8c750a378639900d56f89f7d6af11cd5eda72fde054d27c54b8ce"}, - {file = "lxml-6.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c372d42f3eee5844b69dcab7b8d18b2f449efd54b46ac76970d6e06b8e8d9a66"}, - {file = "lxml-6.0.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2e2b0e042e1408bbb1c5f3cfcb0f571ff4ac98d8e73f4bf37c5dd179276beedd"}, - {file = "lxml-6.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cc73bb8640eadd66d25c5a03175de6801f63c535f0f3cf50cac2f06a8211f420"}, - {file = "lxml-6.0.1-cp311-cp311-win32.whl", hash = "sha256:7c23fd8c839708d368e406282d7953cee5134f4592ef4900026d84566d2b4c88"}, - {file = "lxml-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:2516acc6947ecd3c41a4a4564242a87c6786376989307284ddb115f6a99d927f"}, - {file = "lxml-6.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:cb46f8cfa1b0334b074f40c0ff94ce4d9a6755d492e6c116adb5f4a57fb6ad96"}, - {file = "lxml-6.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c03ac546adaabbe0b8e4a15d9ad815a281afc8d36249c246aecf1aaad7d6f200"}, - {file = "lxml-6.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33b862c7e3bbeb4ba2c96f3a039f925c640eeba9087a4dc7a572ec0f19d89392"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7a3ec1373f7d3f519de595032d4dcafae396c29407cfd5073f42d267ba32440d"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03b12214fb1608f4cffa181ec3d046c72f7e77c345d06222144744c122ded870"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:207ae0d5f0f03b30f95e649a6fa22aa73f5825667fee9c7ec6854d30e19f2ed8"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:32297b09ed4b17f7b3f448de87a92fb31bb8747496623483788e9f27c98c0f00"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e18224ea241b657a157c85e9cac82c2b113ec90876e01e1f127312006233756"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a07a994d3c46cd4020c1ea566345cf6815af205b1e948213a4f0f1d392182072"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:2287fadaa12418a813b05095485c286c47ea58155930cfbd98c590d25770e225"}, - {file = "lxml-6.0.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b4e597efca032ed99f418bd21314745522ab9fa95af33370dcee5533f7f70136"}, - {file = "lxml-6.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9696d491f156226decdd95d9651c6786d43701e49f32bf23715c975539aa2b3b"}, - {file = "lxml-6.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e4e3cd3585f3c6f87cdea44cda68e692cc42a012f0131d25957ba4ce755241a7"}, - {file = "lxml-6.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:45cbc92f9d22c28cd3b97f8d07fcefa42e569fbd587dfdac76852b16a4924277"}, - {file = "lxml-6.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:f8c9bcfd2e12299a442fba94459adf0b0d001dbc68f1594439bfa10ad1ecb74b"}, - {file = "lxml-6.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e9dc2b9f1586e7cd77753eae81f8d76220eed9b768f337dc83a3f675f2f0cf9"}, - {file = "lxml-6.0.1-cp312-cp312-win32.whl", hash = "sha256:987ad5c3941c64031f59c226167f55a04d1272e76b241bfafc968bdb778e07fb"}, - {file = "lxml-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:abb05a45394fd76bf4a60c1b7bec0e6d4e8dfc569fc0e0b1f634cd983a006ddc"}, - {file = "lxml-6.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:c4be29bce35020d8579d60aa0a4e95effd66fcfce31c46ffddf7e5422f73a299"}, - {file = "lxml-6.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:485eda5d81bb7358db96a83546949c5fe7474bec6c68ef3fa1fb61a584b00eea"}, - {file = "lxml-6.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d12160adea318ce3d118f0b4fbdff7d1225c75fb7749429541b4d217b85c3f76"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48c8d335d8ab72f9265e7ba598ae5105a8272437403f4032107dbcb96d3f0b29"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:405e7cf9dbdbb52722c231e0f1257214202dfa192327fab3de45fd62e0554082"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:299a790d403335a6a057ade46f92612ebab87b223e4e8c5308059f2dc36f45ed"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:48da704672f6f9c461e9a73250440c647638cc6ff9567ead4c3b1f189a604ee8"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:21e364e1bb731489e3f4d51db416f991a5d5da5d88184728d80ecfb0904b1d68"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bce45a2c32032afddbd84ed8ab092130649acb935536ef7a9559636ce7ffd4a"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:fa164387ff20ab0e575fa909b11b92ff1481e6876835014e70280769920c4433"}, - {file = "lxml-6.0.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7587ac5e000e1594e62278422c5783b34a82b22f27688b1074d71376424b73e8"}, - {file = "lxml-6.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:57478424ac4c9170eabf540237125e8d30fad1940648924c058e7bc9fb9cf6dd"}, - {file = "lxml-6.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:09c74afc7786c10dd6afaa0be2e4805866beadc18f1d843cf517a7851151b499"}, - {file = "lxml-6.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7fd70681aeed83b196482d42a9b0dc5b13bab55668d09ad75ed26dff3be5a2f5"}, - {file = "lxml-6.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:10a72e456319b030b3dd900df6b1f19d89adf06ebb688821636dc406788cf6ac"}, - {file = "lxml-6.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0fa45fb5f55111ce75b56c703843b36baaf65908f8b8d2fbbc0e249dbc127ed"}, - {file = "lxml-6.0.1-cp313-cp313-win32.whl", hash = "sha256:01dab65641201e00c69338c9c2b8a0f2f484b6b3a22d10779bb417599fae32b5"}, - {file = "lxml-6.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:bdf8f7c8502552d7bff9e4c98971910a0a59f60f88b5048f608d0a1a75e94d1c"}, - {file = "lxml-6.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6aeca75959426b9fd8d4782c28723ba224fe07cfa9f26a141004210528dcbe2"}, - {file = "lxml-6.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:29b0e849ec7030e3ecb6112564c9f7ad6881e3b2375dd4a0c486c5c1f3a33859"}, - {file = "lxml-6.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:02a0f7e629f73cc0be598c8b0611bf28ec3b948c549578a26111b01307fd4051"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:beab5e54de016e730875f612ba51e54c331e2fa6dc78ecf9a5415fc90d619348"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a08aefecd19ecc4ebf053c27789dd92c87821df2583a4337131cf181a1dffa"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36c8fa7e177649470bc3dcf7eae6bee1e4984aaee496b9ccbf30e97ac4127fa2"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:5d08e0f1af6916267bb7eff21c09fa105620f07712424aaae09e8cb5dd4164d1"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9705cdfc05142f8c38c97a61bd3a29581ceceb973a014e302ee4a73cc6632476"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74555e2da7c1636e30bff4e6e38d862a634cf020ffa591f1f63da96bf8b34772"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:e38b5f94c5a2a5dadaddd50084098dfd005e5a2a56cd200aaf5e0a20e8941782"}, - {file = "lxml-6.0.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5ec101a92ddacb4791977acfc86c1afd624c032974bfb6a21269d1083c9bc49"}, - {file = "lxml-6.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5c17e70c82fd777df586c12114bbe56e4e6f823a971814fd40dec9c0de518772"}, - {file = "lxml-6.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:45fdd0415a0c3d91640b5d7a650a8f37410966a2e9afebb35979d06166fd010e"}, - {file = "lxml-6.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d417eba28981e720a14fcb98f95e44e7a772fe25982e584db38e5d3b6ee02e79"}, - {file = "lxml-6.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8e5d116b9e59be7934febb12c41cce2038491ec8fdb743aeacaaf36d6e7597e4"}, - {file = "lxml-6.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c238f0d0d40fdcb695c439fe5787fa69d40f45789326b3bb6ef0d61c4b588d6e"}, - {file = "lxml-6.0.1-cp314-cp314-win32.whl", hash = "sha256:537b6cf1c5ab88cfd159195d412edb3e434fee880f206cbe68dff9c40e17a68a"}, - {file = "lxml-6.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:911d0a2bb3ef3df55b3d97ab325a9ca7e438d5112c102b8495321105d25a441b"}, - {file = "lxml-6.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:2834377b0145a471a654d699bdb3a2155312de492142ef5a1d426af2c60a0a31"}, - {file = "lxml-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9283997edb661ebba05314da1b9329e628354be310bbf947b0faa18263c5df1b"}, - {file = "lxml-6.0.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1beca37c6e7a4ddd1ca24829e2c6cb60b5aad0d6936283b5b9909a7496bd97af"}, - {file = "lxml-6.0.1-cp38-cp38-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:42897fe8cb097274087fafc8251a39b4cf8d64a7396d49479bdc00b3587331cb"}, - {file = "lxml-6.0.1-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ef8cd44a080bfb92776047d11ab64875faf76e0d8be20ea3ff0c1e67b3fc9cb"}, - {file = "lxml-6.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:433ab647dad6a9fb31418ccd3075dcb4405ece75dced998789fe14a8e1e3785c"}, - {file = "lxml-6.0.1-cp38-cp38-win32.whl", hash = "sha256:bfa30ef319462242333ef8f0c7631fb8b8b8eae7dca83c1f235d2ea2b7f8ff2b"}, - {file = "lxml-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f36e4a2439d134b8e70f92ff27ada6fb685966de385668e21c708021733ead1"}, - {file = "lxml-6.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:edb975280633a68d0988b11940834ce2b0fece9f5278297fc50b044cb713f0e1"}, - {file = "lxml-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4c5acb9bc22f2026bbd0ecbfdb890e9b3e5b311b992609d35034706ad111b5d"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:47ab1aff82a95a07d96c1eff4eaebec84f823e0dfb4d9501b1fbf9621270c1d3"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa7233bdb7a4365e2411a665d034c370ac82798a926e65f76c26fbbf0fd14b7"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c71a0ce0e08c7e11e64895c720dc7752bf064bfecd3eb2c17adcd7bfa8ffb22c"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:57744270a512a93416a149f8b6ea1dbbbee127f5edcbcd5adf28e44b6ff02f33"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e89d977220f7b1f0c725ac76f5c65904193bd4c264577a3af9017de17560ea7e"}, - {file = "lxml-6.0.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:0c8f7905f1971c2c408badf49ae0ef377cc54759552bcf08ae7a0a8ed18999c2"}, - {file = "lxml-6.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ea27626739e82f2be18cbb1aff7ad59301c723dc0922d9a00bc4c27023f16ab7"}, - {file = "lxml-6.0.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:21300d8c1bbcc38925aabd4b3c2d6a8b09878daf9e8f2035f09b5b002bcddd66"}, - {file = "lxml-6.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:021497a94907c5901cd49d24b5b0fdd18d198a06611f5ce26feeb67c901b92f2"}, - {file = "lxml-6.0.1-cp39-cp39-win32.whl", hash = "sha256:620869f2a3ec1475d000b608024f63259af8d200684de380ccb9650fbc14d1bb"}, - {file = "lxml-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:afae3a15889942426723839a3cf56dab5e466f7d873640a7a3c53abc671e2387"}, - {file = "lxml-6.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:2719e42acda8f3444a0d88204fd90665116dda7331934da4d479dd9296c33ce2"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0abfbaf4ebbd7fd33356217d317b6e4e2ef1648be6a9476a52b57ffc6d8d1780"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ebbf2d9775be149235abebdecae88fe3b3dd06b1797cd0f6dffe6948e85309d"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a389e9f11c010bd30531325805bbe97bdf7f728a73d0ec475adef57ffec60547"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f5cf2addfbbe745251132c955ad62d8519bb4b2c28b0aa060eca4541798d86e"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1b60a3287bf33a2a54805d76b82055bcc076e445fd539ee9ae1fe85ed373691"}, - {file = "lxml-6.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f7bbfb0751551a8786915fc6b615ee56344dacc1b1033697625b553aefdd9837"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b556aaa6ef393e989dac694b9c95761e32e058d5c4c11ddeef33f790518f7a5e"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:64fac7a05ebb3737b79fd89fe5a5b6c5546aac35cfcfd9208eb6e5d13215771c"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:038d3c08babcfce9dc89aaf498e6da205efad5b7106c3b11830a488d4eadf56b"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:445f2cee71c404ab4259bc21e20339a859f75383ba2d7fb97dfe7c163994287b"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e352d8578e83822d70bea88f3d08b9912528e4c338f04ab707207ab12f4b7aac"}, - {file = "lxml-6.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:51bd5d1a9796ca253db6045ab45ca882c09c071deafffc22e06975b7ace36300"}, - {file = "lxml-6.0.1.tar.gz", hash = "sha256:2b3a882ebf27dd026df3801a87cf49ff791336e0f94b0fad195db77e01240690"}, + {file = "lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388"}, + {file = "lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c"}, + {file = "lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a"}, + {file = "lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c"}, + {file = "lxml-6.0.2-cp310-cp310-win32.whl", hash = "sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b"}, + {file = "lxml-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0"}, + {file = "lxml-6.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5"}, + {file = "lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607"}, + {file = "lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178"}, + {file = "lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c"}, + {file = "lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7"}, + {file = "lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46"}, + {file = "lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078"}, + {file = "lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285"}, + {file = "lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456"}, + {file = "lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0"}, + {file = "lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6"}, + {file = "lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322"}, + {file = "lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849"}, + {file = "lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f"}, + {file = "lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6"}, + {file = "lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77"}, + {file = "lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6"}, + {file = "lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2"}, + {file = "lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314"}, + {file = "lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2"}, + {file = "lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7"}, + {file = "lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf"}, + {file = "lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe"}, + {file = "lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37"}, + {file = "lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a"}, + {file = "lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c"}, + {file = "lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b"}, + {file = "lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed"}, + {file = "lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8"}, + {file = "lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d"}, + {file = "lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d"}, + {file = "lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272"}, + {file = "lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f"}, + {file = "lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312"}, + {file = "lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca"}, + {file = "lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c"}, + {file = "lxml-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a656ca105115f6b766bba324f23a67914d9c728dafec57638e2b92a9dcd76c62"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c54d83a2188a10ebdba573f16bd97135d06c9ef60c3dc495315c7a28c80a263f"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:1ea99340b3c729beea786f78c38f60f4795622f36e305d9c9be402201efdc3b7"}, + {file = "lxml-6.0.2-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af85529ae8d2a453feee4c780d9406a5e3b17cee0dd75c18bd31adcd584debc3"}, + {file = "lxml-6.0.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe659f6b5d10fb5a17f00a50eb903eb277a71ee35df4615db573c069bcf967ac"}, + {file = "lxml-6.0.2-cp38-cp38-win32.whl", hash = "sha256:5921d924aa5468c939d95c9814fa9f9b5935a6ff4e679e26aaf2951f74043512"}, + {file = "lxml-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:0aa7070978f893954008ab73bb9e3c24a7c56c054e00566a21b553dc18105fca"}, + {file = "lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694"}, + {file = "lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c"}, + {file = "lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84"}, + {file = "lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb"}, + {file = "lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f"}, + {file = "lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304"}, + {file = "lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d"}, + {file = "lxml-6.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a"}, + {file = "lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e"}, + {file = "lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62"}, ] [package.extras] diff --git a/reference.md b/reference.md index 3e8f32da5..53cf6dd37 100644 --- a/reference.md +++ b/reference.md @@ -4987,7 +4987,7 @@ Set the minimum user role that can edit custom scripts in the UI.
-**default_role:** `typing.Optional[DefaultRoleEnum]` +**default_role:** `typing.Optional[Role9E7Enum]` Default membership role for invited users @@ -20072,6 +20072,14 @@ client.import_storage.azure_spi.create(
+**recursive_scan:** `typing.Optional[bool]` — Perform recursive scan + +
+
+ +
+
+ **regex_filter:** `typing.Optional[str]` — Cloud storage regex for filtering objects
@@ -20302,6 +20310,14 @@ client.import_storage.azure_spi.validate(
+**recursive_scan:** `typing.Optional[bool]` — Perform recursive scan + +
+
+ +
+
+ **regex_filter:** `typing.Optional[str]` — Cloud storage regex for filtering objects
@@ -20680,6 +20696,14 @@ client.import_storage.azure_spi.update(
+**recursive_scan:** `typing.Optional[bool]` — Perform recursive scan + +
+
+ +
+
+ **regex_filter:** `typing.Optional[str]` — Cloud storage regex for filtering objects
@@ -26476,8 +26500,8 @@ client.organizations.members.delete(
-## Projects Exports -
client.projects.exports.list_formats(...) +## Organizations Permissions +
client.organizations.permissions.list(...)
@@ -26489,7 +26513,7 @@ client.organizations.members.delete(
-Retrieve the available export formats for the current project by ID. +List all organization-level permission overrides for a given organization.
@@ -26509,7 +26533,7 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.list_formats( +client.organizations.permissions.list( id=1, ) @@ -26527,7 +26551,15 @@ client.projects.exports.list_formats(
-**id:** `int` — A unique integer value identifying this project. +**id:** `int` + +
+
+ +
+
+ +**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -26547,7 +26579,7 @@ client.projects.exports.list_formats(
-
client.projects.exports.list(...) +
client.organizations.permissions.create(...)
@@ -26559,7 +26591,7 @@ client.projects.exports.list_formats(
-Returns a list of exported files for a specific project by ID. +Create a new organization-level permission override for a given organization.
@@ -26579,8 +26611,9 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.list( +client.organizations.permissions.create( id=1, + permission="permission", ) ``` @@ -26597,7 +26630,7 @@ client.projects.exports.list(
-**id:** `int` — A unique integer value identifying this project. +**id:** `int`
@@ -26605,7 +26638,15 @@ client.projects.exports.list(
-**ordering:** `typing.Optional[str]` — Which field to use when ordering the results. +**permission:** `str` + +
+
+ +
+
+ +**roles:** `typing.Optional[typing.Sequence[Role9E7Enum]]` — Explicit roles that have this permission within the organization.
@@ -26625,7 +26666,7 @@ client.projects.exports.list(
-
client.projects.exports.create(...) +
client.organizations.permissions.get_options(...)
@@ -26637,7 +26678,7 @@ client.projects.exports.list(
-Create a new export request to start a background task and generate an export file for a specific project by ID. +Retrieve the list of configurable permission options (label, tooltip, default role and allowed roles).
@@ -26657,7 +26698,7 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.create( +client.organizations.permissions.get_options( id=1, ) @@ -26675,7 +26716,7 @@ client.projects.exports.create(
-**id:** `int` — A unique integer value identifying this project. +**id:** `int`
@@ -26683,7 +26724,7 @@ client.projects.exports.create(
-**annotation_filter_options:** `typing.Optional[LseAnnotationFilterOptionsRequest]` +**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -26691,63 +26732,56 @@ client.projects.exports.create(
-**converted_formats:** `typing.Optional[typing.Sequence[ConvertedFormatRequest]]` +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
- -
-
- -**counters:** `typing.Optional[typing.Optional[typing.Any]]` -
-
-
-**created_by:** `typing.Optional[UserSimpleRequest]` -
+
+
client.organizations.permissions.get(...)
-**finished_at:** `typing.Optional[dt.datetime]` — Complete or fail time - -
-
+#### 🔌 Usage
-**md5:** `typing.Optional[str]` - -
-
-
-**serialization_options:** `typing.Optional[SerializationOptionsRequest]` - +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.organizations.permissions.get( + id=1, + permission="permission", +) + +``` +
+
+#### ⚙️ Parameters +
-**status:** `typing.Optional[Status7BfEnum]` - -
-
-
-**task_filter_options:** `typing.Optional[LseTaskFilterOptionsRequest]` +**id:** `int`
@@ -26755,7 +26789,7 @@ client.projects.exports.create(
-**title:** `typing.Optional[str]` +**permission:** `str`
@@ -26775,7 +26809,7 @@ client.projects.exports.create( -
client.projects.exports.get(...) +
client.organizations.permissions.replace(...)
@@ -26787,7 +26821,7 @@ client.projects.exports.create(
-Retrieve information about an export file by export ID for a specific project. +Replace the organization-level permission override for a given permission key.
@@ -26807,9 +26841,10 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.get( - export_pk=1, +client.organizations.permissions.replace( id=1, + permission_="permission", + permission="permission", ) ``` @@ -26826,7 +26861,7 @@ client.projects.exports.get(
-**export_pk:** `int` — Primary key identifying the export file. +**id:** `int` — A unique integer value identifying this organization.
@@ -26834,7 +26869,7 @@ client.projects.exports.get(
-**id:** `int` — A unique integer value identifying this project. +**permission_:** `str` — Permission key to update within the organization.
@@ -26842,36 +26877,38 @@ client.projects.exports.get(
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +**permission:** `str`
- -
- - - -
- -
client.projects.exports.delete(...)
-#### 📝 Description - -
-
+**roles:** `typing.Optional[typing.Sequence[Role9E7Enum]]` — Explicit roles that have this permission within the organization. + +
+
-Delete an export file by specified export ID. +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. +
+ + + +
+ +
client.organizations.permissions.delete(...) +
+
+ #### 🔌 Usage
@@ -26886,9 +26923,9 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.delete( - export_pk=1, +client.organizations.permissions.delete( id=1, + permission="permission", ) ``` @@ -26905,7 +26942,7 @@ client.projects.exports.delete(
-**export_pk:** `int` — Primary key identifying the export file. +**id:** `int`
@@ -26913,7 +26950,7 @@ client.projects.exports.delete(
-**id:** `int` — A unique integer value identifying this project. +**permission:** `str`
@@ -26933,7 +26970,7 @@ client.projects.exports.delete(
-
client.projects.exports.convert(...) +
client.organizations.permissions.update(...)
@@ -26945,7 +26982,7 @@ client.projects.exports.delete(
-Convert export snapshot to selected format +Partially update the organization-level permission override for a given permission key.
@@ -26965,10 +27002,9 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.exports.convert( - export_pk=1, +client.organizations.permissions.update( id=1, - export_type="export_type", + permission="permission", ) ``` @@ -26985,7 +27021,7 @@ client.projects.exports.convert(
-**export_pk:** `int` — Primary key identifying the export file. +**id:** `int`
@@ -26993,7 +27029,7 @@ client.projects.exports.convert(
-**id:** `int` — A unique integer value identifying this project. +**permission:** `str`
@@ -27001,7 +27037,7 @@ client.projects.exports.convert(
-**export_type:** `str` — Export file format. +**patched_organization_permission_request_permission:** `typing.Optional[str]`
@@ -27009,7 +27045,7 @@ client.projects.exports.convert(
-**download_resources:** `typing.Optional[bool]` — Download resources in converter. +**roles:** `typing.Optional[typing.Sequence[Role9E7Enum]]` — Explicit roles that have this permission within the organization.
@@ -27029,8 +27065,8 @@ client.projects.exports.convert(
-## Projects Members -
client.projects.members.get(...) +## Projects Exports +
client.projects.exports.list_formats(...)
@@ -27042,7 +27078,7 @@ client.projects.exports.convert(
-Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated). +Retrieve the available export formats for the current project by ID.
@@ -27062,7 +27098,7 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.members.get( +client.projects.exports.list_formats( id=1, ) @@ -27080,15 +27116,7 @@ client.projects.members.get(
-**id:** `int` - -
-
- -
-
- -**user_ids:** `typing.Optional[str]` — Comma-separated list of user IDs to include. Example: user_ids=1,2,3 +**id:** `int` — A unique integer value identifying this project.
@@ -27108,8 +27136,7 @@ client.projects.members.get(
-## Projects Metrics -
client.projects.metrics.get(...) +
client.projects.exports.list(...)
@@ -27121,7 +27148,7 @@ client.projects.members.get(
-Get the current metrics configuration for a project. +Returns a list of exported files for a specific project by ID.
@@ -27141,7 +27168,7 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.metrics.get( +client.projects.exports.list( id=1, ) @@ -27159,7 +27186,15 @@ client.projects.metrics.get(
-**id:** `int` +**id:** `int` — A unique integer value identifying this project. + +
+
+ +
+
+ +**ordering:** `typing.Optional[str]` — Which field to use when ordering the results.
@@ -27179,7 +27214,7 @@ client.projects.metrics.get(
-
client.projects.metrics.update(...) +
client.projects.exports.create(...)
@@ -27191,7 +27226,7 @@ client.projects.metrics.get(
-Update metrics strategy and parameters for a project. +Create a new export request to start a background task and generate an export file for a specific project by ID.
@@ -27211,7 +27246,7 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.metrics.update( +client.projects.exports.create( id=1, ) @@ -27229,7 +27264,7 @@ client.projects.metrics.update(
-**id:** `int` +**id:** `int` — A unique integer value identifying this project.
@@ -27237,7 +27272,7 @@ client.projects.metrics.update(
-**additional_params:** `typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]` +**annotation_filter_options:** `typing.Optional[LseAnnotationFilterOptionsRequest]`
@@ -27245,7 +27280,7 @@ client.projects.metrics.update(
-**agreement_threshold:** `typing.Optional[int]` +**converted_formats:** `typing.Optional[typing.Sequence[ConvertedFormatRequest]]`
@@ -27253,7 +27288,7 @@ client.projects.metrics.update(
-**max_additional_annotators_assignable:** `typing.Optional[int]` +**counters:** `typing.Optional[typing.Optional[typing.Any]]`
@@ -27261,7 +27296,55 @@ client.projects.metrics.update(
-**metric_name:** `typing.Optional[str]` +**created_by:** `typing.Optional[UserSimpleRequest]` + +
+
+ +
+
+ +**finished_at:** `typing.Optional[dt.datetime]` — Complete or fail time + +
+
+ +
+
+ +**md5:** `typing.Optional[str]` + +
+
+ +
+
+ +**serialization_options:** `typing.Optional[SerializationOptionsRequest]` + +
+
+ +
+
+ +**status:** `typing.Optional[Status7BfEnum]` + +
+
+ +
+
+ +**task_filter_options:** `typing.Optional[LseTaskFilterOptionsRequest]` + +
+
+ +
+
+ +**title:** `typing.Optional[str]`
@@ -27281,8 +27364,7 @@ client.projects.metrics.update(
-## Projects Stats -
client.projects.stats.iaa(...) +
client.projects.exports.get(...)
@@ -27294,7 +27376,7 @@ client.projects.metrics.update(
-Get Inter-Annotator Agreement (IAA) matrix for a project, showing agreement between all annotators. +Retrieve information about an export file by export ID for a specific project.
@@ -27314,7 +27396,514 @@ from label_studio_sdk import LabelStudio client = LabelStudio( api_key="YOUR_API_KEY", ) -client.projects.stats.iaa( +client.projects.exports.get( + export_pk=1, + id=1, +) + +``` + +
+ + + +#### ⚙️ Parameters + +
+
+ +
+
+ +**export_pk:** `int` — Primary key identifying the export file. + +
+
+ +
+
+ +**id:** `int` — A unique integer value identifying this project. + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + + + +
+ +
client.projects.exports.delete(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Delete an export file by specified export ID. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.exports.delete( + export_pk=1, + id=1, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**export_pk:** `int` — Primary key identifying the export file. + +
+
+ +
+
+ +**id:** `int` — A unique integer value identifying this project. + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.projects.exports.convert(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Convert export snapshot to selected format +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.exports.convert( + export_pk=1, + id=1, + export_type="export_type", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**export_pk:** `int` — Primary key identifying the export file. + +
+
+ +
+
+ +**id:** `int` — A unique integer value identifying this project. + +
+
+ +
+
+ +**export_type:** `str` — Export file format. + +
+
+ +
+
+ +**download_resources:** `typing.Optional[bool]` — Download resources in converter. + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +## Projects Members +
client.projects.members.get(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Retrieve the members for a specific project. Optionally filter by user IDs (comma-separated). +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.members.get( + id=1, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `int` + +
+
+ +
+
+ +**user_ids:** `typing.Optional[str]` — Comma-separated list of user IDs to include. Example: user_ids=1,2,3 + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +## Projects Metrics +
client.projects.metrics.get(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get the current metrics configuration for a project. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.metrics.get( + id=1, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `int` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +
client.projects.metrics.update(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Update metrics strategy and parameters for a project. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.metrics.update( + id=1, +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `int` + +
+
+ +
+
+ +**additional_params:** `typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]]` + +
+
+ +
+
+ +**agreement_threshold:** `typing.Optional[int]` + +
+
+ +
+
+ +**max_additional_annotators_assignable:** `typing.Optional[int]` + +
+
+ +
+
+ +**metric_name:** `typing.Optional[str]` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ + +
+
+
+ +## Projects Stats +
client.projects.stats.iaa(...) +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Get Inter-Annotator Agreement (IAA) matrix for a project, showing agreement between all annotators. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from label_studio_sdk import LabelStudio + +client = LabelStudio( + api_key="YOUR_API_KEY", +) +client.projects.stats.iaa( id=1, ) @@ -29982,7 +30571,6 @@ client = LabelStudio( api_key="YOUR_API_KEY", ) client.prompts.versions.list( - prompt_id_=1, prompt_id=1, ) @@ -30000,15 +30588,7 @@ client.prompts.versions.list(
-**prompt_id_:** `int` - -
-
- -
-
- -**prompt_id:** `int` — A unique integer value identifying the model ID to list versions for. +**prompt_id:** `int`
diff --git a/src/label_studio_sdk/__init__.py b/src/label_studio_sdk/__init__.py index 85aebcb1c..4fe4748d8 100644 --- a/src/label_studio_sdk/__init__.py +++ b/src/label_studio_sdk/__init__.py @@ -42,13 +42,14 @@ Comment, CommentRequest, CommentSerializerWithExpandedUser, + ConfigurablePermissionOption, + ConfigurablePermissionOptionDefault, ConvertedFormat, ConvertedFormatRequest, CountLimit, CustomScriptsEditableByEnum, DefaultRole, DefaultRoleCustomScriptsEditableBy, - DefaultRoleEnum, EditionEnum, Export, FileUpload, @@ -138,6 +139,8 @@ OrganizationInvite, OrganizationMember, OrganizationMembership, + OrganizationPermission, + OrganizationPermissionRequest, PaginatedAllRolesProjectListList, PaginatedAnnotationHistoryList, PaginatedLseOrganizationMemberListList, @@ -399,13 +402,14 @@ "Comment", "CommentRequest", "CommentSerializerWithExpandedUser", + "ConfigurablePermissionOption", + "ConfigurablePermissionOptionDefault", "ConvertedFormat", "ConvertedFormatRequest", "CountLimit", "CustomScriptsEditableByEnum", "DefaultRole", "DefaultRoleCustomScriptsEditableBy", - "DefaultRoleEnum", "EditionEnum", "Export", "ExportStorageListTypesResponseItem", @@ -509,6 +513,8 @@ "OrganizationInvite", "OrganizationMember", "OrganizationMembership", + "OrganizationPermission", + "OrganizationPermissionRequest", "PaginatedAllRolesProjectListList", "PaginatedAnnotationHistoryList", "PaginatedLseOrganizationMemberListList", diff --git a/src/label_studio_sdk/import_storage/azure_spi/client.py b/src/label_studio_sdk/import_storage/azure_spi/client.py index 2dcc6a22d..e941444dc 100644 --- a/src/label_studio_sdk/import_storage/azure_spi/client.py +++ b/src/label_studio_sdk/import_storage/azure_spi/client.py @@ -94,6 +94,7 @@ def create( prefix: typing.Optional[str] = OMIT, presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -146,6 +147,9 @@ def create( presign_ttl : typing.Optional[int] Presigned URLs TTL (in minutes) + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -204,6 +208,7 @@ def create( "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, @@ -246,6 +251,7 @@ def validate( prefix: typing.Optional[str] = OMIT, presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -298,6 +304,9 @@ def validate( presign_ttl : typing.Optional[int] Presigned URLs TTL (in minutes) + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -355,6 +364,7 @@ def validate( "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, @@ -479,6 +489,7 @@ def update( presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, project: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -533,6 +544,9 @@ def update( project : typing.Optional[int] A unique integer value identifying this project. + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -591,6 +605,7 @@ def update( "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, @@ -755,6 +770,7 @@ async def create( prefix: typing.Optional[str] = OMIT, presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -807,6 +823,9 @@ async def create( presign_ttl : typing.Optional[int] Presigned URLs TTL (in minutes) + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -873,6 +892,7 @@ async def main() -> None: "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, @@ -915,6 +935,7 @@ async def validate( prefix: typing.Optional[str] = OMIT, presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -967,6 +988,9 @@ async def validate( presign_ttl : typing.Optional[int] Presigned URLs TTL (in minutes) + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -1032,6 +1056,7 @@ async def main() -> None: "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, @@ -1172,6 +1197,7 @@ async def update( presign: typing.Optional[bool] = OMIT, presign_ttl: typing.Optional[int] = OMIT, project: typing.Optional[int] = OMIT, + recursive_scan: typing.Optional[bool] = OMIT, regex_filter: typing.Optional[str] = OMIT, status: typing.Optional[StatusC5AEnum] = OMIT, synchronizable: typing.Optional[bool] = OMIT, @@ -1226,6 +1252,9 @@ async def update( project : typing.Optional[int] A unique integer value identifying this project. + recursive_scan : typing.Optional[bool] + Perform recursive scan + regex_filter : typing.Optional[str] Cloud storage regex for filtering objects @@ -1292,6 +1321,7 @@ async def main() -> None: "presign": presign, "presign_ttl": presign_ttl, "project": project, + "recursive_scan": recursive_scan, "regex_filter": regex_filter, "status": status, "synchronizable": synchronizable, diff --git a/src/label_studio_sdk/organizations/__init__.py b/src/label_studio_sdk/organizations/__init__.py index faea629fa..8451c0fe6 100644 --- a/src/label_studio_sdk/organizations/__init__.py +++ b/src/label_studio_sdk/organizations/__init__.py @@ -1,6 +1,6 @@ # This file was auto-generated by Fern from our API Definition. from .types import PatchedDefaultRoleRequestCustomScriptsEditableBy -from . import invites, members +from . import invites, members, permissions -__all__ = ["PatchedDefaultRoleRequestCustomScriptsEditableBy", "invites", "members"] +__all__ = ["PatchedDefaultRoleRequestCustomScriptsEditableBy", "invites", "members", "permissions"] diff --git a/src/label_studio_sdk/organizations/client.py b/src/label_studio_sdk/organizations/client.py index eaebaacbc..8117bc87d 100644 --- a/src/label_studio_sdk/organizations/client.py +++ b/src/label_studio_sdk/organizations/client.py @@ -4,6 +4,7 @@ from ..core.client_wrapper import SyncClientWrapper from .invites.client import InvitesClient from .members.client import MembersClient +from .permissions.client import PermissionsClient from ..core.request_options import RequestOptions from ..types.organization_invite import OrganizationInvite from ..core.unchecked_base_model import construct_type @@ -19,12 +20,13 @@ from .types.patched_default_role_request_custom_scripts_editable_by import ( PatchedDefaultRoleRequestCustomScriptsEditableBy, ) -from ..types.default_role_enum import DefaultRoleEnum +from ..types.role9e7enum import Role9E7Enum from ..types.default_role import DefaultRole from ..core.serialization import convert_and_respect_annotation_metadata from ..core.client_wrapper import AsyncClientWrapper from .invites.client import AsyncInvitesClient from .members.client import AsyncMembersClient +from .permissions.client import AsyncPermissionsClient # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -35,6 +37,7 @@ def __init__(self, *, client_wrapper: SyncClientWrapper): self._client_wrapper = client_wrapper self.invites = InvitesClient(client_wrapper=self._client_wrapper) self.members = MembersClient(client_wrapper=self._client_wrapper) + self.permissions = PermissionsClient(client_wrapper=self._client_wrapper) def reset_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> OrganizationInvite: """ @@ -306,7 +309,7 @@ def update_default_role( annotator_reviewer_firewall_enabled_at: typing.Optional[dt.datetime] = OMIT, custom_scripts_editable_by: typing.Optional[PatchedDefaultRoleRequestCustomScriptsEditableBy] = OMIT, custom_scripts_enabled_at: typing.Optional[dt.datetime] = OMIT, - default_role: typing.Optional[DefaultRoleEnum] = OMIT, + default_role: typing.Optional[Role9E7Enum] = OMIT, email_notification_settings: typing.Optional[typing.Optional[typing.Any]] = OMIT, embed_domains: typing.Optional[typing.Optional[typing.Any]] = OMIT, embed_settings: typing.Optional[typing.Optional[typing.Any]] = OMIT, @@ -336,7 +339,7 @@ def update_default_role( custom_scripts_enabled_at : typing.Optional[dt.datetime] Set to current time to enabled custom scripts for this organization. Can only be enabled if no organization members are active members of any other organizations; otherwise an error will be raised. If this occurs, contact the LEAP team for assistance with enabling custom scripts. - default_role : typing.Optional[DefaultRoleEnum] + default_role : typing.Optional[Role9E7Enum] Default membership role for invited users * `OW` - Owner @@ -433,6 +436,7 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper): self._client_wrapper = client_wrapper self.invites = AsyncInvitesClient(client_wrapper=self._client_wrapper) self.members = AsyncMembersClient(client_wrapper=self._client_wrapper) + self.permissions = AsyncPermissionsClient(client_wrapper=self._client_wrapper) async def reset_token(self, *, request_options: typing.Optional[RequestOptions] = None) -> OrganizationInvite: """ @@ -736,7 +740,7 @@ async def update_default_role( annotator_reviewer_firewall_enabled_at: typing.Optional[dt.datetime] = OMIT, custom_scripts_editable_by: typing.Optional[PatchedDefaultRoleRequestCustomScriptsEditableBy] = OMIT, custom_scripts_enabled_at: typing.Optional[dt.datetime] = OMIT, - default_role: typing.Optional[DefaultRoleEnum] = OMIT, + default_role: typing.Optional[Role9E7Enum] = OMIT, email_notification_settings: typing.Optional[typing.Optional[typing.Any]] = OMIT, embed_domains: typing.Optional[typing.Optional[typing.Any]] = OMIT, embed_settings: typing.Optional[typing.Optional[typing.Any]] = OMIT, @@ -766,7 +770,7 @@ async def update_default_role( custom_scripts_enabled_at : typing.Optional[dt.datetime] Set to current time to enabled custom scripts for this organization. Can only be enabled if no organization members are active members of any other organizations; otherwise an error will be raised. If this occurs, contact the LEAP team for assistance with enabling custom scripts. - default_role : typing.Optional[DefaultRoleEnum] + default_role : typing.Optional[Role9E7Enum] Default membership role for invited users * `OW` - Owner diff --git a/src/label_studio_sdk/organizations/permissions/__init__.py b/src/label_studio_sdk/organizations/permissions/__init__.py new file mode 100644 index 000000000..f3ea2659b --- /dev/null +++ b/src/label_studio_sdk/organizations/permissions/__init__.py @@ -0,0 +1,2 @@ +# This file was auto-generated by Fern from our API Definition. + diff --git a/src/label_studio_sdk/organizations/permissions/client.py b/src/label_studio_sdk/organizations/permissions/client.py new file mode 100644 index 000000000..6a356d5bb --- /dev/null +++ b/src/label_studio_sdk/organizations/permissions/client.py @@ -0,0 +1,1129 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing +from ...core.client_wrapper import SyncClientWrapper +from ...core.request_options import RequestOptions +from ...types.organization_permission import OrganizationPermission +from ...core.jsonable_encoder import jsonable_encoder +from ...core.unchecked_base_model import construct_type +from json.decoder import JSONDecodeError +from ...core.api_error import ApiError +from ...types.role9e7enum import Role9E7Enum +from ...errors.bad_request_error import BadRequestError +from ...errors.forbidden_error import ForbiddenError +from ...types.configurable_permission_option import ConfigurablePermissionOption +from ...errors.not_found_error import NotFoundError +from ...core.client_wrapper import AsyncClientWrapper + +# this is used as the default value for optional parameters +OMIT = typing.cast(typing.Any, ...) + + +class PermissionsClient: + def __init__(self, *, client_wrapper: SyncClientWrapper): + self._client_wrapper = client_wrapper + + def list( + self, id: int, *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None + ) -> typing.List[OrganizationPermission]: + """ + List all organization-level permission overrides for a given organization. + + Parameters + ---------- + id : int + + ordering : typing.Optional[str] + Which field to use when ordering the results. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + typing.List[OrganizationPermission] + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.list( + id=1, + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions", + method="GET", + params={ + "ordering": ordering, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + typing.List[OrganizationPermission], + construct_type( + type_=typing.List[OrganizationPermission], # type: ignore + object_=_response.json(), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def create( + self, + id: int, + *, + permission: str, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Create a new organization-level permission override for a given organization. + + Parameters + ---------- + id : int + + permission : str + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.create( + id=1, + permission="permission", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions", + method="POST", + json={ + "permission": permission, + "roles": roles, + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def get_options( + self, id: int, *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None + ) -> typing.List[ConfigurablePermissionOption]: + """ + Retrieve the list of configurable permission options (label, tooltip, default role and allowed roles). + + Parameters + ---------- + id : int + + ordering : typing.Optional[str] + Which field to use when ordering the results. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + typing.List[ConfigurablePermissionOption] + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.get_options( + id=1, + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/options", + method="GET", + params={ + "ordering": ordering, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + typing.List[ConfigurablePermissionOption], + construct_type( + type_=typing.List[ConfigurablePermissionOption], # type: ignore + object_=_response.json(), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def get( + self, id: int, permission: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> OrganizationPermission: + """ + Parameters + ---------- + id : int + + permission : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.get( + id=1, + permission="permission", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def replace( + self, + id: int, + permission_: str, + *, + permission: str, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Replace the organization-level permission override for a given permission key. + + Parameters + ---------- + id : int + A unique integer value identifying this organization. + + permission_ : str + Permission key to update within the organization. + + permission : str + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.replace( + id=1, + permission_="permission", + permission="permission", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission_)}", + method="PUT", + json={ + "permission": permission, + "roles": roles, + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def delete(self, id: int, permission: str, *, request_options: typing.Optional[RequestOptions] = None) -> None: + """ + Parameters + ---------- + id : int + + permission : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.delete( + id=1, + permission="permission", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + def update( + self, + id: int, + permission: str, + *, + patched_organization_permission_request_permission: typing.Optional[str] = OMIT, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Partially update the organization-level permission override for a given permission key. + + Parameters + ---------- + id : int + + permission : str + + patched_organization_permission_request_permission : typing.Optional[str] + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + from label_studio_sdk import LabelStudio + + client = LabelStudio( + api_key="YOUR_API_KEY", + ) + client.organizations.permissions.update( + id=1, + permission="permission", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="PATCH", + json={ + "permission": patched_organization_permission_request_permission, + "roles": roles, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + +class AsyncPermissionsClient: + def __init__(self, *, client_wrapper: AsyncClientWrapper): + self._client_wrapper = client_wrapper + + async def list( + self, id: int, *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None + ) -> typing.List[OrganizationPermission]: + """ + List all organization-level permission overrides for a given organization. + + Parameters + ---------- + id : int + + ordering : typing.Optional[str] + Which field to use when ordering the results. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + typing.List[OrganizationPermission] + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.list( + id=1, + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions", + method="GET", + params={ + "ordering": ordering, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + typing.List[OrganizationPermission], + construct_type( + type_=typing.List[OrganizationPermission], # type: ignore + object_=_response.json(), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def create( + self, + id: int, + *, + permission: str, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Create a new organization-level permission override for a given organization. + + Parameters + ---------- + id : int + + permission : str + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.create( + id=1, + permission="permission", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions", + method="POST", + json={ + "permission": permission, + "roles": roles, + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def get_options( + self, id: int, *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None + ) -> typing.List[ConfigurablePermissionOption]: + """ + Retrieve the list of configurable permission options (label, tooltip, default role and allowed roles). + + Parameters + ---------- + id : int + + ordering : typing.Optional[str] + Which field to use when ordering the results. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + typing.List[ConfigurablePermissionOption] + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.get_options( + id=1, + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/options", + method="GET", + params={ + "ordering": ordering, + }, + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + typing.List[ConfigurablePermissionOption], + construct_type( + type_=typing.List[ConfigurablePermissionOption], # type: ignore + object_=_response.json(), + ), + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def get( + self, id: int, permission: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> OrganizationPermission: + """ + Parameters + ---------- + id : int + + permission : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.get( + id=1, + permission="permission", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def replace( + self, + id: int, + permission_: str, + *, + permission: str, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Replace the organization-level permission override for a given permission key. + + Parameters + ---------- + id : int + A unique integer value identifying this organization. + + permission_ : str + Permission key to update within the organization. + + permission : str + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.replace( + id=1, + permission_="permission", + permission="permission", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission_)}", + method="PUT", + json={ + "permission": permission, + "roles": roles, + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def delete( + self, id: int, permission: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> None: + """ + Parameters + ---------- + id : int + + permission : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + None + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.delete( + id=1, + permission="permission", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="DELETE", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + + async def update( + self, + id: int, + permission: str, + *, + patched_organization_permission_request_permission: typing.Optional[str] = OMIT, + roles: typing.Optional[typing.Sequence[Role9E7Enum]] = OMIT, + request_options: typing.Optional[RequestOptions] = None, + ) -> OrganizationPermission: + """ + Partially update the organization-level permission override for a given permission key. + + Parameters + ---------- + id : int + + permission : str + + patched_organization_permission_request_permission : typing.Optional[str] + + roles : typing.Optional[typing.Sequence[Role9E7Enum]] + Explicit roles that have this permission within the organization. + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + OrganizationPermission + + + Examples + -------- + import asyncio + + from label_studio_sdk import AsyncLabelStudio + + client = AsyncLabelStudio( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.organizations.permissions.update( + id=1, + permission="permission", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"api/organizations/{jsonable_encoder(id)}/permissions/{jsonable_encoder(permission)}", + method="PATCH", + json={ + "permission": patched_organization_permission_request_permission, + "roles": roles, + }, + headers={ + "content-type": "application/json", + }, + request_options=request_options, + omit=OMIT, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + OrganizationPermission, + construct_type( + type_=OrganizationPermission, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 400: + raise BadRequestError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 403: + raise ForbiddenError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + if _response.status_code == 404: + raise NotFoundError( + typing.cast( + typing.Optional[typing.Any], + construct_type( + type_=typing.Optional[typing.Any], # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) diff --git a/src/label_studio_sdk/prompts/versions/client.py b/src/label_studio_sdk/prompts/versions/client.py index 641b8b08d..0185ec11a 100644 --- a/src/label_studio_sdk/prompts/versions/client.py +++ b/src/label_studio_sdk/prompts/versions/client.py @@ -62,9 +62,8 @@ def get_default_version_name(self, id: int, *, request_options: typing.Optional[ def list( self, - prompt_id_: int, - *, prompt_id: int, + *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> typing.List[ThirdPartyModelVersion]: @@ -73,10 +72,7 @@ def list( Parameters ---------- - prompt_id_ : int - prompt_id : int - A unique integer value identifying the model ID to list versions for. ordering : typing.Optional[str] Which field to use when ordering the results. @@ -97,16 +93,14 @@ def list( api_key="YOUR_API_KEY", ) client.prompts.versions.list( - prompt_id_=1, prompt_id=1, ) """ _response = self._client_wrapper.httpx_client.request( - f"api/prompts/{jsonable_encoder(prompt_id_)}/versions", + f"api/prompts/{jsonable_encoder(prompt_id)}/versions", method="GET", params={ "ordering": ordering, - "prompt_id": prompt_id, }, request_options=request_options, ) @@ -674,9 +668,8 @@ async def main() -> None: async def list( self, - prompt_id_: int, - *, prompt_id: int, + *, ordering: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, ) -> typing.List[ThirdPartyModelVersion]: @@ -685,10 +678,7 @@ async def list( Parameters ---------- - prompt_id_ : int - prompt_id : int - A unique integer value identifying the model ID to list versions for. ordering : typing.Optional[str] Which field to use when ordering the results. @@ -714,7 +704,6 @@ async def list( async def main() -> None: await client.prompts.versions.list( - prompt_id_=1, prompt_id=1, ) @@ -722,11 +711,10 @@ async def main() -> None: asyncio.run(main()) """ _response = await self._client_wrapper.httpx_client.request( - f"api/prompts/{jsonable_encoder(prompt_id_)}/versions", + f"api/prompts/{jsonable_encoder(prompt_id)}/versions", method="GET", params={ "ordering": ordering, - "prompt_id": prompt_id, }, request_options=request_options, ) diff --git a/src/label_studio_sdk/types/__init__.py b/src/label_studio_sdk/types/__init__.py index 916608b86..f539e9f73 100644 --- a/src/label_studio_sdk/types/__init__.py +++ b/src/label_studio_sdk/types/__init__.py @@ -43,13 +43,14 @@ from .comment import Comment from .comment_request import CommentRequest from .comment_serializer_with_expanded_user import CommentSerializerWithExpandedUser +from .configurable_permission_option import ConfigurablePermissionOption +from .configurable_permission_option_default import ConfigurablePermissionOptionDefault from .converted_format import ConvertedFormat from .converted_format_request import ConvertedFormatRequest from .count_limit import CountLimit from .custom_scripts_editable_by_enum import CustomScriptsEditableByEnum from .default_role import DefaultRole from .default_role_custom_scripts_editable_by import DefaultRoleCustomScriptsEditableBy -from .default_role_enum import DefaultRoleEnum from .edition_enum import EditionEnum from .export import Export from .file_upload import FileUpload @@ -139,6 +140,8 @@ from .organization_invite import OrganizationInvite from .organization_member import OrganizationMember from .organization_membership import OrganizationMembership +from .organization_permission import OrganizationPermission +from .organization_permission_request import OrganizationPermissionRequest from .paginated_all_roles_project_list_list import PaginatedAllRolesProjectListList from .paginated_annotation_history_list import PaginatedAnnotationHistoryList from .paginated_lse_organization_member_list_list import PaginatedLseOrganizationMemberListList @@ -265,13 +268,14 @@ "Comment", "CommentRequest", "CommentSerializerWithExpandedUser", + "ConfigurablePermissionOption", + "ConfigurablePermissionOptionDefault", "ConvertedFormat", "ConvertedFormatRequest", "CountLimit", "CustomScriptsEditableByEnum", "DefaultRole", "DefaultRoleCustomScriptsEditableBy", - "DefaultRoleEnum", "EditionEnum", "Export", "FileUpload", @@ -361,6 +365,8 @@ "OrganizationInvite", "OrganizationMember", "OrganizationMembership", + "OrganizationPermission", + "OrganizationPermissionRequest", "PaginatedAllRolesProjectListList", "PaginatedAnnotationHistoryList", "PaginatedLseOrganizationMemberListList", diff --git a/src/label_studio_sdk/types/azure_service_principal_import_storage.py b/src/label_studio_sdk/types/azure_service_principal_import_storage.py index 72b915bbe..b70c09bc7 100644 --- a/src/label_studio_sdk/types/azure_service_principal_import_storage.py +++ b/src/label_studio_sdk/types/azure_service_principal_import_storage.py @@ -72,6 +72,11 @@ class AzureServicePrincipalImportStorage(UncheckedBaseModel): A unique integer value identifying this project. """ + recursive_scan: typing.Optional[bool] = pydantic.Field(default=None) + """ + Perform recursive scan + """ + regex_filter: typing.Optional[str] = pydantic.Field(default=None) """ Cloud storage regex for filtering objects diff --git a/src/label_studio_sdk/types/azure_service_principal_import_storage_request.py b/src/label_studio_sdk/types/azure_service_principal_import_storage_request.py index ddf5ea445..626970cb6 100644 --- a/src/label_studio_sdk/types/azure_service_principal_import_storage_request.py +++ b/src/label_studio_sdk/types/azure_service_principal_import_storage_request.py @@ -66,6 +66,11 @@ class AzureServicePrincipalImportStorageRequest(UncheckedBaseModel): A unique integer value identifying this project. """ + recursive_scan: typing.Optional[bool] = pydantic.Field(default=None) + """ + Perform recursive scan + """ + regex_filter: typing.Optional[str] = pydantic.Field(default=None) """ Cloud storage regex for filtering objects diff --git a/src/label_studio_sdk/types/configurable_permission_option.py b/src/label_studio_sdk/types/configurable_permission_option.py new file mode 100644 index 000000000..db9475f8e --- /dev/null +++ b/src/label_studio_sdk/types/configurable_permission_option.py @@ -0,0 +1,25 @@ +# This file was auto-generated by Fern from our API Definition. + +from ..core.unchecked_base_model import UncheckedBaseModel +import typing +from .configurable_permission_option_default import ConfigurablePermissionOptionDefault +from .role9e7enum import Role9E7Enum +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +import pydantic + + +class ConfigurablePermissionOption(UncheckedBaseModel): + default: typing.Optional[ConfigurablePermissionOptionDefault] = None + label: typing.Optional[str] = None + options: typing.List[Role9E7Enum] + permission: str + tooltip: typing.Optional[str] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/label_studio_sdk/types/configurable_permission_option_default.py b/src/label_studio_sdk/types/configurable_permission_option_default.py new file mode 100644 index 000000000..ee182d47a --- /dev/null +++ b/src/label_studio_sdk/types/configurable_permission_option_default.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing +from .role9e7enum import Role9E7Enum +from .null_enum import NullEnum + +ConfigurablePermissionOptionDefault = typing.Union[Role9E7Enum, NullEnum] diff --git a/src/label_studio_sdk/types/default_role.py b/src/label_studio_sdk/types/default_role.py index fe031178a..0ad8ea3ac 100644 --- a/src/label_studio_sdk/types/default_role.py +++ b/src/label_studio_sdk/types/default_role.py @@ -5,7 +5,7 @@ import datetime as dt import pydantic from .default_role_custom_scripts_editable_by import DefaultRoleCustomScriptsEditableBy -from .default_role_enum import DefaultRoleEnum +from .role9e7enum import Role9E7Enum from ..core.pydantic_utilities import IS_PYDANTIC_V2 @@ -28,7 +28,7 @@ class DefaultRole(UncheckedBaseModel): Set to current time to enabled custom scripts for this organization. Can only be enabled if no organization members are active members of any other organizations; otherwise an error will be raised. If this occurs, contact the LEAP team for assistance with enabling custom scripts. """ - default_role: typing.Optional[DefaultRoleEnum] = pydantic.Field(default=None) + default_role: typing.Optional[Role9E7Enum] = pydantic.Field(default=None) """ Default membership role for invited users diff --git a/src/label_studio_sdk/types/default_role_enum.py b/src/label_studio_sdk/types/default_role_enum.py deleted file mode 100644 index 37e91a29c..000000000 --- a/src/label_studio_sdk/types/default_role_enum.py +++ /dev/null @@ -1,5 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -DefaultRoleEnum = typing.Union[typing.Literal["OW", "AD", "MA", "RE", "AN", "DI", "NO"], typing.Any] diff --git a/src/label_studio_sdk/types/lse_organization.py b/src/label_studio_sdk/types/lse_organization.py index cfd182c7c..511a055e9 100644 --- a/src/label_studio_sdk/types/lse_organization.py +++ b/src/label_studio_sdk/types/lse_organization.py @@ -6,7 +6,7 @@ import typing from .lse_organization_custom_scripts_editable_by import LseOrganizationCustomScriptsEditableBy import pydantic -from .default_role_enum import DefaultRoleEnum +from .role9e7enum import Role9E7Enum from ..core.pydantic_utilities import IS_PYDANTIC_V2 @@ -22,7 +22,7 @@ class LseOrganization(UncheckedBaseModel): """ custom_scripts_enabled: str - default_role: typing.Optional[DefaultRoleEnum] = pydantic.Field(default=None) + default_role: typing.Optional[Role9E7Enum] = pydantic.Field(default=None) """ Default membership role for invited users diff --git a/src/label_studio_sdk/types/organization_permission.py b/src/label_studio_sdk/types/organization_permission.py new file mode 100644 index 000000000..e9ca4c416 --- /dev/null +++ b/src/label_studio_sdk/types/organization_permission.py @@ -0,0 +1,31 @@ +# This file was auto-generated by Fern from our API Definition. + +from ..core.unchecked_base_model import UncheckedBaseModel +import typing +from .role9e7enum import Role9E7Enum +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 + + +class OrganizationPermission(UncheckedBaseModel): + default_role: str + id: int + label: str + options: str + organization: int + permission: str + roles: typing.Optional[typing.List[Role9E7Enum]] = pydantic.Field(default=None) + """ + Explicit roles that have this permission within the organization. + """ + + tooltip: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/label_studio_sdk/types/organization_permission_request.py b/src/label_studio_sdk/types/organization_permission_request.py new file mode 100644 index 000000000..6f333242a --- /dev/null +++ b/src/label_studio_sdk/types/organization_permission_request.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +from ..core.unchecked_base_model import UncheckedBaseModel +import typing +from .role9e7enum import Role9E7Enum +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 + + +class OrganizationPermissionRequest(UncheckedBaseModel): + permission: str + roles: typing.Optional[typing.List[Role9E7Enum]] = pydantic.Field(default=None) + """ + Explicit roles that have this permission within the organization. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/tests/import_storage/test_azure_spi.py b/tests/import_storage/test_azure_spi.py index 0a98ba502..71d9828cd 100644 --- a/tests/import_storage/test_azure_spi.py +++ b/tests/import_storage/test_azure_spi.py @@ -24,6 +24,7 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non "presign": True, "presign_ttl": 1, "project": 1, + "recursive_scan": True, "regex_filter": "regex_filter", "status": "initialized", "synchronizable": True, @@ -54,6 +55,7 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non "presign": None, "presign_ttl": "integer", "project": "integer", + "recursive_scan": None, "regex_filter": None, "status": None, "synchronizable": None, @@ -90,6 +92,7 @@ async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> No "presign": True, "presign_ttl": 1, "project": 1, + "recursive_scan": True, "regex_filter": "regex_filter", "status": "initialized", "synchronizable": True, @@ -116,6 +119,7 @@ async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> No "presign": None, "presign_ttl": "integer", "project": "integer", + "recursive_scan": None, "regex_filter": None, "status": None, "synchronizable": None, @@ -163,6 +167,7 @@ async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None: "presign": True, "presign_ttl": 1, "project": 1, + "recursive_scan": True, "regex_filter": "regex_filter", "status": "initialized", "synchronizable": True, @@ -189,6 +194,7 @@ async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None: "presign": None, "presign_ttl": "integer", "project": "integer", + "recursive_scan": None, "regex_filter": None, "status": None, "synchronizable": None, @@ -236,6 +242,7 @@ async def test_update(client: LabelStudio, async_client: AsyncLabelStudio) -> No "presign": True, "presign_ttl": 1, "project": 1, + "recursive_scan": True, "regex_filter": "regex_filter", "status": "initialized", "synchronizable": True, @@ -262,6 +269,7 @@ async def test_update(client: LabelStudio, async_client: AsyncLabelStudio) -> No "presign": None, "presign_ttl": "integer", "project": "integer", + "recursive_scan": None, "regex_filter": None, "status": None, "synchronizable": None, @@ -296,6 +304,7 @@ async def test_sync(client: LabelStudio, async_client: AsyncLabelStudio) -> None "presign": True, "presign_ttl": 1, "project": 1, + "recursive_scan": True, "regex_filter": "regex_filter", "status": "initialized", "synchronizable": True, @@ -322,6 +331,7 @@ async def test_sync(client: LabelStudio, async_client: AsyncLabelStudio) -> None "presign": None, "presign_ttl": "integer", "project": "integer", + "recursive_scan": None, "regex_filter": None, "status": None, "synchronizable": None, diff --git a/tests/organizations/test_permissions.py b/tests/organizations/test_permissions.py new file mode 100644 index 000000000..813475542 --- /dev/null +++ b/tests/organizations/test_permissions.py @@ -0,0 +1,183 @@ +# This file was auto-generated by Fern from our API Definition. + +from label_studio_sdk import LabelStudio +from label_studio_sdk import AsyncLabelStudio +import typing +from ..utilities import validate_response + + +async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = [ + { + "default_role": "default_role", + "id": 1, + "label": "label", + "options": "options", + "organization": 1, + "permission": "permission", + "roles": ["OW"], + "tooltip": "tooltip", + } + ] + expected_types: typing.Tuple[typing.Any, typing.Any] = ( + "list", + { + 0: { + "default_role": None, + "id": "integer", + "label": None, + "options": None, + "organization": "integer", + "permission": None, + "roles": ("list", {0: None}), + "tooltip": None, + } + }, + ) + response = client.organizations.permissions.list(id=1) + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.list(id=1) + validate_response(async_response, expected_response, expected_types) + + +async def test_create(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = { + "default_role": "default_role", + "id": 1, + "label": "label", + "options": "options", + "organization": 1, + "permission": "permission", + "roles": ["OW"], + "tooltip": "tooltip", + } + expected_types: typing.Any = { + "default_role": None, + "id": "integer", + "label": None, + "options": None, + "organization": "integer", + "permission": None, + "roles": ("list", {0: None}), + "tooltip": None, + } + response = client.organizations.permissions.create(id=1, permission="permission") + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.create(id=1, permission="permission") + validate_response(async_response, expected_response, expected_types) + + +async def test_get_options(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = [ + {"default": "OW", "label": "label", "options": ["OW"], "permission": "permission", "tooltip": "tooltip"} + ] + expected_types: typing.Tuple[typing.Any, typing.Any] = ( + "list", + {0: {"default": None, "label": None, "options": ("list", {0: None}), "permission": None, "tooltip": None}}, + ) + response = client.organizations.permissions.get_options(id=1) + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.get_options(id=1) + validate_response(async_response, expected_response, expected_types) + + +async def test_get(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = { + "default_role": "default_role", + "id": 1, + "label": "label", + "options": "options", + "organization": 1, + "permission": "permission", + "roles": ["OW"], + "tooltip": "tooltip", + } + expected_types: typing.Any = { + "default_role": None, + "id": "integer", + "label": None, + "options": None, + "organization": "integer", + "permission": None, + "roles": ("list", {0: None}), + "tooltip": None, + } + response = client.organizations.permissions.get(id=1, permission="permission") + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.get(id=1, permission="permission") + validate_response(async_response, expected_response, expected_types) + + +async def test_replace(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = { + "default_role": "default_role", + "id": 1, + "label": "label", + "options": "options", + "organization": 1, + "permission": "permission", + "roles": ["OW"], + "tooltip": "tooltip", + } + expected_types: typing.Any = { + "default_role": None, + "id": "integer", + "label": None, + "options": None, + "organization": "integer", + "permission": None, + "roles": ("list", {0: None}), + "tooltip": None, + } + response = client.organizations.permissions.replace(id=1, permission_="permission", permission="permission") + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.replace( + id=1, permission_="permission", permission="permission" + ) + validate_response(async_response, expected_response, expected_types) + + +async def test_delete(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + # Type ignore to avoid mypy complaining about the function not being meant to return a value + assert ( + client.organizations.permissions.delete(id=1, permission="permission") # type: ignore[func-returns-value] + is None + ) + + assert ( + await async_client.organizations.permissions.delete(id=1, permission="permission") # type: ignore[func-returns-value] + is None + ) + + +async def test_update(client: LabelStudio, async_client: AsyncLabelStudio) -> None: + expected_response: typing.Any = { + "default_role": "default_role", + "id": 1, + "label": "label", + "options": "options", + "organization": 1, + "permission": "permission", + "roles": ["OW"], + "tooltip": "tooltip", + } + expected_types: typing.Any = { + "default_role": None, + "id": "integer", + "label": None, + "options": None, + "organization": "integer", + "permission": None, + "roles": ("list", {0: None}), + "tooltip": None, + } + response = client.organizations.permissions.update(id=1, permission="permission") + validate_response(response, expected_response, expected_types) + + async_response = await async_client.organizations.permissions.update(id=1, permission="permission") + validate_response(async_response, expected_response, expected_types) diff --git a/tests/prompts/test_versions.py b/tests/prompts/test_versions.py index 06a4c79a1..b240ce8da 100644 --- a/tests/prompts/test_versions.py +++ b/tests/prompts/test_versions.py @@ -61,10 +61,10 @@ async def test_list_(client: LabelStudio, async_client: AsyncLabelStudio) -> Non } }, ) - response = client.prompts.versions.list(prompt_id_=1, prompt_id=1) + response = client.prompts.versions.list(prompt_id=1) validate_response(response, expected_response, expected_types) - async_response = await async_client.prompts.versions.list(prompt_id_=1, prompt_id=1) + async_response = await async_client.prompts.versions.list(prompt_id=1) validate_response(async_response, expected_response, expected_types)