diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1632485..30410d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,26 @@ name: CI on: push: branches: [ main ] + paths: + - "nexla_sdk/**" + - "scripts/**" + - "tests/**" + - "pyproject.toml" + - "requirements.txt" + - "pytest.ini" + - "README.md" + - ".github/workflows/ci.yml" pull_request: branches: [ main ] + paths: + - "nexla_sdk/**" + - "scripts/**" + - "tests/**" + - "pyproject.toml" + - "requirements.txt" + - "pytest.ini" + - "README.md" + - ".github/workflows/ci.yml" jobs: build-test: @@ -30,9 +48,12 @@ jobs: pip install ruff ruff check nexla_sdk + - name: Check Generated Operation Map Sync + run: | + python scripts/parity/check_operation_map_sync.py + - name: Run unit tests env: PYTHONWARNINGS: default run: | pytest -m unit --maxfail=1 -q - diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 99f405e..c33a188 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,8 +4,20 @@ on: push: branches: [ main ] tags: [ 'v*' ] + paths: + - "docs-site/**" + - "docs/**" + - "nexla_sdk/**" + - "README.md" + - ".github/workflows/docs.yml" pull_request: branches: [ main ] + paths: + - "docs-site/**" + - "docs/**" + - "nexla_sdk/**" + - "README.md" + - ".github/workflows/docs.yml" permissions: contents: read diff --git a/.gitignore b/.gitignore index f811e81..6a6fb54 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports +coverage/ htmlcov/ .tox/ .nox/ @@ -167,22 +168,13 @@ logs/ *.sqlite *.sqlite3 -# Node.js -.node/ -node_modules/ -**/node_modules/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.npm -.yarn-integrity - -# Documentation site +# Documentation site (Docusaurus / Node-based) docs_venv/ docs-site/docs_venv/ docs-site/.docusaurus/ docs-site/build/ docs-site/.cache/ +docs-site/node_modules/ # OpenAPI openapi/ @@ -190,7 +182,6 @@ openapi/ # Project-specific files CLAUDE.md digest.txt -plugin-redoc-0.yaml # Sample directory create_flow_sample/ @@ -202,3 +193,6 @@ create_flow_sample/ .claude/ .direnv/ .envrc + +# Parity artifacts generated from local backend/spec analysis +artifacts/parity/*.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 43274ce..c85cf58 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,12 +6,6 @@ repos: args: ["--fix"] - id: ruff-format - - repo: https://github.com/psf/black - rev: 24.8.0 - hooks: - - id: black - language_version: python3 - - repo: https://github.com/pycqa/isort rev: 5.13.2 hooks: diff --git a/README.md b/README.md index c88a4bb..b7e02a6 100644 --- a/README.md +++ b/README.md @@ -576,6 +576,25 @@ doc_audit = client.doc_containers.get_audit_log(doc_container_id=1001) schema_audit = client.data_schemas.get_audit_log(schema_id=5001) ``` +### Raw Operation-Level Access + +```python +# List available OpenAPI operation ids +ops = client.raw.list_operations() + +# Call by operation id with typed path/query/body slots +project_flows = client.raw.call( + "get_project_flows", + path_params={"project_id": 123}, +) + +# Direct raw HTTP helpers are also available +limits = client.raw.get("/limits") + +# Backend-only or non-spec route access +approved = client.raw.request("POST", "/self_signup_requests/42/approve") +``` + ## Coverage Matrix Mapping of major OpenAPI areas to SDK resources. All requests set `Accept: application/vnd.nexla.api.v1+json` and default base URL `https://dataops.nexla.io/nexla-api`. @@ -605,7 +624,8 @@ Mapping of major OpenAPI areas to SDK resources. All requests set `Accept: appli - GenAI Configurations/Org Settings: `client.genai` — configs CRUD; org settings CRUD; active_config - Doc Containers: `client.doc_containers` — audit_log; (access control via BaseResource helpers) - Data Schemas: `client.data_schemas` — audit_log; (access control via BaseResource helpers) -- Webhooks: not included as a dedicated helper yet (use direct HTTP with API key per spec) +- Webhooks: `client.create_webhook_client(api_key=...)` for API-key authenticated webhook sends +- Full OpenAPI operation-level access: `client.raw.call(operation_id, ...)` ## Error Handling @@ -682,6 +702,24 @@ export NEXLA_API_URL="https://your-nexla-instance.com/nexla-api" pytest tests/integration/ ``` +### Parity Tooling + +The parity scripts compare the SDK surface against the OpenAPI spec +(`plugin-redoc-0.yaml`, sourced from upstream and not committed) and the admin +API's `routes.rb`. Set `NEXLA_ADMIN_API_PATH` to the local checkout of the +admin-api repo before running `build_matrices.py`, or pass `--admin-routes` +explicitly. + +```bash +# Generate operation map for client.raw +python scripts/parity/generate_operation_map.py + +# Build OpenAPI/admin-routes/SDK parity matrices +export NEXLA_ADMIN_API_PATH="/path/to/admin-api" +python scripts/parity/build_matrices.py \ + --admin-routes "$NEXLA_ADMIN_API_PATH/config/routes.rb" +``` + ### Setting Up Environment ```bash diff --git a/docs-site/REPORT.md b/docs-site/REPORT.md index a97daa6..4760d51 100644 --- a/docs-site/REPORT.md +++ b/docs-site/REPORT.md @@ -1,8 +1,8 @@ # Documentation Report ## Coverage Summary -- Modules processed: 118 -- Symbols documented: 605 / 605 +- Modules processed: 221 +- Symbols documented: 889 / 889 ## Known Gaps (🚧 TODO) - None @@ -23,61 +23,115 @@ Each API page embeds per-symbol source links. Summary below. - AccessRole: `nexla_sdk/models/enums.py:4` - ApprovalRequestsResource: `nexla_sdk/resources/approval_requests.py:7` - ApprovalRequestsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- ApprovalRequestsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:25` +- ApprovalRequestsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ApprovalRequestsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ApprovalRequestsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:60` +- ApprovalRequestsResource.cancel: `nexla_sdk/resources/approval_requests.py:71` - ApprovalRequestsResource.copy: `nexla_sdk/resources/base_resource.py:321` - ApprovalRequestsResource.create: `nexla_sdk/resources/base_resource.py:229` - ApprovalRequestsResource.delete: `nexla_sdk/resources/base_resource.py:274` -- ApprovalRequestsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- ApprovalRequestsResource.get: `nexla_sdk/resources/base_resource.py:199` -- ApprovalRequestsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- ApprovalRequestsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- ApprovalRequestsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ApprovalRequestsResource.get: `nexla_sdk/resources/approval_requests.py:50` +- ApprovalRequestsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ApprovalRequestsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ApprovalRequestsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ApprovalRequestsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ApprovalRequestsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ApprovalRequestsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ApprovalRequestsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ApprovalRequestsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - ApprovalRequestsResource.list: `nexla_sdk/resources/base_resource.py:130` +- ApprovalRequestsResource.list_access_pending: `nexla_sdk/resources/approval_requests.py:35` +- ApprovalRequestsResource.list_access_requested: `nexla_sdk/resources/approval_requests.py:30` +- ApprovalRequestsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ApprovalRequestsResource.list_assigned: `nexla_sdk/resources/approval_requests.py:20` +- ApprovalRequestsResource.list_listings_pending: `nexla_sdk/resources/approval_requests.py:45` +- ApprovalRequestsResource.list_listings_requested: `nexla_sdk/resources/approval_requests.py:40` - ApprovalRequestsResource.list_pending: `nexla_sdk/resources/approval_requests.py:15` -- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:20` +- ApprovalRequestsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:25` - ApprovalRequestsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - ApprovalRequestsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:30` -- ApprovalRequestsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:65` +- ApprovalRequestsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ApprovalRequestsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ApprovalRequestsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ApprovalRequestsResource.search: `nexla_sdk/resources/base_resource.py:408` +- ApprovalRequestsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ApprovalRequestsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ApprovalRequestsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ApprovalRequestsResource.show_data_set: `nexla_sdk/resources/approval_requests.py:55` - ApprovalRequestsResource.update: `nexla_sdk/resources/base_resource.py:252` - AsyncTasksResource: `nexla_sdk/resources/async_tasks.py:8` - AsyncTasksResource.acknowledge: `nexla_sdk/resources/async_tasks.py:73` - AsyncTasksResource.activate: `nexla_sdk/resources/base_resource.py:289` -- AsyncTasksResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- AsyncTasksResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AsyncTasksResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AsyncTasksResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - AsyncTasksResource.copy: `nexla_sdk/resources/base_resource.py:321` - AsyncTasksResource.create: `nexla_sdk/resources/async_tasks.py:21` - AsyncTasksResource.delete: `nexla_sdk/resources/async_tasks.py:50` -- AsyncTasksResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- AsyncTasksResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - AsyncTasksResource.download_link: `nexla_sdk/resources/async_tasks.py:63` - AsyncTasksResource.explain_arguments: `nexla_sdk/resources/async_tasks.py:41` - AsyncTasksResource.get: `nexla_sdk/resources/async_tasks.py:45` -- AsyncTasksResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- AsyncTasksResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- AsyncTasksResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AsyncTasksResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AsyncTasksResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AsyncTasksResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AsyncTasksResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AsyncTasksResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AsyncTasksResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AsyncTasksResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - AsyncTasksResource.list: `nexla_sdk/resources/async_tasks.py:16` +- AsyncTasksResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - AsyncTasksResource.list_by_status: `nexla_sdk/resources/async_tasks.py:32` - AsyncTasksResource.list_of_type: `nexla_sdk/resources/async_tasks.py:27` +- AsyncTasksResource.list_public: `nexla_sdk/resources/base_resource.py:339` - AsyncTasksResource.paginate: `nexla_sdk/resources/base_resource.py:181` - AsyncTasksResource.pause: `nexla_sdk/resources/base_resource.py:305` -- AsyncTasksResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- AsyncTasksResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AsyncTasksResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AsyncTasksResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` - AsyncTasksResource.rerun: `nexla_sdk/resources/async_tasks.py:54` - AsyncTasksResource.result: `nexla_sdk/resources/async_tasks.py:59` +- AsyncTasksResource.search: `nexla_sdk/resources/base_resource.py:408` +- AsyncTasksResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- AsyncTasksResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AsyncTasksResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - AsyncTasksResource.types: `nexla_sdk/resources/async_tasks.py:37` - AsyncTasksResource.update: `nexla_sdk/resources/base_resource.py:252` - AttributeTransformsResource: `nexla_sdk/resources/attribute_transforms.py:11` - AttributeTransformsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- AttributeTransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- AttributeTransformsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- AttributeTransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AttributeTransformsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AttributeTransformsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- AttributeTransformsResource.copy: `nexla_sdk/resources/attribute_transforms.py:63` - AttributeTransformsResource.create: `nexla_sdk/resources/attribute_transforms.py:43` - AttributeTransformsResource.delete: `nexla_sdk/resources/attribute_transforms.py:53` -- AttributeTransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- AttributeTransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - AttributeTransformsResource.get: `nexla_sdk/resources/attribute_transforms.py:37` -- AttributeTransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- AttributeTransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- AttributeTransformsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AttributeTransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AttributeTransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AttributeTransformsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AttributeTransformsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AttributeTransformsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AttributeTransformsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AttributeTransformsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - AttributeTransformsResource.list: `nexla_sdk/resources/attribute_transforms.py:19` +- AttributeTransformsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - AttributeTransformsResource.list_public: `nexla_sdk/resources/attribute_transforms.py:57` - AttributeTransformsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - AttributeTransformsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- AttributeTransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- AttributeTransformsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AttributeTransformsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AttributeTransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- AttributeTransformsResource.search: `nexla_sdk/resources/attribute_transforms.py:67` +- AttributeTransformsResource.search_tags: `nexla_sdk/resources/attribute_transforms.py:70` +- AttributeTransformsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AttributeTransformsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - AttributeTransformsResource.update: `nexla_sdk/resources/attribute_transforms.py:47` - AuthenticationError: `nexla_sdk/exceptions.py:72` - AuthenticationError.get_error_summary: `nexla_sdk/exceptions.py:56` @@ -88,21 +142,38 @@ Each API page embeds per-symbol source links. Summary below. - BaseModel.to_json: `nexla_sdk/models/base.py:54` - CodeContainersResource: `nexla_sdk/resources/code_containers.py:11` - CodeContainersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- CodeContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- CodeContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CodeContainersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CodeContainersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - CodeContainersResource.copy: `nexla_sdk/resources/code_containers.py:67` - CodeContainersResource.create: `nexla_sdk/resources/code_containers.py:45` - CodeContainersResource.delete: `nexla_sdk/resources/code_containers.py:63` -- CodeContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- CodeContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CodeContainersResource.error_functions: `nexla_sdk/resources/code_containers.py:84` - CodeContainersResource.get: `nexla_sdk/resources/code_containers.py:37` -- CodeContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- CodeContainersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- CodeContainersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CodeContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CodeContainersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CodeContainersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CodeContainersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CodeContainersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CodeContainersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CodeContainersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - CodeContainersResource.list: `nexla_sdk/resources/code_containers.py:19` +- CodeContainersResource.list_accessible: `nexla_sdk/resources/code_containers.py:77` - CodeContainersResource.list_public: `nexla_sdk/resources/code_containers.py:71` - CodeContainersResource.paginate: `nexla_sdk/resources/base_resource.py:181` - CodeContainersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- CodeContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- CodeContainersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CodeContainersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CodeContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CodeContainersResource.repo: `nexla_sdk/resources/code_containers.py:80` +- CodeContainersResource.search: `nexla_sdk/resources/code_containers.py:87` +- CodeContainersResource.search_tags: `nexla_sdk/resources/code_containers.py:90` +- CodeContainersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CodeContainersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - CodeContainersResource.update: `nexla_sdk/resources/code_containers.py:53` -- Connector: `nexla_sdk/models/common.py:34` +- Connector: `nexla_sdk/models/common.py:38` - Connector.to_dict: `nexla_sdk/models/base.py:42` - Connector.to_json: `nexla_sdk/models/base.py:54` - ConnectorCategory: `nexla_sdk/models/enums.py:93` @@ -110,462 +181,1108 @@ Each API page embeds per-symbol source links. Summary below. - CredentialError.get_error_summary: `nexla_sdk/exceptions.py:56` - CredentialsResource: `nexla_sdk/resources/credentials.py:19` - CredentialsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- CredentialsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- CredentialsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CredentialsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CredentialsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - CredentialsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- CredentialsResource.create: `nexla_sdk/resources/credentials.py:75` -- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:105` -- CredentialsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- CredentialsResource.get: `nexla_sdk/resources/credentials.py:59` -- CredentialsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- CredentialsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- CredentialsResource.create: `nexla_sdk/resources/credentials.py:103` +- CredentialsResource.credentials_schema: `nexla_sdk/resources/credentials.py:71` +- CredentialsResource.db_data_types: `nexla_sdk/resources/credentials.py:77` +- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:133` +- CredentialsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CredentialsResource.get: `nexla_sdk/resources/credentials.py:87` +- CredentialsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CredentialsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CredentialsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CredentialsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CredentialsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CredentialsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CredentialsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CredentialsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- CredentialsResource.intent: `nexla_sdk/resources/credentials.py:297` - CredentialsResource.list: `nexla_sdk/resources/credentials.py:27` +- CredentialsResource.list_accessible: `nexla_sdk/resources/credentials.py:68` +- CredentialsResource.list_all: `nexla_sdk/resources/credentials.py:59` +- CredentialsResource.list_public: `nexla_sdk/resources/credentials.py:64` +- CredentialsResource.migrate_iceberg: `nexla_sdk/resources/credentials.py:303` - CredentialsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - CredentialsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:117` -- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:183` -- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:155` -- CredentialsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- CredentialsResource.update: `nexla_sdk/resources/credentials.py:92` -- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:7` +- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:145` +- CredentialsResource.probe_detect_schemas: `nexla_sdk/resources/credentials.py:209` +- CredentialsResource.probe_file_download: `nexla_sdk/resources/credentials.py:221` +- CredentialsResource.probe_list_buckets: `nexla_sdk/resources/credentials.py:183` +- CredentialsResource.probe_list_files: `nexla_sdk/resources/credentials.py:191` +- CredentialsResource.probe_read_file: `nexla_sdk/resources/credentials.py:203` +- CredentialsResource.probe_read_sample: `nexla_sdk/resources/credentials.py:215` +- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:261` +- CredentialsResource.probe_search_path: `nexla_sdk/resources/credentials.py:227` +- CredentialsResource.probe_summary: `nexla_sdk/resources/credentials.py:187` +- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:233` +- CredentialsResource.probe_tree_request: `nexla_sdk/resources/credentials.py:197` +- CredentialsResource.refresh: `nexla_sdk/resources/credentials.py:289` +- CredentialsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CredentialsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CredentialsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CredentialsResource.search: `nexla_sdk/resources/credentials.py:81` +- CredentialsResource.search_tags: `nexla_sdk/resources/credentials.py:84` +- CredentialsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CredentialsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- CredentialsResource.update: `nexla_sdk/resources/credentials.py:120` +- CredentialsResource.usage: `nexla_sdk/resources/credentials.py:293` +- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:8` - DataSchemasResource.activate: `nexla_sdk/resources/base_resource.py:289` -- DataSchemasResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DataSchemasResource.copy: `nexla_sdk/resources/base_resource.py:321` -- DataSchemasResource.create: `nexla_sdk/resources/base_resource.py:229` -- DataSchemasResource.delete: `nexla_sdk/resources/base_resource.py:274` -- DataSchemasResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DataSchemasResource.get: `nexla_sdk/resources/base_resource.py:199` -- DataSchemasResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:15` -- DataSchemasResource.list: `nexla_sdk/resources/base_resource.py:130` +- DataSchemasResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DataSchemasResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DataSchemasResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DataSchemasResource.copy: `nexla_sdk/resources/data_schemas.py:56` +- DataSchemasResource.create: `nexla_sdk/resources/data_schemas.py:33` +- DataSchemasResource.delete: `nexla_sdk/resources/data_schemas.py:39` +- DataSchemasResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DataSchemasResource.get: `nexla_sdk/resources/data_schemas.py:30` +- DataSchemasResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DataSchemasResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:61` +- DataSchemasResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DataSchemasResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DataSchemasResource.get_metrics: `nexla_sdk/resources/data_schemas.py:42` +- DataSchemasResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DataSchemasResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DataSchemasResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DataSchemasResource.list: `nexla_sdk/resources/data_schemas.py:16` +- DataSchemasResource.list_accessible: `nexla_sdk/resources/data_schemas.py:27` +- DataSchemasResource.list_all: `nexla_sdk/resources/data_schemas.py:19` +- DataSchemasResource.list_public: `nexla_sdk/resources/data_schemas.py:23` - DataSchemasResource.paginate: `nexla_sdk/resources/base_resource.py:181` - DataSchemasResource.pause: `nexla_sdk/resources/base_resource.py:305` -- DataSchemasResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DataSchemasResource.update: `nexla_sdk/resources/base_resource.py:252` +- DataSchemasResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DataSchemasResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DataSchemasResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DataSchemasResource.search: `nexla_sdk/resources/data_schemas.py:50` +- DataSchemasResource.search_tags: `nexla_sdk/resources/data_schemas.py:53` +- DataSchemasResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DataSchemasResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DataSchemasResource.update: `nexla_sdk/resources/data_schemas.py:36` - DestinationsResource: `nexla_sdk/resources/destinations.py:12` -- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:94` -- DestinationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:118` -- DestinationsResource.create: `nexla_sdk/resources/destinations.py:54` -- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:82` -- DestinationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DestinationsResource.get: `nexla_sdk/resources/destinations.py:38` -- DestinationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DestinationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:173` +- DestinationsResource.activate_api_key: `nexla_sdk/resources/destinations.py:354` +- DestinationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DestinationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DestinationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:197` +- DestinationsResource.create: `nexla_sdk/resources/destinations.py:86` +- DestinationsResource.create_api_key: `nexla_sdk/resources/destinations.py:340` +- DestinationsResource.create_dashboard_transforms: `nexla_sdk/resources/destinations.py:273` +- DestinationsResource.create_quarantine_settings: `nexla_sdk/resources/destinations.py:253` +- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:114` +- DestinationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DestinationsResource.delete_api_key: `nexla_sdk/resources/destinations.py:366` +- DestinationsResource.delete_dashboard_transforms: `nexla_sdk/resources/destinations.py:285` +- DestinationsResource.delete_quarantine_settings: `nexla_sdk/resources/destinations.py:265` +- DestinationsResource.edit_flow_triggers: `nexla_sdk/resources/destinations.py:309` +- DestinationsResource.get: `nexla_sdk/resources/destinations.py:70` +- DestinationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DestinationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DestinationsResource.get_api_key: `nexla_sdk/resources/destinations.py:336` +- DestinationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- DestinationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DestinationsResource.get_dashboard_transforms: `nexla_sdk/resources/destinations.py:269` +- DestinationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DestinationsResource.get_flow: `nexla_sdk/resources/destinations.py:126` +- DestinationsResource.get_flow_dashboard: `nexla_sdk/resources/destinations.py:129` +- DestinationsResource.get_flow_logs: `nexla_sdk/resources/destinations.py:144` +- DestinationsResource.get_flow_metrics: `nexla_sdk/resources/destinations.py:139` +- DestinationsResource.get_flow_status_metrics: `nexla_sdk/resources/destinations.py:134` +- DestinationsResource.get_metrics: `nexla_sdk/resources/destinations.py:149` +- DestinationsResource.get_offset: `nexla_sdk/resources/destinations.py:165` +- DestinationsResource.get_quarantine_aggregation: `nexla_sdk/resources/destinations.py:376` +- DestinationsResource.get_quarantine_offset: `nexla_sdk/resources/destinations.py:157` +- DestinationsResource.get_quarantine_settings: `nexla_sdk/resources/destinations.py:249` +- DestinationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DestinationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DestinationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - DestinationsResource.list: `nexla_sdk/resources/destinations.py:20` +- DestinationsResource.list_accessible: `nexla_sdk/resources/destinations.py:60` +- DestinationsResource.list_all: `nexla_sdk/resources/destinations.py:44` +- DestinationsResource.list_all_by_data_set: `nexla_sdk/resources/destinations.py:54` +- DestinationsResource.list_all_condensed: `nexla_sdk/resources/destinations.py:48` +- DestinationsResource.list_all_ids: `nexla_sdk/resources/destinations.py:51` +- DestinationsResource.list_api_keys: `nexla_sdk/resources/destinations.py:326` +- DestinationsResource.list_flow_triggers: `nexla_sdk/resources/destinations.py:305` +- DestinationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - DestinationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:106` -- DestinationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DestinationsResource.update: `nexla_sdk/resources/destinations.py:69` -- DocContainersResource: `nexla_sdk/resources/doc_containers.py:7` +- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:185` +- DestinationsResource.pause_all_api_keys: `nexla_sdk/resources/destinations.py:362` +- DestinationsResource.pause_api_key: `nexla_sdk/resources/destinations.py:358` +- DestinationsResource.probe_authenticate: `nexla_sdk/resources/destinations.py:221` +- DestinationsResource.probe_detect_schemas: `nexla_sdk/resources/destinations.py:237` +- DestinationsResource.probe_list_buckets: `nexla_sdk/resources/destinations.py:213` +- DestinationsResource.probe_list_files: `nexla_sdk/resources/destinations.py:225` +- DestinationsResource.probe_quarantine_sample: `nexla_sdk/resources/destinations.py:243` +- DestinationsResource.probe_read_file: `nexla_sdk/resources/destinations.py:233` +- DestinationsResource.probe_summary: `nexla_sdk/resources/destinations.py:217` +- DestinationsResource.probe_tree: `nexla_sdk/resources/destinations.py:229` +- DestinationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DestinationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DestinationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DestinationsResource.rotate_api_key: `nexla_sdk/resources/destinations.py:350` +- DestinationsResource.run_analysis: `nexla_sdk/resources/destinations.py:301` +- DestinationsResource.run_status: `nexla_sdk/resources/destinations.py:295` +- DestinationsResource.script_sink_config: `nexla_sdk/resources/destinations.py:63` +- DestinationsResource.search: `nexla_sdk/resources/destinations.py:38` +- DestinationsResource.search_api_keys: `nexla_sdk/resources/destinations.py:330` +- DestinationsResource.search_tags: `nexla_sdk/resources/destinations.py:41` +- DestinationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DestinationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DestinationsResource.test_config: `nexla_sdk/resources/destinations.py:292` +- DestinationsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/destinations.py:370` +- DestinationsResource.update: `nexla_sdk/resources/destinations.py:101` +- DestinationsResource.update_api_key: `nexla_sdk/resources/destinations.py:344` +- DestinationsResource.update_dashboard_transforms: `nexla_sdk/resources/destinations.py:279` +- DestinationsResource.update_quarantine_settings: `nexla_sdk/resources/destinations.py:259` +- DestinationsResource.update_runtime_status: `nexla_sdk/resources/destinations.py:66` +- DestinationsResource.validate_config: `nexla_sdk/resources/destinations.py:289` +- DocContainersResource: `nexla_sdk/resources/doc_containers.py:8` - DocContainersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- DocContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DocContainersResource.copy: `nexla_sdk/resources/base_resource.py:321` -- DocContainersResource.create: `nexla_sdk/resources/base_resource.py:229` -- DocContainersResource.delete: `nexla_sdk/resources/base_resource.py:274` -- DocContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DocContainersResource.get: `nexla_sdk/resources/base_resource.py:199` -- DocContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:15` -- DocContainersResource.list: `nexla_sdk/resources/base_resource.py:130` +- DocContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DocContainersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DocContainersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DocContainersResource.copy: `nexla_sdk/resources/doc_containers.py:31` +- DocContainersResource.create: `nexla_sdk/resources/doc_containers.py:22` +- DocContainersResource.delete: `nexla_sdk/resources/doc_containers.py:28` +- DocContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DocContainersResource.get: `nexla_sdk/resources/doc_containers.py:19` +- DocContainersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DocContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:42` +- DocContainersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DocContainersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DocContainersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DocContainersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DocContainersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DocContainersResource.list: `nexla_sdk/resources/doc_containers.py:16` +- DocContainersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- DocContainersResource.list_public: `nexla_sdk/resources/base_resource.py:339` - DocContainersResource.paginate: `nexla_sdk/resources/base_resource.py:181` - DocContainersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- DocContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DocContainersResource.update: `nexla_sdk/resources/base_resource.py:252` +- DocContainersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DocContainersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DocContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DocContainersResource.search: `nexla_sdk/resources/doc_containers.py:36` +- DocContainersResource.search_tags: `nexla_sdk/resources/doc_containers.py:39` +- DocContainersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DocContainersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DocContainersResource.update: `nexla_sdk/resources/doc_containers.py:25` - FlowError: `nexla_sdk/exceptions.py:132` - FlowError.get_error_summary: `nexla_sdk/exceptions.py:56` -- FlowNode: `nexla_sdk/models/common.py:66` +- FlowNode: `nexla_sdk/models/common.py:70` - FlowNode.to_dict: `nexla_sdk/models/base.py:42` - FlowNode.to_json: `nexla_sdk/models/base.py:54` - FlowsResource: `nexla_sdk/resources/flows.py:21` +- FlowsResource.accessors_by_resource: `nexla_sdk/resources/flows.py:395` - FlowsResource.activate: `nexla_sdk/resources/flows.py:117` - FlowsResource.activate_by_resource: `nexla_sdk/resources/flows.py:314` -- FlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- FlowsResource.active_flows_metrics: `nexla_sdk/resources/flows.py:527` +- FlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- FlowsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- FlowsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- FlowsResource.bulk_assign_project: `nexla_sdk/resources/flows.py:512` - FlowsResource.copy: `nexla_sdk/resources/flows.py:171` - FlowsResource.copy_and_replace_credentials: `nexla_sdk/resources/flows.py:186` +- FlowsResource.copy_by_resource: `nexla_sdk/resources/flows.py:385` - FlowsResource.create: `nexla_sdk/resources/base_resource.py:229` +- FlowsResource.create_linked_flows: `nexla_sdk/resources/flows.py:453` +- FlowsResource.daily_metrics: `nexla_sdk/resources/flows.py:521` - FlowsResource.delete: `nexla_sdk/resources/flows.py:282` -- FlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- FlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- FlowsResource.delete_all_linked_flows: `nexla_sdk/resources/flows.py:471` - FlowsResource.delete_by_resource: `nexla_sdk/resources/flows.py:294` -- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:378` +- FlowsResource.delete_linked_flows: `nexla_sdk/resources/flows.py:465` +- FlowsResource.docs_by_resource: `nexla_sdk/resources/flows.py:407` +- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:535` +- FlowsResource.flow_logs: `nexla_sdk/resources/flows.py:435` +- FlowsResource.flow_logs_v2: `nexla_sdk/resources/flows.py:439` +- FlowsResource.flow_metrics: `nexla_sdk/resources/flows.py:445` - FlowsResource.get: `nexla_sdk/resources/flows.py:67` -- FlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:475` -- FlowsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- FlowsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- FlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:632` +- FlowsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` - FlowsResource.get_by_resource: `nexla_sdk/resources/flows.py:90` -- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:397` -- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:529` -- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:581` -- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:499` +- FlowsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- FlowsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:554` +- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:686` +- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:738` +- FlowsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- FlowsResource.get_resources_access: `nexla_sdk/resources/flows.py:532` +- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:656` +- FlowsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- FlowsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- FlowsResource.import_flow: `nexla_sdk/resources/flows.py:515` +- FlowsResource.insert_flow_node: `nexla_sdk/resources/flows.py:475` - FlowsResource.list: `nexla_sdk/resources/flows.py:29` +- FlowsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- FlowsResource.list_linked_flows: `nexla_sdk/resources/flows.py:449` +- FlowsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - FlowsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - FlowsResource.pause: `nexla_sdk/resources/flows.py:140` - FlowsResource.pause_by_resource: `nexla_sdk/resources/flows.py:346` -- FlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:438` +- FlowsResource.publish_rag: `nexla_sdk/resources/flows.py:489` +- FlowsResource.publish_raw: `nexla_sdk/resources/flows.py:518` +- FlowsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- FlowsResource.remove_flow_node: `nexla_sdk/resources/flows.py:479` +- FlowsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- FlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- FlowsResource.restore_archival: `nexla_sdk/resources/flows.py:499` +- FlowsResource.run_now: `nexla_sdk/resources/flows.py:431` +- FlowsResource.run_profiles_activate: `nexla_sdk/resources/flows.py:425` +- FlowsResource.run_status: `nexla_sdk/resources/flows.py:503` +- FlowsResource.run_status_by_resource: `nexla_sdk/resources/flows.py:419` +- FlowsResource.search: `nexla_sdk/resources/flows.py:509` +- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:595` +- FlowsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- FlowsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- FlowsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- FlowsResource.total_metrics: `nexla_sdk/resources/flows.py:524` - FlowsResource.update: `nexla_sdk/resources/base_resource.py:252` +- FlowsResource.update_archival_status: `nexla_sdk/resources/flows.py:493` +- FlowsResource.update_by_resource: `nexla_sdk/resources/flows.py:378` +- FlowsResource.update_linked_flows: `nexla_sdk/resources/flows.py:459` +- FlowsResource.update_samples: `nexla_sdk/resources/flows.py:485` - GenAIResource: `nexla_sdk/resources/genai.py:16` - GenAIResource.activate: `nexla_sdk/resources/base_resource.py:289` -- GenAIResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- GenAIResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- GenAIResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- GenAIResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - GenAIResource.copy: `nexla_sdk/resources/base_resource.py:321` - GenAIResource.create: `nexla_sdk/resources/base_resource.py:229` - GenAIResource.create_config: `nexla_sdk/resources/genai.py:29` - GenAIResource.create_org_setting: `nexla_sdk/resources/genai.py:66` - GenAIResource.delete: `nexla_sdk/resources/base_resource.py:274` -- GenAIResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- GenAIResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - GenAIResource.delete_config: `nexla_sdk/resources/genai.py:49` -- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:77` +- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:86` +- GenAIResource.delete_org_settings: `nexla_sdk/resources/genai.py:91` - GenAIResource.get: `nexla_sdk/resources/base_resource.py:199` -- GenAIResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- GenAIResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- GenAIResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- GenAIResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- GenAIResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` - GenAIResource.get_config: `nexla_sdk/resources/genai.py:34` +- GenAIResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- GenAIResource.get_docs: `nexla_sdk/resources/base_resource.py:438` - GenAIResource.get_org_setting: `nexla_sdk/resources/genai.py:71` +- GenAIResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- GenAIResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- GenAIResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - GenAIResource.list: `nexla_sdk/resources/base_resource.py:130` +- GenAIResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - GenAIResource.list_configs: `nexla_sdk/resources/genai.py:25` - GenAIResource.list_org_settings: `nexla_sdk/resources/genai.py:55` +- GenAIResource.list_public: `nexla_sdk/resources/base_resource.py:339` - GenAIResource.paginate: `nexla_sdk/resources/base_resource.py:181` - GenAIResource.pause: `nexla_sdk/resources/base_resource.py:305` -- GenAIResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:82` +- GenAIResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- GenAIResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- GenAIResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- GenAIResource.search: `nexla_sdk/resources/base_resource.py:408` +- GenAIResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- GenAIResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- GenAIResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:94` - GenAIResource.update: `nexla_sdk/resources/base_resource.py:252` - GenAIResource.update_config: `nexla_sdk/resources/genai.py:40` -- LogEntry: `nexla_sdk/models/common.py:45` +- GenAIResource.update_org_setting: `nexla_sdk/resources/genai.py:77` +- LogEntry: `nexla_sdk/models/common.py:49` - LogEntry.to_dict: `nexla_sdk/models/base.py:42` - LogEntry.to_json: `nexla_sdk/models/base.py:54` - LookupsResource: `nexla_sdk/resources/lookups.py:14` - LookupsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- LookupsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- LookupsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- LookupsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- LookupsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - LookupsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- LookupsResource.create: `nexla_sdk/resources/lookups.py:56` -- LookupsResource.delete: `nexla_sdk/resources/lookups.py:84` -- LookupsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:137` -- LookupsResource.get: `nexla_sdk/resources/lookups.py:40` -- LookupsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- LookupsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:116` +- LookupsResource.create: `nexla_sdk/resources/lookups.py:63` +- LookupsResource.delete: `nexla_sdk/resources/lookups.py:91` +- LookupsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:165` +- LookupsResource.delete_entries_by_body: `nexla_sdk/resources/lookups.py:186` +- LookupsResource.download_map: `nexla_sdk/resources/lookups.py:113` +- LookupsResource.get: `nexla_sdk/resources/lookups.py:47` +- LookupsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- LookupsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- LookupsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- LookupsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- LookupsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:138` +- LookupsResource.get_entries_by_body: `nexla_sdk/resources/lookups.py:159` +- LookupsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- LookupsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- LookupsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - LookupsResource.list: `nexla_sdk/resources/lookups.py:22` +- LookupsResource.list_accessible: `nexla_sdk/resources/lookups.py:44` +- LookupsResource.list_public: `nexla_sdk/resources/lookups.py:40` - LookupsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - LookupsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- LookupsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- LookupsResource.update: `nexla_sdk/resources/lookups.py:71` -- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:96` +- LookupsResource.probe_sample: `nexla_sdk/resources/lookups.py:192` +- LookupsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- LookupsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- LookupsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- LookupsResource.search: `nexla_sdk/resources/lookups.py:103` +- LookupsResource.search_tags: `nexla_sdk/resources/lookups.py:106` +- LookupsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- LookupsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- LookupsResource.update: `nexla_sdk/resources/lookups.py:78` +- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:118` +- LookupsResource.validate: `nexla_sdk/resources/lookups.py:109` - MarketplaceResource: `nexla_sdk/resources/marketplace.py:16` - MarketplaceResource.activate: `nexla_sdk/resources/base_resource.py:289` -- MarketplaceResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:91` +- MarketplaceResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- MarketplaceResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:136` +- MarketplaceResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - MarketplaceResource.copy: `nexla_sdk/resources/base_resource.py:321` - MarketplaceResource.create: `nexla_sdk/resources/base_resource.py:229` - MarketplaceResource.create_domain: `nexla_sdk/resources/marketplace.py:53` -- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:66` +- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:71` - MarketplaceResource.create_domains: `nexla_sdk/resources/marketplace.py:29` - MarketplaceResource.delete: `nexla_sdk/resources/base_resource.py:274` -- MarketplaceResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- MarketplaceResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - MarketplaceResource.delete_domain: `nexla_sdk/resources/marketplace.py:58` +- MarketplaceResource.delist_domain_item: `nexla_sdk/resources/marketplace.py:94` - MarketplaceResource.get: `nexla_sdk/resources/base_resource.py:199` -- MarketplaceResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- MarketplaceResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- MarketplaceResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- MarketplaceResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- MarketplaceResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- MarketplaceResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- MarketplaceResource.get_docs: `nexla_sdk/resources/base_resource.py:438` - MarketplaceResource.get_domain: `nexla_sdk/resources/marketplace.py:40` +- MarketplaceResource.get_domain_audit_log: `nexla_sdk/resources/marketplace.py:61` +- MarketplaceResource.get_domain_item: `nexla_sdk/resources/marketplace.py:80` - MarketplaceResource.get_domains_for_org: `nexla_sdk/resources/marketplace.py:34` +- MarketplaceResource.get_item: `nexla_sdk/resources/marketplace.py:110` +- MarketplaceResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- MarketplaceResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- MarketplaceResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - MarketplaceResource.list: `nexla_sdk/resources/base_resource.py:130` -- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:76` -- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:62` +- MarketplaceResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:121` +- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:67` - MarketplaceResource.list_domains: `nexla_sdk/resources/marketplace.py:25` +- MarketplaceResource.list_items: `nexla_sdk/resources/marketplace.py:106` +- MarketplaceResource.list_public: `nexla_sdk/resources/base_resource.py:339` - MarketplaceResource.paginate: `nexla_sdk/resources/base_resource.py:181` - MarketplaceResource.pause: `nexla_sdk/resources/base_resource.py:305` -- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:100` -- MarketplaceResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- MarketplaceResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:145` +- MarketplaceResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- MarketplaceResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- MarketplaceResource.request_item_access: `nexla_sdk/resources/marketplace.py:99` +- MarketplaceResource.search: `nexla_sdk/resources/base_resource.py:408` +- MarketplaceResource.search_domain_items: `nexla_sdk/resources/marketplace.py:86` +- MarketplaceResource.search_items: `nexla_sdk/resources/marketplace.py:114` +- MarketplaceResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- MarketplaceResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- MarketplaceResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - MarketplaceResource.update: `nexla_sdk/resources/base_resource.py:252` - MarketplaceResource.update_domain: `nexla_sdk/resources/marketplace.py:44` -- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:82` +- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:127` - MetricsResource: `nexla_sdk/resources/metrics.py:26` - MetricsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- MetricsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- MetricsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- MetricsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- MetricsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - MetricsResource.copy: `nexla_sdk/resources/base_resource.py:321` - MetricsResource.create: `nexla_sdk/resources/base_resource.py:229` - MetricsResource.delete: `nexla_sdk/resources/base_resource.py:274` -- MetricsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- MetricsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - MetricsResource.get: `nexla_sdk/resources/base_resource.py:199` -- MetricsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- MetricsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:216` -- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:162` -- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:148` +- MetricsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- MetricsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- MetricsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- MetricsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- MetricsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:220` +- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:166` +- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:152` - MetricsResource.get_rate_limits: `nexla_sdk/resources/metrics.py:111` +- MetricsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` - MetricsResource.get_resource_daily_metrics: `nexla_sdk/resources/metrics.py:39` -- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:121` +- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:125` - MetricsResource.get_resource_metrics_by_run: `nexla_sdk/resources/metrics.py:70` +- MetricsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- MetricsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - MetricsResource.list: `nexla_sdk/resources/base_resource.py:130` +- MetricsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- MetricsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - MetricsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - MetricsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- MetricsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- MetricsResource.publish_raw: `nexla_sdk/resources/metrics.py:121` +- MetricsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- MetricsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- MetricsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- MetricsResource.search: `nexla_sdk/resources/base_resource.py:408` +- MetricsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- MetricsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- MetricsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - MetricsResource.update: `nexla_sdk/resources/base_resource.py:252` -- NexlaClient: `nexla_sdk/client.py:52` -- NexlaClient.create_webhook_client: `nexla_sdk/client.py:243` -- NexlaClient.get_access_token: `nexla_sdk/client.py:193` -- NexlaClient.logout: `nexla_sdk/client.py:235` -- NexlaClient.refresh_access_token: `nexla_sdk/client.py:215` -- NexlaClient.request: `nexla_sdk/client.py:316` +- NexlaClient: `nexla_sdk/client.py:82` +- NexlaClient.create_webhook_client: `nexla_sdk/client.py:311` +- NexlaClient.get_access_token: `nexla_sdk/client.py:261` +- NexlaClient.logout: `nexla_sdk/client.py:303` +- NexlaClient.refresh_access_token: `nexla_sdk/client.py:283` +- NexlaClient.request: `nexla_sdk/client.py:384` - NexlaError: `nexla_sdk/exceptions.py:4` - NexlaError.get_error_summary: `nexla_sdk/exceptions.py:56` -- NexsetsResource: `nexla_sdk/resources/nexsets.py:12` -- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:94` -- NexsetsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:147` -- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:54` -- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:82` -- NexsetsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:161` -- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:38` -- NexsetsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- NexsetsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:118` -- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:20` +- NexsetsResource: `nexla_sdk/resources/nexsets.py:14` +- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:146` +- NexsetsResource.activate_api_key: `nexla_sdk/resources/nexsets.py:430` +- NexsetsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NexsetsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NexsetsResource.add_samples: `nexla_sdk/resources/nexsets.py:209` +- NexsetsResource.add_sharers: `nexla_sdk/resources/nexsets.py:321` +- NexsetsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- NexsetsResource.bulk_update_catalog_refs: `nexla_sdk/resources/nexsets.py:399` +- NexsetsResource.catalog_add: `nexla_sdk/resources/nexsets.py:261` +- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:216` +- NexsetsResource.copy_docs: `nexla_sdk/resources/nexsets.py:536` +- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:106` +- NexsetsResource.create_api_key: `nexla_sdk/resources/nexsets.py:416` +- NexsetsResource.create_catalog_ref: `nexla_sdk/resources/nexsets.py:385` +- NexsetsResource.create_dashboard_transforms: `nexla_sdk/resources/nexsets.py:297` +- NexsetsResource.create_quarantine_settings: `nexla_sdk/resources/nexsets.py:277` +- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:134` +- NexsetsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NexsetsResource.delete_api_key: `nexla_sdk/resources/nexsets.py:442` +- NexsetsResource.delete_catalog_ref: `nexla_sdk/resources/nexsets.py:395` +- NexsetsResource.delete_dashboard_transforms: `nexla_sdk/resources/nexsets.py:309` +- NexsetsResource.delete_quarantine_settings: `nexla_sdk/resources/nexsets.py:289` +- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:456` +- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:90` +- NexsetsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NexsetsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NexsetsResource.get_api_key: `nexla_sdk/resources/nexsets.py:412` +- NexsetsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NexsetsResource.get_catalog_ref: `nexla_sdk/resources/nexsets.py:380` +- NexsetsResource.get_characteristics: `nexla_sdk/resources/nexsets.py:353` +- NexsetsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NexsetsResource.get_dashboard_transforms: `nexla_sdk/resources/nexsets.py:293` +- NexsetsResource.get_data_update_time: `nexla_sdk/resources/nexsets.py:349` +- NexsetsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NexsetsResource.get_flow: `nexla_sdk/resources/nexsets.py:234` +- NexsetsResource.get_flow_dashboard: `nexla_sdk/resources/nexsets.py:237` +- NexsetsResource.get_flow_logs: `nexla_sdk/resources/nexsets.py:249` +- NexsetsResource.get_flow_metrics: `nexla_sdk/resources/nexsets.py:245` +- NexsetsResource.get_flow_status_metrics: `nexla_sdk/resources/nexsets.py:241` +- NexsetsResource.get_metrics: `nexla_sdk/resources/nexsets.py:253` +- NexsetsResource.get_offset: `nexla_sdk/resources/nexsets.py:345` +- NexsetsResource.get_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:452` +- NexsetsResource.get_quarantine_offset: `nexla_sdk/resources/nexsets.py:341` +- NexsetsResource.get_quarantine_settings: `nexla_sdk/resources/nexsets.py:273` +- NexsetsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:170` +- NexsetsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NexsetsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:22` +- NexsetsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NexsetsResource.list_all: `nexla_sdk/resources/nexsets.py:40` +- NexsetsResource.list_all_condensed: `nexla_sdk/resources/nexsets.py:44` +- NexsetsResource.list_all_ids: `nexla_sdk/resources/nexsets.py:47` +- NexsetsResource.list_api_keys: `nexla_sdk/resources/nexsets.py:402` +- NexsetsResource.list_available: `nexla_sdk/resources/nexsets.py:50` +- NexsetsResource.list_catalog_refs: `nexla_sdk/resources/nexsets.py:375` +- NexsetsResource.list_characteristics_search: `nexla_sdk/resources/nexsets.py:72` +- NexsetsResource.list_docs: `nexla_sdk/resources/nexsets.py:461` +- NexsetsResource.list_nexset_api_compatible: `nexla_sdk/resources/nexsets.py:80` +- NexsetsResource.list_public: `nexla_sdk/resources/nexsets.py:63` +- NexsetsResource.list_shared: `nexla_sdk/resources/nexsets.py:59` +- NexsetsResource.list_sharers: `nexla_sdk/resources/nexsets.py:313` +- NexsetsResource.list_summary: `nexla_sdk/resources/nexsets.py:77` +- NexsetsResource.mark_shared: `nexla_sdk/resources/nexsets.py:331` - NexsetsResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:106` -- NexsetsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:69` +- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:158` +- NexsetsResource.pause_all_api_keys: `nexla_sdk/resources/nexsets.py:438` +- NexsetsResource.pause_api_key: `nexla_sdk/resources/nexsets.py:434` +- NexsetsResource.probe_quarantine_sample: `nexla_sdk/resources/nexsets.py:335` +- NexsetsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NexsetsResource.remove_sharers: `nexla_sdk/resources/nexsets.py:325` +- NexsetsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NexsetsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NexsetsResource.rotate_api_key: `nexla_sdk/resources/nexsets.py:426` +- NexsetsResource.search: `nexla_sdk/resources/nexsets.py:361` +- NexsetsResource.search_api_keys: `nexla_sdk/resources/nexsets.py:406` +- NexsetsResource.search_available: `nexla_sdk/resources/nexsets.py:54` +- NexsetsResource.search_public_tags: `nexla_sdk/resources/nexsets.py:67` +- NexsetsResource.search_tags: `nexla_sdk/resources/nexsets.py:364` +- NexsetsResource.semantic_schemas: `nexla_sdk/resources/nexsets.py:265` +- NexsetsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NexsetsResource.set_sharers: `nexla_sdk/resources/nexsets.py:317` +- NexsetsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- NexsetsResource.summary: `nexla_sdk/resources/nexsets.py:357` +- NexsetsResource.sync_with_catalog: `nexla_sdk/resources/nexsets.py:230` +- NexsetsResource.transform: `nexla_sdk/resources/nexsets.py:269` +- NexsetsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:446` +- NexsetsResource.unvote: `nexla_sdk/resources/nexsets.py:371` +- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:121` +- NexsetsResource.update_api_key: `nexla_sdk/resources/nexsets.py:420` +- NexsetsResource.update_catalog_ref: `nexla_sdk/resources/nexsets.py:390` +- NexsetsResource.update_dashboard_transforms: `nexla_sdk/resources/nexsets.py:303` +- NexsetsResource.update_docs: `nexla_sdk/resources/nexsets.py:491` +- NexsetsResource.update_quarantine_settings: `nexla_sdk/resources/nexsets.py:283` +- NexsetsResource.update_runtime_status: `nexla_sdk/resources/nexsets.py:86` +- NexsetsResource.update_samples: `nexla_sdk/resources/nexsets.py:199` +- NexsetsResource.vote: `nexla_sdk/resources/nexsets.py:367` - NotFoundError: `nexla_sdk/exceptions.py:88` - NotFoundError.get_error_summary: `nexla_sdk/exceptions.py:56` - NotificationChannel: `nexla_sdk/models/enums.py:57` - NotificationLevel: `nexla_sdk/models/enums.py:46` - NotificationsResource: `nexla_sdk/resources/notifications.py:19` - NotificationsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- NotificationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- NotificationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NotificationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NotificationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - NotificationsResource.copy: `nexla_sdk/resources/base_resource.py:321` - NotificationsResource.create: `nexla_sdk/resources/base_resource.py:229` -- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:195` -- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:285` +- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:221` +- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:311` - NotificationsResource.delete: `nexla_sdk/resources/notifications.py:40` -- NotificationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:90` -- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:242` -- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:330` +- NotificationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:96` +- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:268` +- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:356` - NotificationsResource.get: `nexla_sdk/resources/notifications.py:27` -- NotificationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- NotificationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:211` -- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:100` -- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:361` -- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:299` -- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:343` -- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:167` -- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:152` +- NotificationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NotificationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NotificationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:237` +- NotificationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:111` +- NotificationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NotificationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:387` +- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:325` +- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:369` +- NotificationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:193` +- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:178` +- NotificationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - NotificationsResource.list: `nexla_sdk/resources/notifications.py:52` -- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:184` -- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:256` -- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:115` -- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:133` +- NotificationsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:210` +- NotificationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:282` +- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:126` +- NotificationsResource.mark_read_for: `nexla_sdk/resources/notifications.py:162` +- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:144` +- NotificationsResource.mark_unread_for: `nexla_sdk/resources/notifications.py:168` - NotificationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - NotificationsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- NotificationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- NotificationsResource.publish_raw: `nexla_sdk/resources/notifications.py:174` +- NotificationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NotificationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NotificationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NotificationsResource.search: `nexla_sdk/resources/base_resource.py:408` +- NotificationsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- NotificationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NotificationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - NotificationsResource.update: `nexla_sdk/resources/base_resource.py:252` -- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:225` -- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:313` +- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:251` +- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:339` - OrgAuthConfigsResource: `nexla_sdk/resources/org_auth_configs.py:8` - OrgAuthConfigsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- OrgAuthConfigsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- OrgAuthConfigsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- OrgAuthConfigsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- OrgAuthConfigsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- OrgAuthConfigsResource.client_config: `nexla_sdk/resources/org_auth_configs.py:30` - OrgAuthConfigsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:31` -- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:45` -- OrgAuthConfigsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:26` -- OrgAuthConfigsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- OrgAuthConfigsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:43` +- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:57` +- OrgAuthConfigsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:38` +- OrgAuthConfigsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- OrgAuthConfigsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- OrgAuthConfigsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- OrgAuthConfigsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- OrgAuthConfigsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- OrgAuthConfigsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- OrgAuthConfigsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- OrgAuthConfigsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- OrgAuthConfigsResource.info: `nexla_sdk/resources/org_auth_configs.py:34` - OrgAuthConfigsResource.list: `nexla_sdk/resources/org_auth_configs.py:16` +- OrgAuthConfigsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - OrgAuthConfigsResource.list_all: `nexla_sdk/resources/org_auth_configs.py:21` +- OrgAuthConfigsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- OrgAuthConfigsResource.list_sign_on_options: `nexla_sdk/resources/org_auth_configs.py:26` - OrgAuthConfigsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - OrgAuthConfigsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- OrgAuthConfigsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:37` +- OrgAuthConfigsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- OrgAuthConfigsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- OrgAuthConfigsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- OrgAuthConfigsResource.search: `nexla_sdk/resources/base_resource.py:408` +- OrgAuthConfigsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- OrgAuthConfigsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- OrgAuthConfigsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:49` - OrgMembershipStatus: `nexla_sdk/models/enums.py:86` -- Organization: `nexla_sdk/models/common.py:16` +- Organization: `nexla_sdk/models/common.py:20` - Organization.to_dict: `nexla_sdk/models/base.py:42` - Organization.to_json: `nexla_sdk/models/base.py:54` - OrganizationsResource: `nexla_sdk/resources/organizations.py:22` - OrganizationsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:173` -- OrganizationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:365` +- OrganizationsResource.activate_cluster: `nexla_sdk/resources/organizations.py:273` +- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:190` +- OrganizationsResource.activate_org: `nexla_sdk/resources/organizations.py:245` +- OrganizationsResource.activate_rate_limited_sources: `nexla_sdk/resources/organizations.py:236` +- OrganizationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:501` +- OrganizationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- OrganizationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - OrganizationsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:61` -- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:156` -- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:86` -- OrganizationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:142` -- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:48` -- OrganizationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:190` -- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:227` -- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:316` -- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:204` -- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:348` -- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:269` -- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:98` -- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:215` -- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:294` +- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:65` +- OrganizationsResource.create_dashboard_transforms: `nexla_sdk/resources/organizations.py:335` +- OrganizationsResource.create_notification_settings: `nexla_sdk/resources/organizations.py:285` +- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:173` +- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:90` +- OrganizationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- OrganizationsResource.delete_dashboard_transforms: `nexla_sdk/resources/organizations.py:347` +- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:159` +- OrganizationsResource.delete_notification_settings: `nexla_sdk/resources/organizations.py:297` +- OrganizationsResource.disable_feature: `nexla_sdk/resources/organizations.py:315` +- OrganizationsResource.enable_feature: `nexla_sdk/resources/organizations.py:311` +- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:52` +- OrganizationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- OrganizationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- OrganizationsResource.get_account_rate_limited: `nexla_sdk/resources/organizations.py:232` +- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:207` +- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:363` +- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:452` +- OrganizationsResource.get_clusters: `nexla_sdk/resources/organizations.py:265` +- OrganizationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:221` +- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:484` +- OrganizationsResource.get_dashboard_transforms: `nexla_sdk/resources/organizations.py:331` +- OrganizationsResource.get_data_sets_catalog_config: `nexla_sdk/resources/organizations.py:307` +- OrganizationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:405` +- OrganizationsResource.get_flows_account_metrics: `nexla_sdk/resources/organizations.py:359` +- OrganizationsResource.get_flows_dashboard: `nexla_sdk/resources/organizations.py:351` +- OrganizationsResource.get_flows_report: `nexla_sdk/resources/organizations.py:261` +- OrganizationsResource.get_flows_status_metrics: `nexla_sdk/resources/organizations.py:355` +- OrganizationsResource.get_login_history: `nexla_sdk/resources/organizations.py:102` +- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:115` +- OrganizationsResource.get_metrics: `nexla_sdk/resources/organizations.py:107` +- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:319` +- OrganizationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:430` +- OrganizationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- OrganizationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - OrganizationsResource.list: `nexla_sdk/resources/organizations.py:30` +- OrganizationsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- OrganizationsResource.list_all: `nexla_sdk/resources/organizations.py:48` +- OrganizationsResource.list_data_sets_catalog_configs: `nexla_sdk/resources/organizations.py:303` +- OrganizationsResource.list_notification_settings: `nexla_sdk/resources/organizations.py:281` +- OrganizationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - OrganizationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - OrganizationsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:375` -- OrganizationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:127` -- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:73` -- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:329` -- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:355` -- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:112` -- Owner: `nexla_sdk/models/common.py:7` +- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:511` +- OrganizationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- OrganizationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- OrganizationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:144` +- OrganizationsResource.revert_cluster: `nexla_sdk/resources/organizations.py:277` +- OrganizationsResource.search: `nexla_sdk/resources/base_resource.py:408` +- OrganizationsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- OrganizationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- OrganizationsResource.set_rate_limits: `nexla_sdk/resources/organizations.py:253` +- OrganizationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- OrganizationsResource.throttle: `nexla_sdk/resources/organizations.py:257` +- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:77` +- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:465` +- OrganizationsResource.update_cluster: `nexla_sdk/resources/organizations.py:269` +- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:491` +- OrganizationsResource.update_dashboard_transforms: `nexla_sdk/resources/organizations.py:341` +- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:129` +- OrganizationsResource.update_notification_settings: `nexla_sdk/resources/organizations.py:291` +- Owner: `nexla_sdk/models/common.py:11` - Owner.to_dict: `nexla_sdk/models/base.py:42` - Owner.to_json: `nexla_sdk/models/base.py:54` - ProjectsResource: `nexla_sdk/resources/projects.py:13` - ProjectsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- ProjectsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:170` -- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:113` -- ProjectsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ProjectsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:184` +- ProjectsResource.add_data_flows_legacy: `nexla_sdk/resources/projects.py:215` +- ProjectsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:127` +- ProjectsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ProjectsResource.copy: `nexla_sdk/resources/projects.py:99` - ProjectsResource.create: `nexla_sdk/resources/projects.py:59` - ProjectsResource.delete: `nexla_sdk/resources/projects.py:87` -- ProjectsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- ProjectsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - ProjectsResource.get: `nexla_sdk/resources/projects.py:43` -- ProjectsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- ProjectsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:99` +- ProjectsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ProjectsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ProjectsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ProjectsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ProjectsResource.get_data_flows_legacy: `nexla_sdk/resources/projects.py:194` +- ProjectsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:113` +- ProjectsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ProjectsResource.get_resources_access: `nexla_sdk/resources/projects.py:110` +- ProjectsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ProjectsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - ProjectsResource.list: `nexla_sdk/resources/projects.py:21` +- ProjectsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ProjectsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - ProjectsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - ProjectsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:190` -- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:151` -- ProjectsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:180` -- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:132` -- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:200` +- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:233` +- ProjectsResource.remove_data_flows_legacy: `nexla_sdk/resources/projects.py:243` +- ProjectsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:165` +- ProjectsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ProjectsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:205` +- ProjectsResource.replace_data_flows_legacy: `nexla_sdk/resources/projects.py:224` +- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:146` +- ProjectsResource.search: `nexla_sdk/resources/projects.py:104` +- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:252` +- ProjectsResource.search_tags: `nexla_sdk/resources/projects.py:107` +- ProjectsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ProjectsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - ProjectsResource.update: `nexla_sdk/resources/projects.py:74` - RateLimitError: `nexla_sdk/exceptions.py:100` - RateLimitError.get_error_summary: `nexla_sdk/exceptions.py:56` +- RawOperationsClient: `nexla_sdk/raw_operations.py:31` +- RawOperationsClient.call: `nexla_sdk/raw_operations.py:63` +- RawOperationsClient.delete: `nexla_sdk/raw_operations.py:155` +- RawOperationsClient.get: `nexla_sdk/raw_operations.py:107` +- RawOperationsClient.get_operation: `nexla_sdk/raw_operations.py:41` +- RawOperationsClient.head: `nexla_sdk/raw_operations.py:189` +- RawOperationsClient.list_operations: `nexla_sdk/raw_operations.py:37` +- RawOperationsClient.options: `nexla_sdk/raw_operations.py:203` +- RawOperationsClient.patch: `nexla_sdk/raw_operations.py:172` +- RawOperationsClient.post: `nexla_sdk/raw_operations.py:121` +- RawOperationsClient.put: `nexla_sdk/raw_operations.py:138` +- RawOperationsClient.request: `nexla_sdk/raw_operations.py:88` - ResourceConflictError: `nexla_sdk/exceptions.py:114` - ResourceConflictError.get_error_summary: `nexla_sdk/exceptions.py:56` - ResourceStatus: `nexla_sdk/models/enums.py:13` - ResourceType: `nexla_sdk/models/enums.py:25` - RuntimesResource: `nexla_sdk/resources/runtimes.py:8` - RuntimesResource.activate: `nexla_sdk/resources/runtimes.py:45` -- RuntimesResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- RuntimesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- RuntimesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- RuntimesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - RuntimesResource.copy: `nexla_sdk/resources/base_resource.py:321` - RuntimesResource.create: `nexla_sdk/resources/runtimes.py:21` - RuntimesResource.delete: `nexla_sdk/resources/runtimes.py:40` -- RuntimesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- RuntimesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - RuntimesResource.get: `nexla_sdk/resources/runtimes.py:27` -- RuntimesResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- RuntimesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- RuntimesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- RuntimesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- RuntimesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- RuntimesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- RuntimesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- RuntimesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- RuntimesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- RuntimesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - RuntimesResource.list: `nexla_sdk/resources/runtimes.py:16` +- RuntimesResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- RuntimesResource.list_public: `nexla_sdk/resources/base_resource.py:339` - RuntimesResource.paginate: `nexla_sdk/resources/base_resource.py:181` - RuntimesResource.pause: `nexla_sdk/resources/runtimes.py:51` -- RuntimesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- RuntimesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- RuntimesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- RuntimesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- RuntimesResource.search: `nexla_sdk/resources/base_resource.py:408` +- RuntimesResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- RuntimesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- RuntimesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - RuntimesResource.update: `nexla_sdk/resources/runtimes.py:33` - SelfSignupResource: `nexla_sdk/resources/self_signup.py:7` - SelfSignupResource.activate: `nexla_sdk/resources/base_resource.py:289` -- SelfSignupResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:39` +- SelfSignupResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:40` +- SelfSignupResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SelfSignupResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - SelfSignupResource.approve_request: `nexla_sdk/resources/self_signup.py:29` - SelfSignupResource.copy: `nexla_sdk/resources/base_resource.py:321` - SelfSignupResource.create: `nexla_sdk/resources/base_resource.py:229` - SelfSignupResource.delete: `nexla_sdk/resources/base_resource.py:274` -- SelfSignupResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:51` +- SelfSignupResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:52` - SelfSignupResource.get: `nexla_sdk/resources/base_resource.py:199` -- SelfSignupResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- SelfSignupResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- SelfSignupResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SelfSignupResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SelfSignupResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SelfSignupResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SelfSignupResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SelfSignupResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SelfSignupResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SelfSignupResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - SelfSignupResource.list: `nexla_sdk/resources/base_resource.py:130` -- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:35` +- SelfSignupResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:36` +- SelfSignupResource.list_public: `nexla_sdk/resources/base_resource.py:339` - SelfSignupResource.list_requests: `nexla_sdk/resources/self_signup.py:25` - SelfSignupResource.paginate: `nexla_sdk/resources/base_resource.py:181` - SelfSignupResource.pause: `nexla_sdk/resources/base_resource.py:305` -- SelfSignupResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- SelfSignupResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SelfSignupResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SelfSignupResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SelfSignupResource.search: `nexla_sdk/resources/base_resource.py:408` +- SelfSignupResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- SelfSignupResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SelfSignupResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - SelfSignupResource.signup: `nexla_sdk/resources/self_signup.py:16` - SelfSignupResource.update: `nexla_sdk/resources/base_resource.py:252` -- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:45` +- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:46` - SelfSignupResource.verify_email: `nexla_sdk/resources/self_signup.py:19` - ServerError: `nexla_sdk/exceptions.py:108` - ServerError.get_error_summary: `nexla_sdk/exceptions.py:56` - SourcesResource: `nexla_sdk/resources/sources.py:12` -- SourcesResource.activate: `nexla_sdk/resources/sources.py:98` -- SourcesResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- SourcesResource.copy: `nexla_sdk/resources/sources.py:122` -- SourcesResource.create: `nexla_sdk/resources/sources.py:58` -- SourcesResource.delete: `nexla_sdk/resources/sources.py:86` -- SourcesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- SourcesResource.get: `nexla_sdk/resources/sources.py:42` -- SourcesResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- SourcesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- SourcesResource.activate: `nexla_sdk/resources/sources.py:171` +- SourcesResource.activate_api_key: `nexla_sdk/resources/sources.py:374` +- SourcesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SourcesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SourcesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- SourcesResource.copy: `nexla_sdk/resources/sources.py:195` +- SourcesResource.create: `nexla_sdk/resources/sources.py:84` +- SourcesResource.create_api_key: `nexla_sdk/resources/sources.py:360` +- SourcesResource.create_dashboard_transforms: `nexla_sdk/resources/sources.py:287` +- SourcesResource.create_quarantine_settings: `nexla_sdk/resources/sources.py:267` +- SourcesResource.delete: `nexla_sdk/resources/sources.py:112` +- SourcesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SourcesResource.delete_api_key: `nexla_sdk/resources/sources.py:386` +- SourcesResource.delete_dashboard_transforms: `nexla_sdk/resources/sources.py:299` +- SourcesResource.delete_quarantine_settings: `nexla_sdk/resources/sources.py:279` +- SourcesResource.edit_flow_triggers: `nexla_sdk/resources/sources.py:329` +- SourcesResource.get: `nexla_sdk/resources/sources.py:68` +- SourcesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SourcesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SourcesResource.get_api_key: `nexla_sdk/resources/sources.py:356` +- SourcesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SourcesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SourcesResource.get_dashboard_transforms: `nexla_sdk/resources/sources.py:283` +- SourcesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SourcesResource.get_flow: `nexla_sdk/resources/sources.py:124` +- SourcesResource.get_flow_dashboard: `nexla_sdk/resources/sources.py:127` +- SourcesResource.get_flow_logs: `nexla_sdk/resources/sources.py:142` +- SourcesResource.get_flow_metrics: `nexla_sdk/resources/sources.py:137` +- SourcesResource.get_flow_status_metrics: `nexla_sdk/resources/sources.py:132` +- SourcesResource.get_metrics: `nexla_sdk/resources/sources.py:147` +- SourcesResource.get_offset: `nexla_sdk/resources/sources.py:163` +- SourcesResource.get_quarantine_aggregation: `nexla_sdk/resources/sources.py:396` +- SourcesResource.get_quarantine_offset: `nexla_sdk/resources/sources.py:155` +- SourcesResource.get_quarantine_settings: `nexla_sdk/resources/sources.py:263` +- SourcesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SourcesResource.get_reingested_files: `nexla_sdk/resources/sources.py:255` +- SourcesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SourcesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - SourcesResource.list: `nexla_sdk/resources/sources.py:20` +- SourcesResource.list_accessible: `nexla_sdk/resources/sources.py:58` +- SourcesResource.list_all: `nexla_sdk/resources/sources.py:48` +- SourcesResource.list_all_condensed: `nexla_sdk/resources/sources.py:52` +- SourcesResource.list_all_ids: `nexla_sdk/resources/sources.py:55` +- SourcesResource.list_api_keys: `nexla_sdk/resources/sources.py:346` +- SourcesResource.list_data_sinks: `nexla_sdk/resources/sources.py:309` +- SourcesResource.list_flow_triggers: `nexla_sdk/resources/sources.py:325` +- SourcesResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- SourcesResource.list_runs: `nexla_sdk/resources/sources.py:321` - SourcesResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- SourcesResource.pause: `nexla_sdk/resources/sources.py:110` -- SourcesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- SourcesResource.update: `nexla_sdk/resources/sources.py:73` -- TeamsResource: `nexla_sdk/resources/teams.py:8` +- SourcesResource.pause: `nexla_sdk/resources/sources.py:183` +- SourcesResource.pause_all_api_keys: `nexla_sdk/resources/sources.py:382` +- SourcesResource.pause_api_key: `nexla_sdk/resources/sources.py:378` +- SourcesResource.probe_authenticate: `nexla_sdk/resources/sources.py:219` +- SourcesResource.probe_detect_schemas: `nexla_sdk/resources/sources.py:239` +- SourcesResource.probe_list_buckets: `nexla_sdk/resources/sources.py:211` +- SourcesResource.probe_list_files: `nexla_sdk/resources/sources.py:223` +- SourcesResource.probe_quarantine_sample: `nexla_sdk/resources/sources.py:245` +- SourcesResource.probe_read_file: `nexla_sdk/resources/sources.py:233` +- SourcesResource.probe_sample: `nexla_sdk/resources/sources.py:251` +- SourcesResource.probe_summary: `nexla_sdk/resources/sources.py:215` +- SourcesResource.probe_tree: `nexla_sdk/resources/sources.py:229` +- SourcesResource.ready: `nexla_sdk/resources/sources.py:317` +- SourcesResource.reingest_files: `nexla_sdk/resources/sources.py:259` +- SourcesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SourcesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SourcesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SourcesResource.rotate_api_key: `nexla_sdk/resources/sources.py:370` +- SourcesResource.run_now: `nexla_sdk/resources/sources.py:313` +- SourcesResource.script_source_config: `nexla_sdk/resources/sources.py:61` +- SourcesResource.search: `nexla_sdk/resources/sources.py:42` +- SourcesResource.search_api_keys: `nexla_sdk/resources/sources.py:350` +- SourcesResource.search_tags: `nexla_sdk/resources/sources.py:45` +- SourcesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SourcesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- SourcesResource.test_config: `nexla_sdk/resources/sources.py:306` +- SourcesResource.trigger_quarantine_aggregation: `nexla_sdk/resources/sources.py:390` +- SourcesResource.update: `nexla_sdk/resources/sources.py:99` +- SourcesResource.update_api_key: `nexla_sdk/resources/sources.py:364` +- SourcesResource.update_dashboard_transforms: `nexla_sdk/resources/sources.py:293` +- SourcesResource.update_quarantine_settings: `nexla_sdk/resources/sources.py:273` +- SourcesResource.update_runtime_status: `nexla_sdk/resources/sources.py:64` +- SourcesResource.validate_config: `nexla_sdk/resources/sources.py:303` +- TeamsResource: `nexla_sdk/resources/teams.py:9` - TeamsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- TeamsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- TeamsResource.add_members: `nexla_sdk/resources/teams.py:104` +- TeamsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- TeamsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- TeamsResource.add_members: `nexla_sdk/resources/teams.py:105` +- TeamsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - TeamsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- TeamsResource.create: `nexla_sdk/resources/teams.py:50` -- TeamsResource.delete: `nexla_sdk/resources/teams.py:78` -- TeamsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- TeamsResource.get: `nexla_sdk/resources/teams.py:34` -- TeamsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- TeamsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- TeamsResource.get_members: `nexla_sdk/resources/teams.py:90` -- TeamsResource.list: `nexla_sdk/resources/teams.py:16` +- TeamsResource.create: `nexla_sdk/resources/teams.py:51` +- TeamsResource.delete: `nexla_sdk/resources/teams.py:79` +- TeamsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- TeamsResource.get: `nexla_sdk/resources/teams.py:35` +- TeamsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- TeamsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- TeamsResource.get_audit_log: `nexla_sdk/resources/teams.py:155` +- TeamsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- TeamsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- TeamsResource.get_members: `nexla_sdk/resources/teams.py:91` +- TeamsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- TeamsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- TeamsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- TeamsResource.list: `nexla_sdk/resources/teams.py:17` +- TeamsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- TeamsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - TeamsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - TeamsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:136` -- TeamsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:119` -- TeamsResource.update: `nexla_sdk/resources/teams.py:65` +- TeamsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:137` +- TeamsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- TeamsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:120` +- TeamsResource.search: `nexla_sdk/resources/base_resource.py:408` +- TeamsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- TeamsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- TeamsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- TeamsResource.update: `nexla_sdk/resources/teams.py:66` - TransformError: `nexla_sdk/exceptions.py:152` - TransformError.get_error_summary: `nexla_sdk/exceptions.py:56` - TransformsResource: `nexla_sdk/resources/transforms.py:8` - TransformsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- TransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- TransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- TransformsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- TransformsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - TransformsResource.copy: `nexla_sdk/resources/transforms.py:50` - TransformsResource.create: `nexla_sdk/resources/transforms.py:38` - TransformsResource.delete: `nexla_sdk/resources/transforms.py:46` -- TransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- TransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - TransformsResource.get: `nexla_sdk/resources/transforms.py:34` -- TransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- TransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- TransformsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- TransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- TransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- TransformsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- TransformsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- TransformsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- TransformsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- TransformsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - TransformsResource.list: `nexla_sdk/resources/transforms.py:16` +- TransformsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - TransformsResource.list_public: `nexla_sdk/resources/transforms.py:54` - TransformsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - TransformsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- TransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- TransformsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- TransformsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- TransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- TransformsResource.search: `nexla_sdk/resources/transforms.py:60` +- TransformsResource.search_tags: `nexla_sdk/resources/transforms.py:63` +- TransformsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- TransformsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- TransformsResource.transform: `nexla_sdk/resources/transforms.py:66` +- TransformsResource.transform_data: `nexla_sdk/resources/transforms.py:73` +- TransformsResource.transform_features: `nexla_sdk/resources/transforms.py:70` - TransformsResource.update: `nexla_sdk/resources/transforms.py:42` - UserStatus: `nexla_sdk/models/enums.py:76` - UserTier: `nexla_sdk/models/enums.py:67` -- UsersResource: `nexla_sdk/resources/users.py:9` -- UsersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- UsersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- UsersResource: `nexla_sdk/resources/users.py:10` +- UsersResource.activate: `nexla_sdk/resources/users.py:332` +- UsersResource.activate_api_key: `nexla_sdk/resources/users.py:462` +- UsersResource.activate_rate_limited_sources: `nexla_sdk/resources/users.py:345` +- UsersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- UsersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- UsersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- UsersResource.change_password: `nexla_sdk/resources/users.py:132` - UsersResource.copy: `nexla_sdk/resources/base_resource.py:321` -- UsersResource.create: `nexla_sdk/resources/users.py:65` -- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:134` -- UsersResource.delete: `nexla_sdk/resources/users.py:93` -- UsersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:168` -- UsersResource.get: `nexla_sdk/resources/users.py:43` -- UsersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:258` -- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:181` -- UsersResource.get_current: `nexla_sdk/resources/users.py:116` -- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:339` -- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:319` -- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:290` -- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:121` -- UsersResource.get_settings: `nexla_sdk/resources/users.py:105` -- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:225` -- UsersResource.list: `nexla_sdk/resources/users.py:17` +- UsersResource.create: `nexla_sdk/resources/users.py:69` +- UsersResource.create_api_key: `nexla_sdk/resources/users.py:448` +- UsersResource.create_credit: `nexla_sdk/resources/users.py:398` +- UsersResource.create_dashboard_transforms: `nexla_sdk/resources/users.py:302` +- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:206` +- UsersResource.delete: `nexla_sdk/resources/users.py:97` +- UsersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- UsersResource.delete_api_key: `nexla_sdk/resources/users.py:474` +- UsersResource.delete_credit: `nexla_sdk/resources/users.py:429` +- UsersResource.delete_dashboard_transforms: `nexla_sdk/resources/users.py:314` +- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:240` +- UsersResource.expire_credit: `nexla_sdk/resources/users.py:425` +- UsersResource.get: `nexla_sdk/resources/users.py:47` +- UsersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- UsersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:479` +- UsersResource.get_account_rate_limited: `nexla_sdk/resources/users.py:354` +- UsersResource.get_account_summary: `nexla_sdk/resources/users.py:110` +- UsersResource.get_api_key: `nexla_sdk/resources/users.py:444` +- UsersResource.get_api_key_events: `nexla_sdk/resources/users.py:168` +- UsersResource.get_audit_history: `nexla_sdk/resources/users.py:160` +- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:258` +- UsersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- UsersResource.get_credit: `nexla_sdk/resources/users.py:404` +- UsersResource.get_current: `nexla_sdk/resources/users.py:154` +- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:560` +- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:540` +- UsersResource.get_dashboard_transforms: `nexla_sdk/resources/users.py:254` +- UsersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:511` +- UsersResource.get_flows_account_metrics: `nexla_sdk/resources/users.py:327` +- UsersResource.get_flows_dashboard: `nexla_sdk/resources/users.py:319` +- UsersResource.get_flows_status_metrics: `nexla_sdk/resources/users.py:323` +- UsersResource.get_login_history: `nexla_sdk/resources/users.py:164` +- UsersResource.get_metrics: `nexla_sdk/resources/users.py:180` +- UsersResource.get_orgs: `nexla_sdk/resources/users.py:188` +- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:193` +- UsersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- UsersResource.get_resource_audit_log: `nexla_sdk/resources/users.py:172` +- UsersResource.get_settings: `nexla_sdk/resources/users.py:143` +- UsersResource.get_sso_options: `nexla_sdk/resources/users.py:136` +- UsersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:359` +- UsersResource.get_user_account_summary: `nexla_sdk/resources/users.py:114` +- UsersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- UsersResource.list: `nexla_sdk/resources/users.py:18` +- UsersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- UsersResource.list_api_keys: `nexla_sdk/resources/users.py:434` +- UsersResource.list_credits: `nexla_sdk/resources/users.py:393` +- UsersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- UsersResource.list_sso_options: `nexla_sdk/resources/users.py:44` +- UsersResource.lock_account: `nexla_sdk/resources/users.py:337` - UsersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- UsersResource.password_entropy: `nexla_sdk/resources/users.py:126` - UsersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- UsersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:240` -- UsersResource.update: `nexla_sdk/resources/users.py:80` -- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:152` +- UsersResource.pause_all_api_keys: `nexla_sdk/resources/users.py:470` +- UsersResource.pause_api_key: `nexla_sdk/resources/users.py:466` +- UsersResource.refresh_credit: `nexla_sdk/resources/users.py:421` +- UsersResource.refresh_credits: `nexla_sdk/resources/users.py:417` +- UsersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- UsersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- UsersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- UsersResource.reset_password: `nexla_sdk/resources/users.py:120` +- UsersResource.rotate_api_key: `nexla_sdk/resources/users.py:458` +- UsersResource.search: `nexla_sdk/resources/base_resource.py:408` +- UsersResource.search_api_keys: `nexla_sdk/resources/users.py:438` +- UsersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- UsersResource.send_invite: `nexla_sdk/resources/users.py:129` +- UsersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- UsersResource.set_password: `nexla_sdk/resources/users.py:123` +- UsersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:374` +- UsersResource.unlock_account: `nexla_sdk/resources/users.py:341` +- UsersResource.update: `nexla_sdk/resources/users.py:84` +- UsersResource.update_api_key: `nexla_sdk/resources/users.py:452` +- UsersResource.update_dashboard_transforms: `nexla_sdk/resources/users.py:308` +- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:224` +- UsersResource.use_credit: `nexla_sdk/resources/users.py:413` +- UsersResource.use_credits: `nexla_sdk/resources/users.py:409` - ValidationError: `nexla_sdk/exceptions.py:94` - ValidationError.get_error_summary: `nexla_sdk/exceptions.py:56` ### nexla_sdk.auth @@ -577,12 +1294,12 @@ Each API page embeds per-symbol source links. Summary below. - TokenAuthHandler.obtain_session_token: `nexla_sdk/auth.py:88` - TokenAuthHandler.refresh_session_token: `nexla_sdk/auth.py:143` ### nexla_sdk.client -- NexlaClient: `nexla_sdk/client.py:52` -- NexlaClient.create_webhook_client: `nexla_sdk/client.py:243` -- NexlaClient.get_access_token: `nexla_sdk/client.py:193` -- NexlaClient.logout: `nexla_sdk/client.py:235` -- NexlaClient.refresh_access_token: `nexla_sdk/client.py:215` -- NexlaClient.request: `nexla_sdk/client.py:316` +- NexlaClient: `nexla_sdk/client.py:82` +- NexlaClient.create_webhook_client: `nexla_sdk/client.py:311` +- NexlaClient.get_access_token: `nexla_sdk/client.py:261` +- NexlaClient.logout: `nexla_sdk/client.py:303` +- NexlaClient.refresh_access_token: `nexla_sdk/client.py:283` +- NexlaClient.request: `nexla_sdk/client.py:384` ### nexla_sdk.exceptions - AuthenticationError: `nexla_sdk/exceptions.py:72` - AuthenticationError.get_error_summary: `nexla_sdk/exceptions.py:56` @@ -606,6 +1323,15 @@ Each API page embeds per-symbol source links. Summary below. - TransformError.get_error_summary: `nexla_sdk/exceptions.py:56` - ValidationError: `nexla_sdk/exceptions.py:94` - ValidationError.get_error_summary: `nexla_sdk/exceptions.py:56` +### nexla_sdk.generated +- OperationSpec: `nexla_sdk/generated/operation_map.py:6` +- RawRequest: `nexla_sdk/generated/schema.py:10` +- RawResponse: `nexla_sdk/generated/schema.py:17` +### nexla_sdk.generated.operation_map +- OperationSpec: `nexla_sdk/generated/operation_map.py:6` +### nexla_sdk.generated.schema +- RawRequest: `nexla_sdk/generated/schema.py:10` +- RawResponse: `nexla_sdk/generated/schema.py:17` ### nexla_sdk.http_client - HttpClientError: `nexla_sdk/http_client.py:66` - HttpClientInterface: `nexla_sdk/http_client.py:38` @@ -627,6 +1353,18 @@ Each API page embeds per-symbol source links. Summary below. - ActiveConfigView: `nexla_sdk/models/genai/responses.py:26` - ActiveConfigView.to_dict: `nexla_sdk/models/base.py:42` - ActiveConfigView.to_json: `nexla_sdk/models/base.py:54` +- ApiKey: `nexla_sdk/models/api_keys/responses.py:9` +- ApiKey.to_dict: `nexla_sdk/models/base.py:42` +- ApiKey.to_json: `nexla_sdk/models/base.py:54` +- ApiKeyCreate: `nexla_sdk/models/api_keys/requests.py:6` +- ApiKeyCreate.to_dict: `nexla_sdk/models/base.py:42` +- ApiKeyCreate.to_json: `nexla_sdk/models/base.py:54` +- ApiKeyUpdate: `nexla_sdk/models/api_keys/requests.py:13` +- ApiKeyUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ApiKeyUpdate.to_json: `nexla_sdk/models/base.py:54` +- ApiKeysIndex: `nexla_sdk/models/api_keys/responses.py:37` +- ApiKeysIndex.to_dict: `nexla_sdk/models/base.py:42` +- ApiKeysIndex.to_json: `nexla_sdk/models/base.py:54` - ApprovalDecision: `nexla_sdk/models/approval_requests/requests.py:6` - ApprovalDecision.to_dict: `nexla_sdk/models/base.py:42` - ApprovalDecision.to_json: `nexla_sdk/models/base.py:54` @@ -657,12 +1395,81 @@ Each API page embeds per-symbol source links. Summary below. - AuthConfigPayload: `nexla_sdk/models/org_auth_configs/requests.py:6` - AuthConfigPayload.to_dict: `nexla_sdk/models/base.py:42` - AuthConfigPayload.to_json: `nexla_sdk/models/base.py:54` +- AuthParameter: `nexla_sdk/models/auth_templates/responses.py:12` +- AuthParameter.to_dict: `nexla_sdk/models/base.py:42` +- AuthParameter.to_json: `nexla_sdk/models/base.py:54` +- AuthParameterCreate: `nexla_sdk/models/auth_templates/requests.py:8` +- AuthParameterCreate.to_dict: `nexla_sdk/models/base.py:42` +- AuthParameterCreate.to_json: `nexla_sdk/models/base.py:54` +- AuthParameterResource: `nexla_sdk/models/auth_parameters/responses.py:13` +- AuthParameterResource.to_dict: `nexla_sdk/models/base.py:42` +- AuthParameterResource.to_json: `nexla_sdk/models/base.py:54` +- AuthParameterResourceCreate: `nexla_sdk/models/auth_parameters/requests.py:6` +- AuthParameterResourceCreate.to_dict: `nexla_sdk/models/base.py:42` +- AuthParameterResourceCreate.to_json: `nexla_sdk/models/base.py:54` +- AuthParameterResourceUpdate: `nexla_sdk/models/auth_parameters/requests.py:20` +- AuthParameterResourceUpdate.to_dict: `nexla_sdk/models/base.py:42` +- AuthParameterResourceUpdate.to_json: `nexla_sdk/models/base.py:54` +- AuthTemplate: `nexla_sdk/models/auth_templates/responses.py:33` +- AuthTemplate.to_dict: `nexla_sdk/models/base.py:42` +- AuthTemplate.to_json: `nexla_sdk/models/base.py:54` +- AuthTemplateCreate: `nexla_sdk/models/auth_templates/requests.py:20` +- AuthTemplateCreate.to_dict: `nexla_sdk/models/base.py:42` +- AuthTemplateCreate.to_json: `nexla_sdk/models/base.py:54` +- AuthTemplateParameter: `nexla_sdk/models/auth_templates/responses.py:12` +- AuthTemplateParameter.to_dict: `nexla_sdk/models/base.py:42` +- AuthTemplateParameter.to_json: `nexla_sdk/models/base.py:54` +- AuthTemplateUpdate: `nexla_sdk/models/auth_templates/requests.py:31` +- AuthTemplateUpdate.to_dict: `nexla_sdk/models/base.py:42` +- AuthTemplateUpdate.to_json: `nexla_sdk/models/base.py:54` - BaseModel: `nexla_sdk/models/base.py:10` - BaseModel.to_dict: `nexla_sdk/models/base.py:42` - BaseModel.to_json: `nexla_sdk/models/base.py:54` - BlockedDomain: `nexla_sdk/models/self_signup/responses.py:17` - BlockedDomain.to_dict: `nexla_sdk/models/base.py:42` - BlockedDomain.to_json: `nexla_sdk/models/base.py:54` +- CatalogConfig: `nexla_sdk/models/catalog_configs/responses.py:9` +- CatalogConfig.to_dict: `nexla_sdk/models/base.py:42` +- CatalogConfig.to_json: `nexla_sdk/models/base.py:54` +- CatalogConfigCreate: `nexla_sdk/models/catalog_configs/requests.py:6` +- CatalogConfigCreate.to_dict: `nexla_sdk/models/base.py:42` +- CatalogConfigCreate.to_json: `nexla_sdk/models/base.py:54` +- CatalogConfigUpdate: `nexla_sdk/models/catalog_configs/requests.py:15` +- CatalogConfigUpdate.to_dict: `nexla_sdk/models/base.py:42` +- CatalogConfigUpdate.to_json: `nexla_sdk/models/base.py:54` +- CatalogRef: `nexla_sdk/models/catalog_refs/responses.py:8` +- CatalogRef.to_dict: `nexla_sdk/models/base.py:42` +- CatalogRef.to_json: `nexla_sdk/models/base.py:54` +- CatalogRefCreate: `nexla_sdk/models/catalog_refs/requests.py:6` +- CatalogRefCreate.to_dict: `nexla_sdk/models/base.py:42` +- CatalogRefCreate.to_json: `nexla_sdk/models/base.py:54` +- CatalogRefUpdate: `nexla_sdk/models/catalog_refs/requests.py:13` +- CatalogRefUpdate.to_dict: `nexla_sdk/models/base.py:42` +- CatalogRefUpdate.to_json: `nexla_sdk/models/base.py:54` +- Cluster: `nexla_sdk/models/clusters/responses.py:24` +- Cluster.to_dict: `nexla_sdk/models/base.py:42` +- Cluster.to_json: `nexla_sdk/models/base.py:54` +- ClusterCreate: `nexla_sdk/models/clusters/requests.py:19` +- ClusterCreate.to_dict: `nexla_sdk/models/base.py:42` +- ClusterCreate.to_json: `nexla_sdk/models/base.py:54` +- ClusterEndpoint: `nexla_sdk/models/clusters/responses.py:47` +- ClusterEndpoint.to_dict: `nexla_sdk/models/base.py:42` +- ClusterEndpoint.to_json: `nexla_sdk/models/base.py:54` +- ClusterEndpointCreate: `nexla_sdk/models/clusters/requests.py:43` +- ClusterEndpointCreate.to_dict: `nexla_sdk/models/base.py:42` +- ClusterEndpointCreate.to_json: `nexla_sdk/models/base.py:54` +- ClusterEndpointItem: `nexla_sdk/models/clusters/requests.py:8` +- ClusterEndpointItem.to_dict: `nexla_sdk/models/base.py:42` +- ClusterEndpointItem.to_json: `nexla_sdk/models/base.py:54` +- ClusterEndpointRef: `nexla_sdk/models/clusters/responses.py:12` +- ClusterEndpointRef.to_dict: `nexla_sdk/models/base.py:42` +- ClusterEndpointRef.to_json: `nexla_sdk/models/base.py:54` +- ClusterEndpointUpdate: `nexla_sdk/models/clusters/requests.py:55` +- ClusterEndpointUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ClusterEndpointUpdate.to_json: `nexla_sdk/models/base.py:54` +- ClusterUpdate: `nexla_sdk/models/clusters/requests.py:32` +- ClusterUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ClusterUpdate.to_json: `nexla_sdk/models/base.py:54` - CodeContainer: `nexla_sdk/models/code_containers/responses.py:12` - CodeContainer.to_dict: `nexla_sdk/models/base.py:42` - CodeContainer.to_json: `nexla_sdk/models/base.py:54` @@ -672,11 +1479,17 @@ Each API page embeds per-symbol source links. Summary below. - CodeContainerUpdate: `nexla_sdk/models/code_containers/requests.py:26` - CodeContainerUpdate.to_dict: `nexla_sdk/models/base.py:42` - CodeContainerUpdate.to_json: `nexla_sdk/models/base.py:54` -- Connector: `nexla_sdk/models/common.py:34` +- Connector: `nexla_sdk/models/common.py:38` - Connector.to_dict: `nexla_sdk/models/base.py:42` - Connector.to_json: `nexla_sdk/models/base.py:54` - ConnectorCategory: `nexla_sdk/models/enums.py:93` -- Credential: `nexla_sdk/models/credentials/responses.py:10` +- ConnectorDefinition: `nexla_sdk/models/connectors/responses.py:13` +- ConnectorDefinition.to_dict: `nexla_sdk/models/base.py:42` +- ConnectorDefinition.to_json: `nexla_sdk/models/base.py:54` +- ConnectorUpdate: `nexla_sdk/models/connectors/requests.py:8` +- ConnectorUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ConnectorUpdate.to_json: `nexla_sdk/models/base.py:54` +- Credential: `nexla_sdk/models/credentials/responses.py:11` - Credential.to_dict: `nexla_sdk/models/base.py:42` - Credential.to_json: `nexla_sdk/models/base.py:54` - CredentialCreate: `nexla_sdk/models/credentials/requests.py:6` @@ -692,19 +1505,49 @@ Each API page embeds per-symbol source links. Summary below. - CustodiansPayload: `nexla_sdk/models/marketplace/requests.py:13` - CustodiansPayload.to_dict: `nexla_sdk/models/base.py:42` - CustodiansPayload.to_json: `nexla_sdk/models/base.py:54` +- CustomDataFlow: `nexla_sdk/models/custom_data_flows/responses.py:10` +- CustomDataFlow.to_dict: `nexla_sdk/models/base.py:42` +- CustomDataFlow.to_json: `nexla_sdk/models/base.py:54` +- CustomDataFlowCreate: `nexla_sdk/models/custom_data_flows/requests.py:6` +- CustomDataFlowCreate.to_dict: `nexla_sdk/models/base.py:42` +- CustomDataFlowCreate.to_json: `nexla_sdk/models/base.py:54` +- CustomDataFlowUpdate: `nexla_sdk/models/custom_data_flows/requests.py:17` +- CustomDataFlowUpdate.to_dict: `nexla_sdk/models/base.py:42` +- CustomDataFlowUpdate.to_json: `nexla_sdk/models/base.py:54` - DashboardMetrics: `nexla_sdk/models/metrics/responses.py:23` - DashboardMetrics.to_dict: `nexla_sdk/models/base.py:42` - DashboardMetrics.to_json: `nexla_sdk/models/base.py:54` -- DataMapInfo: `nexla_sdk/models/destinations/responses.py:25` +- DashboardTransform: `nexla_sdk/models/dashboard_transforms/responses.py:8` +- DashboardTransform.to_dict: `nexla_sdk/models/base.py:42` +- DashboardTransform.to_json: `nexla_sdk/models/base.py:54` +- DashboardTransformCreate: `nexla_sdk/models/dashboard_transforms/requests.py:6` +- DashboardTransformCreate.to_dict: `nexla_sdk/models/base.py:42` +- DashboardTransformCreate.to_json: `nexla_sdk/models/base.py:54` +- DashboardTransformUpdate: `nexla_sdk/models/dashboard_transforms/requests.py:10` +- DashboardTransformUpdate.to_dict: `nexla_sdk/models/base.py:42` +- DashboardTransformUpdate.to_json: `nexla_sdk/models/base.py:54` +- DataCredentialsGroup: `nexla_sdk/models/data_credentials_groups/responses.py:8` +- DataCredentialsGroup.to_dict: `nexla_sdk/models/base.py:42` +- DataCredentialsGroup.to_json: `nexla_sdk/models/base.py:54` +- DataCredentialsGroupCreate: `nexla_sdk/models/data_credentials_groups/requests.py:6` +- DataCredentialsGroupCreate.to_dict: `nexla_sdk/models/base.py:42` +- DataCredentialsGroupCreate.to_json: `nexla_sdk/models/base.py:54` +- DataCredentialsGroupRemoveCredentials: `nexla_sdk/models/data_credentials_groups/requests.py:20` +- DataCredentialsGroupRemoveCredentials.to_dict: `nexla_sdk/models/base.py:42` +- DataCredentialsGroupRemoveCredentials.to_json: `nexla_sdk/models/base.py:54` +- DataCredentialsGroupUpdate: `nexla_sdk/models/data_credentials_groups/requests.py:13` +- DataCredentialsGroupUpdate.to_dict: `nexla_sdk/models/base.py:42` +- DataCredentialsGroupUpdate.to_json: `nexla_sdk/models/base.py:54` +- DataMapInfo: `nexla_sdk/models/destinations/responses.py:28` - DataMapInfo.to_dict: `nexla_sdk/models/base.py:42` - DataMapInfo.to_json: `nexla_sdk/models/base.py:54` - DataSchema: `nexla_sdk/models/data_schemas/responses.py:6` - DataSchema.to_dict: `nexla_sdk/models/base.py:42` - DataSchema.to_json: `nexla_sdk/models/base.py:54` -- DataSetBrief: `nexla_sdk/models/sources/responses.py:11` +- DataSetBrief: `nexla_sdk/models/sources/responses.py:12` - DataSetBrief.to_dict: `nexla_sdk/models/base.py:42` - DataSetBrief.to_json: `nexla_sdk/models/base.py:54` -- DataSetInfo: `nexla_sdk/models/destinations/responses.py:12` +- DataSetInfo: `nexla_sdk/models/destinations/responses.py:15` - DataSetInfo.to_dict: `nexla_sdk/models/base.py:42` - DataSetInfo.to_json: `nexla_sdk/models/base.py:54` - DataSinkSimplified: `nexla_sdk/models/nexsets/responses.py:12` @@ -713,7 +1556,7 @@ Each API page embeds per-symbol source links. Summary below. - DefaultOrg: `nexla_sdk/models/users/responses.py:9` - DefaultOrg.to_dict: `nexla_sdk/models/base.py:42` - DefaultOrg.to_json: `nexla_sdk/models/base.py:54` -- Destination: `nexla_sdk/models/destinations/responses.py:38` +- Destination: `nexla_sdk/models/destinations/responses.py:41` - Destination.to_dict: `nexla_sdk/models/base.py:42` - Destination.to_json: `nexla_sdk/models/base.py:54` - DestinationCopyOptions: `nexla_sdk/models/destinations/requests.py:33` @@ -728,9 +1571,12 @@ Each API page embeds per-symbol source links. Summary below. - DestinationUpdate: `nexla_sdk/models/destinations/requests.py:23` - DestinationUpdate.to_dict: `nexla_sdk/models/base.py:42` - DestinationUpdate.to_json: `nexla_sdk/models/base.py:54` -- DocContainer: `nexla_sdk/models/doc_containers/responses.py:6` +- DocContainer: `nexla_sdk/models/doc_containers/responses.py:10` - DocContainer.to_dict: `nexla_sdk/models/base.py:42` - DocContainer.to_json: `nexla_sdk/models/base.py:54` +- DocContainerInput: `nexla_sdk/models/doc_containers/requests.py:10` +- DocContainerInput.to_dict: `nexla_sdk/models/base.py:42` +- DocContainerInput.to_json: `nexla_sdk/models/base.py:54` - DocsRecommendation: `nexla_sdk/models/flows/responses.py:152` - DocsRecommendation.to_dict: `nexla_sdk/models/base.py:42` - DocsRecommendation.to_json: `nexla_sdk/models/base.py:54` @@ -767,13 +1613,19 @@ Each API page embeds per-symbol source links. Summary below. - FlowMetricsMeta: `nexla_sdk/models/flows/responses.py:123` - FlowMetricsMeta.to_dict: `nexla_sdk/models/base.py:42` - FlowMetricsMeta.to_json: `nexla_sdk/models/base.py:54` -- FlowNode: `nexla_sdk/models/common.py:66` +- FlowNode: `nexla_sdk/models/common.py:70` - FlowNode.to_dict: `nexla_sdk/models/base.py:42` - FlowNode.to_json: `nexla_sdk/models/base.py:54` - FlowResponse: `nexla_sdk/models/flows/responses.py:178` - FlowResponse.to_dict: `nexla_sdk/models/base.py:42` - FlowResponse.to_json: `nexla_sdk/models/base.py:54` -- FlowType: `nexla_sdk/models/sources/enums.py:72` +- FlowTrigger: `nexla_sdk/models/flow_triggers/responses.py:10` +- FlowTrigger.to_dict: `nexla_sdk/models/base.py:42` +- FlowTrigger.to_json: `nexla_sdk/models/base.py:54` +- FlowTriggerCreate: `nexla_sdk/models/flow_triggers/requests.py:8` +- FlowTriggerCreate.to_dict: `nexla_sdk/models/base.py:42` +- FlowTriggerCreate.to_json: `nexla_sdk/models/base.py:54` +- FlowType: `nexla_sdk/models/sources/enums.py:108` - GenAiConfig: `nexla_sdk/models/genai/responses.py:7` - GenAiConfig.to_dict: `nexla_sdk/models/base.py:42` - GenAiConfig.to_json: `nexla_sdk/models/base.py:54` @@ -789,8 +1641,8 @@ Each API page embeds per-symbol source links. Summary below. - GenAiOrgSettingPayload: `nexla_sdk/models/genai/requests.py:24` - GenAiOrgSettingPayload.to_dict: `nexla_sdk/models/base.py:42` - GenAiOrgSettingPayload.to_json: `nexla_sdk/models/base.py:54` -- IngestMethod: `nexla_sdk/models/sources/enums.py:62` -- LogEntry: `nexla_sdk/models/common.py:45` +- IngestMethod: `nexla_sdk/models/sources/enums.py:98` +- LogEntry: `nexla_sdk/models/common.py:49` - LogEntry.to_dict: `nexla_sdk/models/base.py:42` - LogEntry.to_json: `nexla_sdk/models/base.py:54` - Lookup: `nexla_sdk/models/lookups/responses.py:10` @@ -849,6 +1701,15 @@ Each API page embeds per-symbol source links. Summary below. - NotificationChannelSettingCreate: `nexla_sdk/models/notifications/requests.py:8` - NotificationChannelSettingCreate.to_dict: `nexla_sdk/models/base.py:42` - NotificationChannelSettingCreate.to_json: `nexla_sdk/models/base.py:54` +- NotificationChannelSettingResource: `nexla_sdk/models/notification_channel_settings/responses.py:7` +- NotificationChannelSettingResource.to_dict: `nexla_sdk/models/base.py:42` +- NotificationChannelSettingResource.to_json: `nexla_sdk/models/base.py:54` +- NotificationChannelSettingResourceCreate: `nexla_sdk/models/notification_channel_settings/requests.py:6` +- NotificationChannelSettingResourceCreate.to_dict: `nexla_sdk/models/base.py:42` +- NotificationChannelSettingResourceCreate.to_json: `nexla_sdk/models/base.py:54` +- NotificationChannelSettingResourceUpdate: `nexla_sdk/models/notification_channel_settings/requests.py:12` +- NotificationChannelSettingResourceUpdate.to_dict: `nexla_sdk/models/base.py:42` +- NotificationChannelSettingResourceUpdate.to_json: `nexla_sdk/models/base.py:54` - NotificationChannelSettingUpdate: `nexla_sdk/models/notifications/requests.py:15` - NotificationChannelSettingUpdate.to_dict: `nexla_sdk/models/base.py:42` - NotificationChannelSettingUpdate.to_json: `nexla_sdk/models/base.py:54` @@ -859,6 +1720,9 @@ Each API page embeds per-symbol source links. Summary below. - NotificationSetting: `nexla_sdk/models/notifications/responses.py:51` - NotificationSetting.to_dict: `nexla_sdk/models/base.py:42` - NotificationSetting.to_json: `nexla_sdk/models/base.py:54` +- NotificationSettingBrief: `nexla_sdk/models/notifications/responses.py:79` +- NotificationSettingBrief.to_dict: `nexla_sdk/models/base.py:42` +- NotificationSettingBrief.to_json: `nexla_sdk/models/base.py:54` - NotificationSettingCreate: `nexla_sdk/models/notifications/requests.py:22` - NotificationSettingCreate.to_dict: `nexla_sdk/models/base.py:42` - NotificationSettingCreate.to_json: `nexla_sdk/models/base.py:54` @@ -868,6 +1732,9 @@ Each API page embeds per-symbol source links. Summary below. - NotificationType: `nexla_sdk/models/notifications/responses.py:28` - NotificationType.to_dict: `nexla_sdk/models/base.py:42` - NotificationType.to_json: `nexla_sdk/models/base.py:54` +- NotificationTypeResource: `nexla_sdk/models/notification_types/responses.py:6` +- NotificationTypeResource.to_dict: `nexla_sdk/models/base.py:42` +- NotificationTypeResource.to_json: `nexla_sdk/models/base.py:54` - OrgAccessorRequest: `nexla_sdk/models/access/requests.py:31` - OrgAccessorRequest.to_dict: `nexla_sdk/models/base.py:42` - OrgAccessorRequest.to_json: `nexla_sdk/models/base.py:54` @@ -899,26 +1766,29 @@ Each API page embeds per-symbol source links. Summary below. - OrgTier: `nexla_sdk/models/organizations/responses.py:10` - OrgTier.to_dict: `nexla_sdk/models/base.py:42` - OrgTier.to_json: `nexla_sdk/models/base.py:54` -- Organization: `nexla_sdk/models/common.py:16` +- OrgTierInfo: `nexla_sdk/models/org_tiers/responses.py:6` +- OrgTierInfo.to_dict: `nexla_sdk/models/base.py:42` +- OrgTierInfo.to_json: `nexla_sdk/models/base.py:54` +- Organization: `nexla_sdk/models/common.py:20` - Organization.to_dict: `nexla_sdk/models/base.py:42` - Organization.to_json: `nexla_sdk/models/base.py:54` - OrganizationUpdate: `nexla_sdk/models/organizations/requests.py:36` - OrganizationUpdate.to_dict: `nexla_sdk/models/base.py:42` - OrganizationUpdate.to_json: `nexla_sdk/models/base.py:54` - OutputType: `nexla_sdk/models/nexsets/enums.py:25` -- Owner: `nexla_sdk/models/common.py:7` +- Owner: `nexla_sdk/models/common.py:11` - Owner.to_dict: `nexla_sdk/models/base.py:42` - Owner.to_json: `nexla_sdk/models/base.py:54` - ProbeSampleRequest: `nexla_sdk/models/credentials/requests.py:39` - ProbeSampleRequest.to_dict: `nexla_sdk/models/base.py:42` - ProbeSampleRequest.to_json: `nexla_sdk/models/base.py:54` -- ProbeSampleResponse: `nexla_sdk/models/credentials/responses.py:65` +- ProbeSampleResponse: `nexla_sdk/models/credentials/responses.py:66` - ProbeSampleResponse.to_dict: `nexla_sdk/models/base.py:42` - ProbeSampleResponse.to_json: `nexla_sdk/models/base.py:54` - ProbeTreeRequest: `nexla_sdk/models/credentials/requests.py:30` - ProbeTreeRequest.to_dict: `nexla_sdk/models/base.py:42` - ProbeTreeRequest.to_json: `nexla_sdk/models/base.py:54` -- ProbeTreeResponse: `nexla_sdk/models/credentials/responses.py:56` +- ProbeTreeResponse: `nexla_sdk/models/credentials/responses.py:57` - ProbeTreeResponse.to_dict: `nexla_sdk/models/base.py:42` - ProbeTreeResponse.to_json: `nexla_sdk/models/base.py:54` - Project: `nexla_sdk/models/projects/responses.py:24` @@ -939,6 +1809,15 @@ Each API page embeds per-symbol source links. Summary below. - ProjectUpdate: `nexla_sdk/models/projects/requests.py:23` - ProjectUpdate.to_dict: `nexla_sdk/models/base.py:42` - ProjectUpdate.to_json: `nexla_sdk/models/base.py:54` +- QuarantineSetting: `nexla_sdk/models/quarantine_settings/responses.py:9` +- QuarantineSetting.to_dict: `nexla_sdk/models/base.py:42` +- QuarantineSetting.to_json: `nexla_sdk/models/base.py:54` +- QuarantineSettingCreate: `nexla_sdk/models/quarantine_settings/requests.py:6` +- QuarantineSettingCreate.to_dict: `nexla_sdk/models/base.py:42` +- QuarantineSettingCreate.to_json: `nexla_sdk/models/base.py:54` +- QuarantineSettingUpdate: `nexla_sdk/models/quarantine_settings/requests.py:13` +- QuarantineSettingUpdate.to_dict: `nexla_sdk/models/base.py:42` +- QuarantineSettingUpdate.to_json: `nexla_sdk/models/base.py:54` - ResourceFlowLogsResponse: `nexla_sdk/models/metrics/responses.py:68` - ResourceFlowLogsResponse.to_dict: `nexla_sdk/models/base.py:42` - ResourceFlowLogsResponse.to_json: `nexla_sdk/models/base.py:54` @@ -951,9 +1830,18 @@ Each API page embeds per-symbol source links. Summary below. - ResourceMetricsByRun: `nexla_sdk/models/metrics/responses.py:39` - ResourceMetricsByRun.to_dict: `nexla_sdk/models/base.py:42` - ResourceMetricsByRun.to_json: `nexla_sdk/models/base.py:54` +- ResourceParameter: `nexla_sdk/models/resource_parameters/responses.py:10` +- ResourceParameter.to_dict: `nexla_sdk/models/base.py:42` +- ResourceParameter.to_json: `nexla_sdk/models/base.py:54` +- ResourceParameterCreate: `nexla_sdk/models/resource_parameters/requests.py:6` +- ResourceParameterCreate.to_dict: `nexla_sdk/models/base.py:42` +- ResourceParameterCreate.to_json: `nexla_sdk/models/base.py:54` +- ResourceParameterUpdate: `nexla_sdk/models/resource_parameters/requests.py:19` +- ResourceParameterUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ResourceParameterUpdate.to_json: `nexla_sdk/models/base.py:54` - ResourceStatus: `nexla_sdk/models/enums.py:13` - ResourceType: `nexla_sdk/models/enums.py:25` -- RunInfo: `nexla_sdk/models/sources/responses.py:24` +- RunInfo: `nexla_sdk/models/sources/responses.py:25` - RunInfo.to_dict: `nexla_sdk/models/base.py:42` - RunInfo.to_json: `nexla_sdk/models/base.py:54` - Runtime: `nexla_sdk/models/runtimes/responses.py:7` @@ -968,7 +1856,16 @@ Each API page embeds per-symbol source links. Summary below. - SelfSignupRequest: `nexla_sdk/models/self_signup/responses.py:7` - SelfSignupRequest.to_dict: `nexla_sdk/models/base.py:42` - SelfSignupRequest.to_json: `nexla_sdk/models/base.py:54` -- Source: `nexla_sdk/models/sources/responses.py:31` +- ServiceKey: `nexla_sdk/models/service_keys/responses.py:9` +- ServiceKey.to_dict: `nexla_sdk/models/base.py:42` +- ServiceKey.to_json: `nexla_sdk/models/base.py:54` +- ServiceKeyCreate: `nexla_sdk/models/service_keys/requests.py:8` +- ServiceKeyCreate.to_dict: `nexla_sdk/models/base.py:42` +- ServiceKeyCreate.to_json: `nexla_sdk/models/base.py:54` +- ServiceKeyUpdate: `nexla_sdk/models/service_keys/requests.py:16` +- ServiceKeyUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ServiceKeyUpdate.to_json: `nexla_sdk/models/base.py:54` +- Source: `nexla_sdk/models/sources/responses.py:32` - Source.to_dict: `nexla_sdk/models/base.py:42` - Source.to_json: `nexla_sdk/models/base.py:54` - SourceCopyOptions: `nexla_sdk/models/sources/requests.py:34` @@ -1028,17 +1925,68 @@ Each API page embeds per-symbol source links. Summary below. - UserCreate: `nexla_sdk/models/users/requests.py:7` - UserCreate.to_dict: `nexla_sdk/models/base.py:42` - UserCreate.to_json: `nexla_sdk/models/base.py:54` +- UserCredit: `nexla_sdk/models/users/credits.py:7` +- UserCredit.to_dict: `nexla_sdk/models/base.py:42` +- UserCredit.to_json: `nexla_sdk/models/base.py:54` +- UserCreditCreate: `nexla_sdk/models/users/credits.py:24` +- UserCreditCreate.to_dict: `nexla_sdk/models/base.py:42` +- UserCreditCreate.to_json: `nexla_sdk/models/base.py:54` - UserExpanded: `nexla_sdk/models/users/responses.py:56` - UserExpanded.to_dict: `nexla_sdk/models/base.py:42` - UserExpanded.to_json: `nexla_sdk/models/base.py:54` +- UserSetting: `nexla_sdk/models/user_settings/responses.py:8` +- UserSetting.to_dict: `nexla_sdk/models/base.py:42` +- UserSetting.to_json: `nexla_sdk/models/base.py:54` +- UserSettingCreate: `nexla_sdk/models/user_settings/requests.py:6` +- UserSettingCreate.to_dict: `nexla_sdk/models/base.py:42` +- UserSettingCreate.to_json: `nexla_sdk/models/base.py:54` +- UserSettingUpdate: `nexla_sdk/models/user_settings/requests.py:14` +- UserSettingUpdate.to_dict: `nexla_sdk/models/base.py:42` +- UserSettingUpdate.to_json: `nexla_sdk/models/base.py:54` - UserSettings: `nexla_sdk/models/users/responses.py:62` - UserSettings.to_dict: `nexla_sdk/models/base.py:42` - UserSettings.to_json: `nexla_sdk/models/base.py:54` - UserStatus: `nexla_sdk/models/enums.py:76` - UserTier: `nexla_sdk/models/enums.py:67` +- UserTierInfo: `nexla_sdk/models/user_tiers/responses.py:6` +- UserTierInfo.to_dict: `nexla_sdk/models/base.py:42` +- UserTierInfo.to_json: `nexla_sdk/models/base.py:54` - UserUpdate: `nexla_sdk/models/users/requests.py:21` - UserUpdate.to_dict: `nexla_sdk/models/base.py:42` - UserUpdate.to_json: `nexla_sdk/models/base.py:54` +- Validator: `nexla_sdk/models/validators/responses.py:22` +- Validator.to_dict: `nexla_sdk/models/base.py:42` +- Validator.to_json: `nexla_sdk/models/base.py:54` +- ValidatorCopyOptions: `nexla_sdk/models/validators/requests.py:52` +- ValidatorCopyOptions.to_dict: `nexla_sdk/models/base.py:42` +- ValidatorCopyOptions.to_json: `nexla_sdk/models/base.py:54` +- ValidatorCreate: `nexla_sdk/models/validators/requests.py:8` +- ValidatorCreate.to_dict: `nexla_sdk/models/base.py:42` +- ValidatorCreate.to_json: `nexla_sdk/models/base.py:54` +- ValidatorUpdate: `nexla_sdk/models/validators/requests.py:32` +- ValidatorUpdate.to_dict: `nexla_sdk/models/base.py:42` +- ValidatorUpdate.to_json: `nexla_sdk/models/base.py:54` +- Vendor: `nexla_sdk/models/vendors/responses.py:19` +- Vendor.to_dict: `nexla_sdk/models/base.py:42` +- Vendor.to_json: `nexla_sdk/models/base.py:54` +- VendorCreate: `nexla_sdk/models/vendors/requests.py:8` +- VendorCreate.to_dict: `nexla_sdk/models/base.py:42` +- VendorCreate.to_json: `nexla_sdk/models/base.py:54` +- VendorEndpoint: `nexla_sdk/models/vendor_endpoints/responses.py:8` +- VendorEndpoint.to_dict: `nexla_sdk/models/base.py:42` +- VendorEndpoint.to_json: `nexla_sdk/models/base.py:54` +- VendorEndpointCreate: `nexla_sdk/models/vendor_endpoints/requests.py:6` +- VendorEndpointCreate.to_dict: `nexla_sdk/models/base.py:42` +- VendorEndpointCreate.to_json: `nexla_sdk/models/base.py:54` +- VendorEndpointUpdate: `nexla_sdk/models/vendor_endpoints/requests.py:13` +- VendorEndpointUpdate.to_dict: `nexla_sdk/models/base.py:42` +- VendorEndpointUpdate.to_json: `nexla_sdk/models/base.py:54` +- VendorRef: `nexla_sdk/models/vendors/responses.py:11` +- VendorRef.to_dict: `nexla_sdk/models/base.py:42` +- VendorRef.to_json: `nexla_sdk/models/base.py:54` +- VendorUpdate: `nexla_sdk/models/vendors/requests.py:20` +- VendorUpdate.to_dict: `nexla_sdk/models/base.py:42` +- VendorUpdate.to_json: `nexla_sdk/models/base.py:54` - VerifiedStatus: `nexla_sdk/models/credentials/enums.py:61` - WebhookResponse: `nexla_sdk/models/webhooks/responses.py:8` - WebhookResponse.to_dict: `nexla_sdk/models/base.py:42` @@ -1046,6 +1994,7 @@ Each API page embeds per-symbol source links. Summary below. - WebhookSendOptions: `nexla_sdk/models/webhooks/requests.py:8` - WebhookSendOptions.to_dict: `nexla_sdk/models/base.py:42` - WebhookSendOptions.to_json: `nexla_sdk/models/base.py:54` +- FlexibleEnum(): `nexla_sdk/models/flexible_enums.py:49` ### nexla_sdk.models.access - AccessorType: `nexla_sdk/models/access/enums.py:4` - AccessorsRequest: `nexla_sdk/models/access/requests.py:49` @@ -1066,6 +2015,17 @@ Each API page embeds per-symbol source links. Summary below. - OrgAccessorResponse: `nexla_sdk/models/access/responses.py:36` - TeamAccessorResponse: `nexla_sdk/models/access/responses.py:25` - UserAccessorResponse: `nexla_sdk/models/access/responses.py:11` +### nexla_sdk.models.api_keys +- ApiKey: `nexla_sdk/models/api_keys/responses.py:9` +- ApiKeyCreate: `nexla_sdk/models/api_keys/requests.py:6` +- ApiKeyUpdate: `nexla_sdk/models/api_keys/requests.py:13` +- ApiKeysIndex: `nexla_sdk/models/api_keys/responses.py:37` +### nexla_sdk.models.api_keys.requests +- ApiKeyCreate: `nexla_sdk/models/api_keys/requests.py:6` +- ApiKeyUpdate: `nexla_sdk/models/api_keys/requests.py:13` +### nexla_sdk.models.api_keys.responses +- ApiKey: `nexla_sdk/models/api_keys/responses.py:9` +- ApiKeysIndex: `nexla_sdk/models/api_keys/responses.py:37` ### nexla_sdk.models.approval_requests - ApprovalDecision: `nexla_sdk/models/approval_requests/requests.py:6` - ApprovalRequest: `nexla_sdk/models/approval_requests/responses.py:7` @@ -1093,10 +2053,71 @@ Each API page embeds per-symbol source links. Summary below. - AttributeTransformUpdate: `nexla_sdk/models/attribute_transforms/requests.py:21` ### nexla_sdk.models.attribute_transforms.responses - AttributeTransform: `nexla_sdk/models/attribute_transforms/responses.py:7` +### nexla_sdk.models.auth_parameters +- AuthParameter: `nexla_sdk/models/auth_parameters/responses.py:13` +- AuthParameterCreate: `nexla_sdk/models/auth_parameters/requests.py:6` +- AuthParameterUpdate: `nexla_sdk/models/auth_parameters/requests.py:20` +### nexla_sdk.models.auth_parameters.requests +- AuthParameterCreate: `nexla_sdk/models/auth_parameters/requests.py:6` +- AuthParameterUpdate: `nexla_sdk/models/auth_parameters/requests.py:20` +### nexla_sdk.models.auth_parameters.responses +- AuthParameter: `nexla_sdk/models/auth_parameters/responses.py:13` +### nexla_sdk.models.auth_templates +- AuthParameter: `nexla_sdk/models/auth_templates/responses.py:12` +- AuthParameterCreate: `nexla_sdk/models/auth_templates/requests.py:8` +- AuthTemplate: `nexla_sdk/models/auth_templates/responses.py:33` +- AuthTemplateCreate: `nexla_sdk/models/auth_templates/requests.py:20` +- AuthTemplateParameter: `nexla_sdk/models/auth_templates/responses.py:12` +- AuthTemplateUpdate: `nexla_sdk/models/auth_templates/requests.py:31` +### nexla_sdk.models.auth_templates.requests +- AuthParameterCreate: `nexla_sdk/models/auth_templates/requests.py:8` +- AuthTemplateCreate: `nexla_sdk/models/auth_templates/requests.py:20` +- AuthTemplateUpdate: `nexla_sdk/models/auth_templates/requests.py:31` +### nexla_sdk.models.auth_templates.responses +- AuthParameter: `nexla_sdk/models/auth_templates/responses.py:12` +- AuthTemplate: `nexla_sdk/models/auth_templates/responses.py:33` +- AuthTemplateParameter: `nexla_sdk/models/auth_templates/responses.py:12` ### nexla_sdk.models.base - BaseModel: `nexla_sdk/models/base.py:10` - BaseModel.to_dict: `nexla_sdk/models/base.py:42` - BaseModel.to_json: `nexla_sdk/models/base.py:54` +### nexla_sdk.models.catalog_configs +- CatalogConfig: `nexla_sdk/models/catalog_configs/responses.py:9` +- CatalogConfigCreate: `nexla_sdk/models/catalog_configs/requests.py:6` +- CatalogConfigUpdate: `nexla_sdk/models/catalog_configs/requests.py:15` +### nexla_sdk.models.catalog_configs.requests +- CatalogConfigCreate: `nexla_sdk/models/catalog_configs/requests.py:6` +- CatalogConfigUpdate: `nexla_sdk/models/catalog_configs/requests.py:15` +### nexla_sdk.models.catalog_configs.responses +- CatalogConfig: `nexla_sdk/models/catalog_configs/responses.py:9` +### nexla_sdk.models.catalog_refs +- CatalogRef: `nexla_sdk/models/catalog_refs/responses.py:8` +- CatalogRefCreate: `nexla_sdk/models/catalog_refs/requests.py:6` +- CatalogRefUpdate: `nexla_sdk/models/catalog_refs/requests.py:13` +### nexla_sdk.models.catalog_refs.requests +- CatalogRefCreate: `nexla_sdk/models/catalog_refs/requests.py:6` +- CatalogRefUpdate: `nexla_sdk/models/catalog_refs/requests.py:13` +### nexla_sdk.models.catalog_refs.responses +- CatalogRef: `nexla_sdk/models/catalog_refs/responses.py:8` +### nexla_sdk.models.clusters +- Cluster: `nexla_sdk/models/clusters/responses.py:24` +- ClusterCreate: `nexla_sdk/models/clusters/requests.py:19` +- ClusterEndpoint: `nexla_sdk/models/clusters/responses.py:47` +- ClusterEndpointCreate: `nexla_sdk/models/clusters/requests.py:43` +- ClusterEndpointItem: `nexla_sdk/models/clusters/requests.py:8` +- ClusterEndpointRef: `nexla_sdk/models/clusters/responses.py:12` +- ClusterEndpointUpdate: `nexla_sdk/models/clusters/requests.py:55` +- ClusterUpdate: `nexla_sdk/models/clusters/requests.py:32` +### nexla_sdk.models.clusters.requests +- ClusterCreate: `nexla_sdk/models/clusters/requests.py:19` +- ClusterEndpointCreate: `nexla_sdk/models/clusters/requests.py:43` +- ClusterEndpointItem: `nexla_sdk/models/clusters/requests.py:8` +- ClusterEndpointUpdate: `nexla_sdk/models/clusters/requests.py:55` +- ClusterUpdate: `nexla_sdk/models/clusters/requests.py:32` +### nexla_sdk.models.clusters.responses +- Cluster: `nexla_sdk/models/clusters/responses.py:24` +- ClusterEndpoint: `nexla_sdk/models/clusters/responses.py:47` +- ClusterEndpointRef: `nexla_sdk/models/clusters/responses.py:12` ### nexla_sdk.models.code_containers - CodeContainer: `nexla_sdk/models/code_containers/responses.py:12` - CodeContainerCreate: `nexla_sdk/models/code_containers/requests.py:8` @@ -1108,20 +2129,23 @@ Each API page embeds per-symbol source links. Summary below. - CodeContainer: `nexla_sdk/models/code_containers/responses.py:12` - CodeOperation: `nexla_sdk/models/code_containers/responses.py:7` ### nexla_sdk.models.common -- Connector: `nexla_sdk/models/common.py:34` -- FlowNode: `nexla_sdk/models/common.py:66` -- LogEntry: `nexla_sdk/models/common.py:45` -- Organization: `nexla_sdk/models/common.py:16` -- Owner: `nexla_sdk/models/common.py:7` +- Connector: `nexla_sdk/models/common.py:38` +- FlowNode: `nexla_sdk/models/common.py:70` +- LogEntry: `nexla_sdk/models/common.py:49` +- Organization: `nexla_sdk/models/common.py:20` +- Owner: `nexla_sdk/models/common.py:11` +### nexla_sdk.models.connectors +- ConnectionType: `nexla_sdk/models/connectors/enums.py:93` +- ConnectorType: `nexla_sdk/models/connectors/enums.py:6` +### nexla_sdk.models.connectors.enums +- ConnectionType: `nexla_sdk/models/connectors/enums.py:93` +- ConnectorType: `nexla_sdk/models/connectors/enums.py:6` +### nexla_sdk.models.connectors.requests +- ConnectorUpdate: `nexla_sdk/models/connectors/requests.py:8` +### nexla_sdk.models.connectors.responses +- Connector: `nexla_sdk/models/connectors/responses.py:13` ### nexla_sdk.models.credentials -- Credential: `nexla_sdk/models/credentials/responses.py:10` -- CredentialCreate: `nexla_sdk/models/credentials/requests.py:6` - CredentialType: `nexla_sdk/models/credentials/enums.py:4` -- CredentialUpdate: `nexla_sdk/models/credentials/requests.py:22` -- ProbeSampleRequest: `nexla_sdk/models/credentials/requests.py:39` -- ProbeSampleResponse: `nexla_sdk/models/credentials/responses.py:65` -- ProbeTreeRequest: `nexla_sdk/models/credentials/requests.py:30` -- ProbeTreeResponse: `nexla_sdk/models/credentials/responses.py:56` - VerifiedStatus: `nexla_sdk/models/credentials/enums.py:61` ### nexla_sdk.models.credentials.enums - CredentialType: `nexla_sdk/models/credentials/enums.py:4` @@ -1132,23 +2156,46 @@ Each API page embeds per-symbol source links. Summary below. - ProbeSampleRequest: `nexla_sdk/models/credentials/requests.py:39` - ProbeTreeRequest: `nexla_sdk/models/credentials/requests.py:30` ### nexla_sdk.models.credentials.responses -- Credential: `nexla_sdk/models/credentials/responses.py:10` -- ProbeSampleResponse: `nexla_sdk/models/credentials/responses.py:65` -- ProbeTreeResponse: `nexla_sdk/models/credentials/responses.py:56` +- Credential: `nexla_sdk/models/credentials/responses.py:11` +- ProbeSampleResponse: `nexla_sdk/models/credentials/responses.py:66` +- ProbeTreeResponse: `nexla_sdk/models/credentials/responses.py:57` +### nexla_sdk.models.custom_data_flows +- CustomDataFlow: `nexla_sdk/models/custom_data_flows/responses.py:10` +- CustomDataFlowCreate: `nexla_sdk/models/custom_data_flows/requests.py:6` +- CustomDataFlowUpdate: `nexla_sdk/models/custom_data_flows/requests.py:17` +### nexla_sdk.models.custom_data_flows.requests +- CustomDataFlowCreate: `nexla_sdk/models/custom_data_flows/requests.py:6` +- CustomDataFlowUpdate: `nexla_sdk/models/custom_data_flows/requests.py:17` +### nexla_sdk.models.custom_data_flows.responses +- CustomDataFlow: `nexla_sdk/models/custom_data_flows/responses.py:10` +### nexla_sdk.models.dashboard_transforms +- DashboardTransform: `nexla_sdk/models/dashboard_transforms/responses.py:8` +- DashboardTransformCreate: `nexla_sdk/models/dashboard_transforms/requests.py:6` +- DashboardTransformUpdate: `nexla_sdk/models/dashboard_transforms/requests.py:10` +### nexla_sdk.models.dashboard_transforms.requests +- DashboardTransformCreate: `nexla_sdk/models/dashboard_transforms/requests.py:6` +- DashboardTransformUpdate: `nexla_sdk/models/dashboard_transforms/requests.py:10` +### nexla_sdk.models.dashboard_transforms.responses +- DashboardTransform: `nexla_sdk/models/dashboard_transforms/responses.py:8` +### nexla_sdk.models.data_credentials_groups +- DataCredentialsGroup: `nexla_sdk/models/data_credentials_groups/responses.py:8` +- DataCredentialsGroupCreate: `nexla_sdk/models/data_credentials_groups/requests.py:6` +- DataCredentialsGroupRemoveCredentials: `nexla_sdk/models/data_credentials_groups/requests.py:20` +- DataCredentialsGroupUpdate: `nexla_sdk/models/data_credentials_groups/requests.py:13` +### nexla_sdk.models.data_credentials_groups.requests +- DataCredentialsGroupCreate: `nexla_sdk/models/data_credentials_groups/requests.py:6` +- DataCredentialsGroupRemoveCredentials: `nexla_sdk/models/data_credentials_groups/requests.py:20` +- DataCredentialsGroupUpdate: `nexla_sdk/models/data_credentials_groups/requests.py:13` +### nexla_sdk.models.data_credentials_groups.responses +- DataCredentialsGroup: `nexla_sdk/models/data_credentials_groups/responses.py:8` ### nexla_sdk.models.data_schemas - DataSchema: `nexla_sdk/models/data_schemas/responses.py:6` ### nexla_sdk.models.data_schemas.responses - DataSchema: `nexla_sdk/models/data_schemas/responses.py:6` ### nexla_sdk.models.destinations -- DataMapInfo: `nexla_sdk/models/destinations/responses.py:25` -- DataSetInfo: `nexla_sdk/models/destinations/responses.py:12` -- Destination: `nexla_sdk/models/destinations/responses.py:38` -- DestinationCopyOptions: `nexla_sdk/models/destinations/requests.py:33` -- DestinationCreate: `nexla_sdk/models/destinations/requests.py:6` - DestinationFormat: `nexla_sdk/models/destinations/enums.py:89` - DestinationStatus: `nexla_sdk/models/destinations/enums.py:4` - DestinationType: `nexla_sdk/models/destinations/enums.py:14` -- DestinationUpdate: `nexla_sdk/models/destinations/requests.py:23` ### nexla_sdk.models.destinations.enums - DestinationFormat: `nexla_sdk/models/destinations/enums.py:89` - DestinationStatus: `nexla_sdk/models/destinations/enums.py:4` @@ -1158,13 +2205,16 @@ Each API page embeds per-symbol source links. Summary below. - DestinationCreate: `nexla_sdk/models/destinations/requests.py:6` - DestinationUpdate: `nexla_sdk/models/destinations/requests.py:23` ### nexla_sdk.models.destinations.responses -- DataMapInfo: `nexla_sdk/models/destinations/responses.py:25` -- DataSetInfo: `nexla_sdk/models/destinations/responses.py:12` -- Destination: `nexla_sdk/models/destinations/responses.py:38` +- DataMapInfo: `nexla_sdk/models/destinations/responses.py:28` +- DataSetInfo: `nexla_sdk/models/destinations/responses.py:15` +- Destination: `nexla_sdk/models/destinations/responses.py:41` ### nexla_sdk.models.doc_containers -- DocContainer: `nexla_sdk/models/doc_containers/responses.py:6` +- DocContainer: `nexla_sdk/models/doc_containers/responses.py:10` +- DocContainerInput: `nexla_sdk/models/doc_containers/requests.py:10` +### nexla_sdk.models.doc_containers.requests +- DocContainerInput: `nexla_sdk/models/doc_containers/requests.py:10` ### nexla_sdk.models.doc_containers.responses -- DocContainer: `nexla_sdk/models/doc_containers/responses.py:6` +- DocContainer: `nexla_sdk/models/doc_containers/responses.py:10` ### nexla_sdk.models.enums - AccessRole: `nexla_sdk/models/enums.py:4` - ConnectorCategory: `nexla_sdk/models/enums.py:93` @@ -1175,6 +2225,16 @@ Each API page embeds per-symbol source links. Summary below. - ResourceType: `nexla_sdk/models/enums.py:25` - UserStatus: `nexla_sdk/models/enums.py:76` - UserTier: `nexla_sdk/models/enums.py:67` +### nexla_sdk.models.flexible_enums +- FlexibleEnum(): `nexla_sdk/models/flexible_enums.py:49` +- flexible_enum_validator(): `nexla_sdk/models/flexible_enums.py:22` +### nexla_sdk.models.flow_triggers +- FlowTrigger: `nexla_sdk/models/flow_triggers/responses.py:10` +- FlowTriggerCreate: `nexla_sdk/models/flow_triggers/requests.py:8` +### nexla_sdk.models.flow_triggers.requests +- FlowTriggerCreate: `nexla_sdk/models/flow_triggers/requests.py:8` +### nexla_sdk.models.flow_triggers.responses +- FlowTrigger: `nexla_sdk/models/flow_triggers/responses.py:10` ### nexla_sdk.models.flows - DocsRecommendation: `nexla_sdk/models/flows/responses.py:152` - FlowCopyOptions: `nexla_sdk/models/flows/requests.py:6` @@ -1289,6 +2349,30 @@ Each API page embeds per-symbol source links. Summary below. - DataSinkSimplified: `nexla_sdk/models/nexsets/responses.py:12` - Nexset: `nexla_sdk/models/nexsets/responses.py:23` - NexsetSample: `nexla_sdk/models/nexsets/responses.py:47` +### nexla_sdk.models.notification_channel_settings +- NotificationChannelSetting: `nexla_sdk/models/notification_channel_settings/responses.py:7` +- NotificationChannelSettingCreate: `nexla_sdk/models/notification_channel_settings/requests.py:6` +- NotificationChannelSettingUpdate: `nexla_sdk/models/notification_channel_settings/requests.py:12` +### nexla_sdk.models.notification_channel_settings.requests +- NotificationChannelSettingCreate: `nexla_sdk/models/notification_channel_settings/requests.py:6` +- NotificationChannelSettingUpdate: `nexla_sdk/models/notification_channel_settings/requests.py:12` +### nexla_sdk.models.notification_channel_settings.responses +- NotificationChannelSetting: `nexla_sdk/models/notification_channel_settings/responses.py:7` +### nexla_sdk.models.notification_settings +- NotificationSetting: `nexla_sdk/models/notification_settings/responses.py:9` +- NotificationSettingBrief: `nexla_sdk/models/notification_settings/responses.py:26` +- NotificationSettingCreate: `nexla_sdk/models/notification_settings/requests.py:10` +- NotificationSettingUpdate: `nexla_sdk/models/notification_settings/requests.py:27` +### nexla_sdk.models.notification_settings.requests +- NotificationSettingCreate: `nexla_sdk/models/notification_settings/requests.py:10` +- NotificationSettingUpdate: `nexla_sdk/models/notification_settings/requests.py:27` +### nexla_sdk.models.notification_settings.responses +- NotificationSetting: `nexla_sdk/models/notification_settings/responses.py:9` +- NotificationSettingBrief: `nexla_sdk/models/notification_settings/responses.py:26` +### nexla_sdk.models.notification_types +- NotificationType: `nexla_sdk/models/notification_types/responses.py:6` +### nexla_sdk.models.notification_types.responses +- NotificationType: `nexla_sdk/models/notification_types/responses.py:6` ### nexla_sdk.models.notifications - Notification: `nexla_sdk/models/notifications/responses.py:10` - NotificationChannelSetting: `nexla_sdk/models/notifications/responses.py:41` @@ -1296,6 +2380,7 @@ Each API page embeds per-symbol source links. Summary below. - NotificationChannelSettingUpdate: `nexla_sdk/models/notifications/requests.py:15` - NotificationCount: `nexla_sdk/models/notifications/responses.py:73` - NotificationSetting: `nexla_sdk/models/notifications/responses.py:51` +- NotificationSettingBrief: `nexla_sdk/models/notifications/responses.py:79` - NotificationSettingCreate: `nexla_sdk/models/notifications/requests.py:22` - NotificationSettingUpdate: `nexla_sdk/models/notifications/requests.py:34` - NotificationType: `nexla_sdk/models/notifications/responses.py:28` @@ -1309,6 +2394,7 @@ Each API page embeds per-symbol source links. Summary below. - NotificationChannelSetting: `nexla_sdk/models/notifications/responses.py:41` - NotificationCount: `nexla_sdk/models/notifications/responses.py:73` - NotificationSetting: `nexla_sdk/models/notifications/responses.py:51` +- NotificationSettingBrief: `nexla_sdk/models/notifications/responses.py:79` - NotificationType: `nexla_sdk/models/notifications/responses.py:28` ### nexla_sdk.models.org_auth_configs - AuthConfig: `nexla_sdk/models/org_auth_configs/responses.py:7` @@ -1317,6 +2403,10 @@ Each API page embeds per-symbol source links. Summary below. - AuthConfigPayload: `nexla_sdk/models/org_auth_configs/requests.py:6` ### nexla_sdk.models.org_auth_configs.responses - AuthConfig: `nexla_sdk/models/org_auth_configs/responses.py:7` +### nexla_sdk.models.org_tiers +- OrgTier: `nexla_sdk/models/org_tiers/responses.py:6` +### nexla_sdk.models.org_tiers.responses +- OrgTier: `nexla_sdk/models/org_tiers/responses.py:6` ### nexla_sdk.models.organizations - AccountSummary: `nexla_sdk/models/organizations/responses.py:65` - CustodianUser: `nexla_sdk/models/organizations/responses.py:74` @@ -1367,6 +2457,24 @@ Each API page embeds per-symbol source links. Summary below. ### nexla_sdk.models.projects.responses - Project: `nexla_sdk/models/projects/responses.py:24` - ProjectDataFlow: `nexla_sdk/models/projects/responses.py:10` +### nexla_sdk.models.quarantine_settings +- QuarantineSetting: `nexla_sdk/models/quarantine_settings/responses.py:9` +- QuarantineSettingCreate: `nexla_sdk/models/quarantine_settings/requests.py:6` +- QuarantineSettingUpdate: `nexla_sdk/models/quarantine_settings/requests.py:13` +### nexla_sdk.models.quarantine_settings.requests +- QuarantineSettingCreate: `nexla_sdk/models/quarantine_settings/requests.py:6` +- QuarantineSettingUpdate: `nexla_sdk/models/quarantine_settings/requests.py:13` +### nexla_sdk.models.quarantine_settings.responses +- QuarantineSetting: `nexla_sdk/models/quarantine_settings/responses.py:9` +### nexla_sdk.models.resource_parameters +- ResourceParameter: `nexla_sdk/models/resource_parameters/responses.py:10` +- ResourceParameterCreate: `nexla_sdk/models/resource_parameters/requests.py:6` +- ResourceParameterUpdate: `nexla_sdk/models/resource_parameters/requests.py:19` +### nexla_sdk.models.resource_parameters.requests +- ResourceParameterCreate: `nexla_sdk/models/resource_parameters/requests.py:6` +- ResourceParameterUpdate: `nexla_sdk/models/resource_parameters/requests.py:19` +### nexla_sdk.models.resource_parameters.responses +- ResourceParameter: `nexla_sdk/models/resource_parameters/responses.py:10` ### nexla_sdk.models.runtimes - Runtime: `nexla_sdk/models/runtimes/responses.py:7` - RuntimeCreate: `nexla_sdk/models/runtimes/requests.py:6` @@ -1382,20 +2490,23 @@ Each API page embeds per-symbol source links. Summary below. ### nexla_sdk.models.self_signup.responses - BlockedDomain: `nexla_sdk/models/self_signup/responses.py:17` - SelfSignupRequest: `nexla_sdk/models/self_signup/responses.py:7` +### nexla_sdk.models.service_keys +- ServiceKey: `nexla_sdk/models/service_keys/responses.py:9` +- ServiceKeyCreate: `nexla_sdk/models/service_keys/requests.py:8` +- ServiceKeyUpdate: `nexla_sdk/models/service_keys/requests.py:16` +### nexla_sdk.models.service_keys.requests +- ServiceKeyCreate: `nexla_sdk/models/service_keys/requests.py:8` +- ServiceKeyUpdate: `nexla_sdk/models/service_keys/requests.py:16` +### nexla_sdk.models.service_keys.responses +- ServiceKey: `nexla_sdk/models/service_keys/responses.py:9` ### nexla_sdk.models.sources -- DataSetBrief: `nexla_sdk/models/sources/responses.py:11` -- FlowType: `nexla_sdk/models/sources/enums.py:72` -- IngestMethod: `nexla_sdk/models/sources/enums.py:62` -- RunInfo: `nexla_sdk/models/sources/responses.py:24` -- Source: `nexla_sdk/models/sources/responses.py:31` -- SourceCopyOptions: `nexla_sdk/models/sources/requests.py:34` -- SourceCreate: `nexla_sdk/models/sources/requests.py:8` +- FlowType: `nexla_sdk/models/sources/enums.py:108` +- IngestMethod: `nexla_sdk/models/sources/enums.py:98` - SourceStatus: `nexla_sdk/models/sources/enums.py:6` - SourceType: `nexla_sdk/models/sources/enums.py:16` -- SourceUpdate: `nexla_sdk/models/sources/requests.py:25` ### nexla_sdk.models.sources.enums -- FlowType: `nexla_sdk/models/sources/enums.py:72` -- IngestMethod: `nexla_sdk/models/sources/enums.py:62` +- FlowType: `nexla_sdk/models/sources/enums.py:108` +- IngestMethod: `nexla_sdk/models/sources/enums.py:98` - SourceStatus: `nexla_sdk/models/sources/enums.py:6` - SourceType: `nexla_sdk/models/sources/enums.py:16` ### nexla_sdk.models.sources.requests @@ -1403,9 +2514,9 @@ Each API page embeds per-symbol source links. Summary below. - SourceCreate: `nexla_sdk/models/sources/requests.py:8` - SourceUpdate: `nexla_sdk/models/sources/requests.py:25` ### nexla_sdk.models.sources.responses -- DataSetBrief: `nexla_sdk/models/sources/responses.py:11` -- RunInfo: `nexla_sdk/models/sources/responses.py:24` -- Source: `nexla_sdk/models/sources/responses.py:31` +- DataSetBrief: `nexla_sdk/models/sources/responses.py:12` +- RunInfo: `nexla_sdk/models/sources/responses.py:25` +- Source: `nexla_sdk/models/sources/responses.py:32` ### nexla_sdk.models.teams - Team: `nexla_sdk/models/teams/responses.py:18` - TeamCreate: `nexla_sdk/models/teams/requests.py:17` @@ -1432,15 +2543,33 @@ Each API page embeds per-symbol source links. Summary below. ### nexla_sdk.models.transforms.responses - Transform: `nexla_sdk/models/transforms/responses.py:12` - TransformCodeOp: `nexla_sdk/models/transforms/responses.py:7` +### nexla_sdk.models.user_settings +- UserSetting: `nexla_sdk/models/user_settings/responses.py:8` +- UserSettingCreate: `nexla_sdk/models/user_settings/requests.py:6` +- UserSettingUpdate: `nexla_sdk/models/user_settings/requests.py:14` +### nexla_sdk.models.user_settings.requests +- UserSettingCreate: `nexla_sdk/models/user_settings/requests.py:6` +- UserSettingUpdate: `nexla_sdk/models/user_settings/requests.py:14` +### nexla_sdk.models.user_settings.responses +- UserSetting: `nexla_sdk/models/user_settings/responses.py:8` +### nexla_sdk.models.user_tiers +- UserTier: `nexla_sdk/models/user_tiers/responses.py:6` +### nexla_sdk.models.user_tiers.responses +- UserTier: `nexla_sdk/models/user_tiers/responses.py:6` ### nexla_sdk.models.users - AccountSummary: `nexla_sdk/models/users/responses.py:47` - DefaultOrg: `nexla_sdk/models/users/responses.py:9` - OrgMembership: `nexla_sdk/models/users/responses.py:16` - User: `nexla_sdk/models/users/responses.py:26` - UserCreate: `nexla_sdk/models/users/requests.py:7` +- UserCredit: `nexla_sdk/models/users/credits.py:7` +- UserCreditCreate: `nexla_sdk/models/users/credits.py:24` - UserExpanded: `nexla_sdk/models/users/responses.py:56` - UserSettings: `nexla_sdk/models/users/responses.py:62` - UserUpdate: `nexla_sdk/models/users/requests.py:21` +### nexla_sdk.models.users.credits +- UserCredit: `nexla_sdk/models/users/credits.py:7` +- UserCreditCreate: `nexla_sdk/models/users/credits.py:24` ### nexla_sdk.models.users.requests - UserCreate: `nexla_sdk/models/users/requests.py:7` - UserUpdate: `nexla_sdk/models/users/requests.py:21` @@ -1451,6 +2580,38 @@ Each API page embeds per-symbol source links. Summary below. - User: `nexla_sdk/models/users/responses.py:26` - UserExpanded: `nexla_sdk/models/users/responses.py:56` - UserSettings: `nexla_sdk/models/users/responses.py:62` +### nexla_sdk.models.validators +- Validator: `nexla_sdk/models/validators/responses.py:22` +- ValidatorCopyOptions: `nexla_sdk/models/validators/requests.py:52` +- ValidatorCreate: `nexla_sdk/models/validators/requests.py:8` +- ValidatorUpdate: `nexla_sdk/models/validators/requests.py:32` +### nexla_sdk.models.validators.requests +- ValidatorCopyOptions: `nexla_sdk/models/validators/requests.py:52` +- ValidatorCreate: `nexla_sdk/models/validators/requests.py:8` +- ValidatorUpdate: `nexla_sdk/models/validators/requests.py:32` +### nexla_sdk.models.validators.responses +- Validator: `nexla_sdk/models/validators/responses.py:22` +- ValidatorCredential: `nexla_sdk/models/validators/responses.py:12` +### nexla_sdk.models.vendor_endpoints +- VendorEndpoint: `nexla_sdk/models/vendor_endpoints/responses.py:8` +- VendorEndpointCreate: `nexla_sdk/models/vendor_endpoints/requests.py:6` +- VendorEndpointUpdate: `nexla_sdk/models/vendor_endpoints/requests.py:13` +### nexla_sdk.models.vendor_endpoints.requests +- VendorEndpointCreate: `nexla_sdk/models/vendor_endpoints/requests.py:6` +- VendorEndpointUpdate: `nexla_sdk/models/vendor_endpoints/requests.py:13` +### nexla_sdk.models.vendor_endpoints.responses +- VendorEndpoint: `nexla_sdk/models/vendor_endpoints/responses.py:8` +### nexla_sdk.models.vendors +- Vendor: `nexla_sdk/models/vendors/responses.py:19` +- VendorCreate: `nexla_sdk/models/vendors/requests.py:8` +- VendorRef: `nexla_sdk/models/vendors/responses.py:11` +- VendorUpdate: `nexla_sdk/models/vendors/requests.py:20` +### nexla_sdk.models.vendors.requests +- VendorCreate: `nexla_sdk/models/vendors/requests.py:8` +- VendorUpdate: `nexla_sdk/models/vendors/requests.py:20` +### nexla_sdk.models.vendors.responses +- Vendor: `nexla_sdk/models/vendors/responses.py:19` +- VendorRef: `nexla_sdk/models/vendors/responses.py:11` ### nexla_sdk.models.webhooks - WebhookResponse: `nexla_sdk/models/webhooks/responses.py:8` - WebhookSendOptions: `nexla_sdk/models/webhooks/requests.py:8` @@ -1458,521 +2619,2235 @@ Each API page embeds per-symbol source links. Summary below. - WebhookSendOptions: `nexla_sdk/models/webhooks/requests.py:8` ### nexla_sdk.models.webhooks.responses - WebhookResponse: `nexla_sdk/models/webhooks/responses.py:8` +### nexla_sdk.raw_operations +- OperationDefinition: `nexla_sdk/raw_operations.py:19` +- RawOperationsClient: `nexla_sdk/raw_operations.py:31` +- RawOperationsClient.call: `nexla_sdk/raw_operations.py:63` +- RawOperationsClient.delete: `nexla_sdk/raw_operations.py:155` +- RawOperationsClient.get: `nexla_sdk/raw_operations.py:107` +- RawOperationsClient.get_operation: `nexla_sdk/raw_operations.py:41` +- RawOperationsClient.head: `nexla_sdk/raw_operations.py:189` +- RawOperationsClient.list_operations: `nexla_sdk/raw_operations.py:37` +- RawOperationsClient.options: `nexla_sdk/raw_operations.py:203` +- RawOperationsClient.patch: `nexla_sdk/raw_operations.py:172` +- RawOperationsClient.post: `nexla_sdk/raw_operations.py:121` +- RawOperationsClient.put: `nexla_sdk/raw_operations.py:138` +- RawOperationsClient.request: `nexla_sdk/raw_operations.py:88` ### nexla_sdk.resources +- ApiKeysResource: `nexla_sdk/resources/api_keys.py:9` +- ApiKeysResource.activate: `nexla_sdk/resources/api_keys.py:149` +- ApiKeysResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ApiKeysResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ApiKeysResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ApiKeysResource.copy: `nexla_sdk/resources/api_keys.py:146` +- ApiKeysResource.create: `nexla_sdk/resources/api_keys.py:137` +- ApiKeysResource.delete: `nexla_sdk/resources/api_keys.py:143` +- ApiKeysResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ApiKeysResource.get: `nexla_sdk/resources/api_keys.py:99` +- ApiKeysResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ApiKeysResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ApiKeysResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ApiKeysResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ApiKeysResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ApiKeysResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ApiKeysResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ApiKeysResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ApiKeysResource.list: `nexla_sdk/resources/api_keys.py:47` +- ApiKeysResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ApiKeysResource.list_grouped: `nexla_sdk/resources/api_keys.py:74` +- ApiKeysResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ApiKeysResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ApiKeysResource.pause: `nexla_sdk/resources/api_keys.py:152` +- ApiKeysResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ApiKeysResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ApiKeysResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ApiKeysResource.search: `nexla_sdk/resources/api_keys.py:112` +- ApiKeysResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ApiKeysResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ApiKeysResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ApiKeysResource.update: `nexla_sdk/resources/api_keys.py:140` - ApprovalRequestsResource: `nexla_sdk/resources/approval_requests.py:7` - ApprovalRequestsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- ApprovalRequestsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:25` +- ApprovalRequestsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ApprovalRequestsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ApprovalRequestsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:60` +- ApprovalRequestsResource.cancel: `nexla_sdk/resources/approval_requests.py:71` - ApprovalRequestsResource.copy: `nexla_sdk/resources/base_resource.py:321` - ApprovalRequestsResource.create: `nexla_sdk/resources/base_resource.py:229` - ApprovalRequestsResource.delete: `nexla_sdk/resources/base_resource.py:274` -- ApprovalRequestsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- ApprovalRequestsResource.get: `nexla_sdk/resources/base_resource.py:199` -- ApprovalRequestsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- ApprovalRequestsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- ApprovalRequestsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ApprovalRequestsResource.get: `nexla_sdk/resources/approval_requests.py:50` +- ApprovalRequestsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ApprovalRequestsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ApprovalRequestsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ApprovalRequestsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ApprovalRequestsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ApprovalRequestsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ApprovalRequestsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ApprovalRequestsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - ApprovalRequestsResource.list: `nexla_sdk/resources/base_resource.py:130` +- ApprovalRequestsResource.list_access_pending: `nexla_sdk/resources/approval_requests.py:35` +- ApprovalRequestsResource.list_access_requested: `nexla_sdk/resources/approval_requests.py:30` +- ApprovalRequestsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ApprovalRequestsResource.list_assigned: `nexla_sdk/resources/approval_requests.py:20` +- ApprovalRequestsResource.list_listings_pending: `nexla_sdk/resources/approval_requests.py:45` +- ApprovalRequestsResource.list_listings_requested: `nexla_sdk/resources/approval_requests.py:40` - ApprovalRequestsResource.list_pending: `nexla_sdk/resources/approval_requests.py:15` -- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:20` +- ApprovalRequestsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:25` - ApprovalRequestsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - ApprovalRequestsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:30` -- ApprovalRequestsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:65` +- ApprovalRequestsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ApprovalRequestsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ApprovalRequestsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ApprovalRequestsResource.search: `nexla_sdk/resources/base_resource.py:408` +- ApprovalRequestsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ApprovalRequestsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ApprovalRequestsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ApprovalRequestsResource.show_data_set: `nexla_sdk/resources/approval_requests.py:55` - ApprovalRequestsResource.update: `nexla_sdk/resources/base_resource.py:252` - AsyncTasksResource: `nexla_sdk/resources/async_tasks.py:8` - AsyncTasksResource.acknowledge: `nexla_sdk/resources/async_tasks.py:73` - AsyncTasksResource.activate: `nexla_sdk/resources/base_resource.py:289` -- AsyncTasksResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- AsyncTasksResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AsyncTasksResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AsyncTasksResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - AsyncTasksResource.copy: `nexla_sdk/resources/base_resource.py:321` - AsyncTasksResource.create: `nexla_sdk/resources/async_tasks.py:21` - AsyncTasksResource.delete: `nexla_sdk/resources/async_tasks.py:50` -- AsyncTasksResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- AsyncTasksResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - AsyncTasksResource.download_link: `nexla_sdk/resources/async_tasks.py:63` - AsyncTasksResource.explain_arguments: `nexla_sdk/resources/async_tasks.py:41` - AsyncTasksResource.get: `nexla_sdk/resources/async_tasks.py:45` -- AsyncTasksResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- AsyncTasksResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- AsyncTasksResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AsyncTasksResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AsyncTasksResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AsyncTasksResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AsyncTasksResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AsyncTasksResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AsyncTasksResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AsyncTasksResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - AsyncTasksResource.list: `nexla_sdk/resources/async_tasks.py:16` +- AsyncTasksResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - AsyncTasksResource.list_by_status: `nexla_sdk/resources/async_tasks.py:32` - AsyncTasksResource.list_of_type: `nexla_sdk/resources/async_tasks.py:27` +- AsyncTasksResource.list_public: `nexla_sdk/resources/base_resource.py:339` - AsyncTasksResource.paginate: `nexla_sdk/resources/base_resource.py:181` - AsyncTasksResource.pause: `nexla_sdk/resources/base_resource.py:305` -- AsyncTasksResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- AsyncTasksResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AsyncTasksResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AsyncTasksResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` - AsyncTasksResource.rerun: `nexla_sdk/resources/async_tasks.py:54` - AsyncTasksResource.result: `nexla_sdk/resources/async_tasks.py:59` +- AsyncTasksResource.search: `nexla_sdk/resources/base_resource.py:408` +- AsyncTasksResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- AsyncTasksResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AsyncTasksResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - AsyncTasksResource.types: `nexla_sdk/resources/async_tasks.py:37` - AsyncTasksResource.update: `nexla_sdk/resources/base_resource.py:252` - AttributeTransformsResource: `nexla_sdk/resources/attribute_transforms.py:11` - AttributeTransformsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- AttributeTransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- AttributeTransformsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- AttributeTransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AttributeTransformsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AttributeTransformsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- AttributeTransformsResource.copy: `nexla_sdk/resources/attribute_transforms.py:63` - AttributeTransformsResource.create: `nexla_sdk/resources/attribute_transforms.py:43` - AttributeTransformsResource.delete: `nexla_sdk/resources/attribute_transforms.py:53` -- AttributeTransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- AttributeTransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - AttributeTransformsResource.get: `nexla_sdk/resources/attribute_transforms.py:37` -- AttributeTransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- AttributeTransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- AttributeTransformsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AttributeTransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AttributeTransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AttributeTransformsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AttributeTransformsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AttributeTransformsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AttributeTransformsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AttributeTransformsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - AttributeTransformsResource.list: `nexla_sdk/resources/attribute_transforms.py:19` +- AttributeTransformsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - AttributeTransformsResource.list_public: `nexla_sdk/resources/attribute_transforms.py:57` - AttributeTransformsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - AttributeTransformsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- AttributeTransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- AttributeTransformsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AttributeTransformsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AttributeTransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- AttributeTransformsResource.search: `nexla_sdk/resources/attribute_transforms.py:67` +- AttributeTransformsResource.search_tags: `nexla_sdk/resources/attribute_transforms.py:70` +- AttributeTransformsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AttributeTransformsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - AttributeTransformsResource.update: `nexla_sdk/resources/attribute_transforms.py:47` +- AuthParametersResource: `nexla_sdk/resources/auth_parameters.py:11` +- AuthParametersResource.activate: `nexla_sdk/resources/base_resource.py:289` +- AuthParametersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AuthParametersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AuthParametersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- AuthParametersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- AuthParametersResource.create: `nexla_sdk/resources/auth_parameters.py:25` +- AuthParametersResource.delete: `nexla_sdk/resources/auth_parameters.py:35` +- AuthParametersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- AuthParametersResource.get: `nexla_sdk/resources/auth_parameters.py:22` +- AuthParametersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AuthParametersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AuthParametersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AuthParametersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AuthParametersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AuthParametersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AuthParametersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AuthParametersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- AuthParametersResource.list: `nexla_sdk/resources/auth_parameters.py:19` +- AuthParametersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- AuthParametersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- AuthParametersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- AuthParametersResource.pause: `nexla_sdk/resources/base_resource.py:305` +- AuthParametersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AuthParametersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AuthParametersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- AuthParametersResource.search: `nexla_sdk/resources/base_resource.py:408` +- AuthParametersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- AuthParametersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AuthParametersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- AuthParametersResource.update: `nexla_sdk/resources/auth_parameters.py:28` +- AuthTemplatesResource: `nexla_sdk/resources/auth_templates.py:13` +- AuthTemplatesResource.activate: `nexla_sdk/resources/base_resource.py:289` +- AuthTemplatesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- AuthTemplatesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- AuthTemplatesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- AuthTemplatesResource.copy: `nexla_sdk/resources/base_resource.py:321` +- AuthTemplatesResource.create: `nexla_sdk/resources/auth_templates.py:101` +- AuthTemplatesResource.delete: `nexla_sdk/resources/auth_templates.py:145` +- AuthTemplatesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- AuthTemplatesResource.delete_all: `nexla_sdk/resources/auth_templates.py:172` +- AuthTemplatesResource.delete_by_name: `nexla_sdk/resources/auth_templates.py:156` +- AuthTemplatesResource.get: `nexla_sdk/resources/auth_templates.py:76` +- AuthTemplatesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- AuthTemplatesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- AuthTemplatesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- AuthTemplatesResource.get_by_name: `nexla_sdk/resources/auth_templates.py:88` +- AuthTemplatesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- AuthTemplatesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- AuthTemplatesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- AuthTemplatesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- AuthTemplatesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- AuthTemplatesResource.list: `nexla_sdk/resources/auth_templates.py:55` +- AuthTemplatesResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- AuthTemplatesResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- AuthTemplatesResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- AuthTemplatesResource.pause: `nexla_sdk/resources/base_resource.py:305` +- AuthTemplatesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- AuthTemplatesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- AuthTemplatesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- AuthTemplatesResource.search: `nexla_sdk/resources/base_resource.py:408` +- AuthTemplatesResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- AuthTemplatesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- AuthTemplatesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- AuthTemplatesResource.update: `nexla_sdk/resources/auth_templates.py:112` +- AuthTemplatesResource.update_all: `nexla_sdk/resources/auth_templates.py:168` +- AuthTemplatesResource.update_by_name: `nexla_sdk/resources/auth_templates.py:126` - BaseResource: `nexla_sdk/resources/base_resource.py:15` - BaseResource.activate: `nexla_sdk/resources/base_resource.py:289` -- BaseResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- BaseResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- BaseResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- BaseResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - BaseResource.copy: `nexla_sdk/resources/base_resource.py:321` - BaseResource.create: `nexla_sdk/resources/base_resource.py:229` - BaseResource.delete: `nexla_sdk/resources/base_resource.py:274` -- BaseResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- BaseResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - BaseResource.get: `nexla_sdk/resources/base_resource.py:199` -- BaseResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- BaseResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- BaseResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- BaseResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- BaseResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- BaseResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- BaseResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- BaseResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- BaseResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- BaseResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - BaseResource.list: `nexla_sdk/resources/base_resource.py:130` +- BaseResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- BaseResource.list_public: `nexla_sdk/resources/base_resource.py:339` - BaseResource.paginate: `nexla_sdk/resources/base_resource.py:181` - BaseResource.pause: `nexla_sdk/resources/base_resource.py:305` -- BaseResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- BaseResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- BaseResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- BaseResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- BaseResource.search: `nexla_sdk/resources/base_resource.py:408` +- BaseResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- BaseResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- BaseResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - BaseResource.update: `nexla_sdk/resources/base_resource.py:252` +- CatalogConfigsResource: `nexla_sdk/resources/catalog_configs.py:11` +- CatalogConfigsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- CatalogConfigsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CatalogConfigsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CatalogConfigsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- CatalogConfigsResource.check_job_status: `nexla_sdk/resources/catalog_configs.py:43` +- CatalogConfigsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- CatalogConfigsResource.create: `nexla_sdk/resources/catalog_configs.py:29` +- CatalogConfigsResource.delete: `nexla_sdk/resources/catalog_configs.py:37` +- CatalogConfigsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CatalogConfigsResource.get: `nexla_sdk/resources/catalog_configs.py:26` +- CatalogConfigsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CatalogConfigsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CatalogConfigsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CatalogConfigsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CatalogConfigsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CatalogConfigsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CatalogConfigsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CatalogConfigsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- CatalogConfigsResource.list: `nexla_sdk/resources/catalog_configs.py:19` +- CatalogConfigsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- CatalogConfigsResource.list_all: `nexla_sdk/resources/catalog_configs.py:22` +- CatalogConfigsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- CatalogConfigsResource.mock_catalog_add: `nexla_sdk/resources/catalog_configs.py:40` +- CatalogConfigsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- CatalogConfigsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- CatalogConfigsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CatalogConfigsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CatalogConfigsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CatalogConfigsResource.search: `nexla_sdk/resources/base_resource.py:408` +- CatalogConfigsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- CatalogConfigsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CatalogConfigsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- CatalogConfigsResource.start_bulk_create_update: `nexla_sdk/resources/catalog_configs.py:47` +- CatalogConfigsResource.update: `nexla_sdk/resources/catalog_configs.py:32` +- ClusterEndpointsResource: `nexla_sdk/resources/cluster_endpoints.py:13` +- ClusterEndpointsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- ClusterEndpointsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ClusterEndpointsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ClusterEndpointsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ClusterEndpointsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ClusterEndpointsResource.create: `nexla_sdk/resources/cluster_endpoints.py:84` +- ClusterEndpointsResource.delete: `nexla_sdk/resources/base_resource.py:274` +- ClusterEndpointsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ClusterEndpointsResource.get: `nexla_sdk/resources/cluster_endpoints.py:71` +- ClusterEndpointsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ClusterEndpointsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ClusterEndpointsResource.get_audit_log: `nexla_sdk/resources/cluster_endpoints.py:116` +- ClusterEndpointsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ClusterEndpointsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ClusterEndpointsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ClusterEndpointsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ClusterEndpointsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ClusterEndpointsResource.list: `nexla_sdk/resources/cluster_endpoints.py:54` +- ClusterEndpointsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ClusterEndpointsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ClusterEndpointsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ClusterEndpointsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- ClusterEndpointsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ClusterEndpointsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ClusterEndpointsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ClusterEndpointsResource.search: `nexla_sdk/resources/base_resource.py:408` +- ClusterEndpointsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ClusterEndpointsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ClusterEndpointsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ClusterEndpointsResource.update: `nexla_sdk/resources/cluster_endpoints.py:99` +- ClustersResource: `nexla_sdk/resources/clusters.py:10` +- ClustersResource.activate: `nexla_sdk/resources/clusters.py:117` +- ClustersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ClustersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ClustersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ClustersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ClustersResource.create: `nexla_sdk/resources/clusters.py:81` +- ClustersResource.delete: `nexla_sdk/resources/clusters.py:106` +- ClustersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ClustersResource.delete_endpoint: `nexla_sdk/resources/clusters.py:144` +- ClustersResource.get: `nexla_sdk/resources/clusters.py:69` +- ClustersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ClustersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ClustersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ClustersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ClustersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ClustersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ClustersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ClustersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ClustersResource.list: `nexla_sdk/resources/clusters.py:48` +- ClustersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ClustersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ClustersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ClustersResource.pause: `nexla_sdk/resources/base_resource.py:305` +- ClustersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ClustersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ClustersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ClustersResource.search: `nexla_sdk/resources/base_resource.py:408` +- ClustersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ClustersResource.set_default: `nexla_sdk/resources/clusters.py:128` +- ClustersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ClustersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ClustersResource.update: `nexla_sdk/resources/clusters.py:92` - CodeContainersResource: `nexla_sdk/resources/code_containers.py:11` - CodeContainersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- CodeContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- CodeContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CodeContainersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CodeContainersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - CodeContainersResource.copy: `nexla_sdk/resources/code_containers.py:67` - CodeContainersResource.create: `nexla_sdk/resources/code_containers.py:45` - CodeContainersResource.delete: `nexla_sdk/resources/code_containers.py:63` -- CodeContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- CodeContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CodeContainersResource.error_functions: `nexla_sdk/resources/code_containers.py:84` - CodeContainersResource.get: `nexla_sdk/resources/code_containers.py:37` -- CodeContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- CodeContainersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- CodeContainersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CodeContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CodeContainersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CodeContainersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CodeContainersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CodeContainersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CodeContainersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CodeContainersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - CodeContainersResource.list: `nexla_sdk/resources/code_containers.py:19` +- CodeContainersResource.list_accessible: `nexla_sdk/resources/code_containers.py:77` - CodeContainersResource.list_public: `nexla_sdk/resources/code_containers.py:71` - CodeContainersResource.paginate: `nexla_sdk/resources/base_resource.py:181` - CodeContainersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- CodeContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- CodeContainersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CodeContainersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CodeContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CodeContainersResource.repo: `nexla_sdk/resources/code_containers.py:80` +- CodeContainersResource.search: `nexla_sdk/resources/code_containers.py:87` +- CodeContainersResource.search_tags: `nexla_sdk/resources/code_containers.py:90` +- CodeContainersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CodeContainersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - CodeContainersResource.update: `nexla_sdk/resources/code_containers.py:53` +- ConnectorsResource: `nexla_sdk/resources/connectors.py:10` +- ConnectorsResource.activate: `nexla_sdk/resources/connectors.py:135` +- ConnectorsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ConnectorsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ConnectorsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ConnectorsResource.copy: `nexla_sdk/resources/connectors.py:132` +- ConnectorsResource.create: `nexla_sdk/resources/connectors.py:126` +- ConnectorsResource.delete: `nexla_sdk/resources/connectors.py:129` +- ConnectorsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ConnectorsResource.get: `nexla_sdk/resources/connectors.py:94` +- ConnectorsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ConnectorsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ConnectorsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ConnectorsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ConnectorsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ConnectorsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ConnectorsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ConnectorsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ConnectorsResource.list: `nexla_sdk/resources/connectors.py:59` +- ConnectorsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ConnectorsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ConnectorsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ConnectorsResource.pause: `nexla_sdk/resources/connectors.py:138` +- ConnectorsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ConnectorsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ConnectorsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ConnectorsResource.search: `nexla_sdk/resources/base_resource.py:408` +- ConnectorsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ConnectorsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ConnectorsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ConnectorsResource.update: `nexla_sdk/resources/connectors.py:107` - CredentialsResource: `nexla_sdk/resources/credentials.py:19` - CredentialsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- CredentialsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- CredentialsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CredentialsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CredentialsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - CredentialsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- CredentialsResource.create: `nexla_sdk/resources/credentials.py:75` -- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:105` -- CredentialsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- CredentialsResource.get: `nexla_sdk/resources/credentials.py:59` -- CredentialsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- CredentialsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- CredentialsResource.create: `nexla_sdk/resources/credentials.py:103` +- CredentialsResource.credentials_schema: `nexla_sdk/resources/credentials.py:71` +- CredentialsResource.db_data_types: `nexla_sdk/resources/credentials.py:77` +- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:133` +- CredentialsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CredentialsResource.get: `nexla_sdk/resources/credentials.py:87` +- CredentialsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CredentialsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CredentialsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CredentialsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CredentialsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CredentialsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CredentialsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CredentialsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- CredentialsResource.intent: `nexla_sdk/resources/credentials.py:297` - CredentialsResource.list: `nexla_sdk/resources/credentials.py:27` +- CredentialsResource.list_accessible: `nexla_sdk/resources/credentials.py:68` +- CredentialsResource.list_all: `nexla_sdk/resources/credentials.py:59` +- CredentialsResource.list_public: `nexla_sdk/resources/credentials.py:64` +- CredentialsResource.migrate_iceberg: `nexla_sdk/resources/credentials.py:303` - CredentialsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - CredentialsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:117` -- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:183` -- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:155` -- CredentialsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- CredentialsResource.update: `nexla_sdk/resources/credentials.py:92` -- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:7` +- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:145` +- CredentialsResource.probe_detect_schemas: `nexla_sdk/resources/credentials.py:209` +- CredentialsResource.probe_file_download: `nexla_sdk/resources/credentials.py:221` +- CredentialsResource.probe_list_buckets: `nexla_sdk/resources/credentials.py:183` +- CredentialsResource.probe_list_files: `nexla_sdk/resources/credentials.py:191` +- CredentialsResource.probe_read_file: `nexla_sdk/resources/credentials.py:203` +- CredentialsResource.probe_read_sample: `nexla_sdk/resources/credentials.py:215` +- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:261` +- CredentialsResource.probe_search_path: `nexla_sdk/resources/credentials.py:227` +- CredentialsResource.probe_summary: `nexla_sdk/resources/credentials.py:187` +- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:233` +- CredentialsResource.probe_tree_request: `nexla_sdk/resources/credentials.py:197` +- CredentialsResource.refresh: `nexla_sdk/resources/credentials.py:289` +- CredentialsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CredentialsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CredentialsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CredentialsResource.search: `nexla_sdk/resources/credentials.py:81` +- CredentialsResource.search_tags: `nexla_sdk/resources/credentials.py:84` +- CredentialsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CredentialsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- CredentialsResource.update: `nexla_sdk/resources/credentials.py:120` +- CredentialsResource.usage: `nexla_sdk/resources/credentials.py:293` +- CubeJsResource: `nexla_sdk/resources/cubejs.py:6` +- CubeJsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- CubeJsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CubeJsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CubeJsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- CubeJsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- CubeJsResource.create: `nexla_sdk/resources/base_resource.py:229` +- CubeJsResource.delete: `nexla_sdk/resources/base_resource.py:274` +- CubeJsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CubeJsResource.get: `nexla_sdk/resources/base_resource.py:199` +- CubeJsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CubeJsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CubeJsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CubeJsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CubeJsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CubeJsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CubeJsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CubeJsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- CubeJsResource.list: `nexla_sdk/resources/base_resource.py:130` +- CubeJsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- CubeJsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- CubeJsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- CubeJsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- CubeJsResource.query: `nexla_sdk/resources/cubejs.py:14` +- CubeJsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CubeJsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CubeJsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CubeJsResource.search: `nexla_sdk/resources/base_resource.py:408` +- CubeJsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- CubeJsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CubeJsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- CubeJsResource.update: `nexla_sdk/resources/base_resource.py:252` +- CustomDataFlowsResource: `nexla_sdk/resources/custom_data_flows.py:11` +- CustomDataFlowsResource.activate: `nexla_sdk/resources/custom_data_flows.py:48` +- CustomDataFlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- CustomDataFlowsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- CustomDataFlowsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- CustomDataFlowsResource.copy: `nexla_sdk/resources/custom_data_flows.py:43` +- CustomDataFlowsResource.create: `nexla_sdk/resources/custom_data_flows.py:28` +- CustomDataFlowsResource.delete: `nexla_sdk/resources/custom_data_flows.py:40` +- CustomDataFlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- CustomDataFlowsResource.edit_code_containers: `nexla_sdk/resources/custom_data_flows.py:60` +- CustomDataFlowsResource.edit_data_credentials: `nexla_sdk/resources/custom_data_flows.py:68` +- CustomDataFlowsResource.get: `nexla_sdk/resources/custom_data_flows.py:25` +- CustomDataFlowsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- CustomDataFlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- CustomDataFlowsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- CustomDataFlowsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- CustomDataFlowsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- CustomDataFlowsResource.get_metrics: `nexla_sdk/resources/custom_data_flows.py:56` +- CustomDataFlowsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- CustomDataFlowsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- CustomDataFlowsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- CustomDataFlowsResource.list: `nexla_sdk/resources/custom_data_flows.py:19` +- CustomDataFlowsResource.list_accessible: `nexla_sdk/resources/custom_data_flows.py:22` +- CustomDataFlowsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- CustomDataFlowsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- CustomDataFlowsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- CustomDataFlowsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- CustomDataFlowsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- CustomDataFlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- CustomDataFlowsResource.search: `nexla_sdk/resources/custom_data_flows.py:76` +- CustomDataFlowsResource.search_tags: `nexla_sdk/resources/custom_data_flows.py:79` +- CustomDataFlowsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- CustomDataFlowsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- CustomDataFlowsResource.update: `nexla_sdk/resources/custom_data_flows.py:33` +- DashboardTransformsResource: `nexla_sdk/resources/dashboard_transforms.py:11` +- DashboardTransformsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- DashboardTransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DashboardTransformsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DashboardTransformsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DashboardTransformsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- DashboardTransformsResource.create: `nexla_sdk/resources/dashboard_transforms.py:29` +- DashboardTransformsResource.delete: `nexla_sdk/resources/dashboard_transforms.py:41` +- DashboardTransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DashboardTransformsResource.get: `nexla_sdk/resources/dashboard_transforms.py:26` +- DashboardTransformsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DashboardTransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DashboardTransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- DashboardTransformsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DashboardTransformsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DashboardTransformsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DashboardTransformsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DashboardTransformsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DashboardTransformsResource.list: `nexla_sdk/resources/dashboard_transforms.py:19` +- DashboardTransformsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- DashboardTransformsResource.list_all: `nexla_sdk/resources/dashboard_transforms.py:22` +- DashboardTransformsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- DashboardTransformsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- DashboardTransformsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- DashboardTransformsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DashboardTransformsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DashboardTransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DashboardTransformsResource.search: `nexla_sdk/resources/base_resource.py:408` +- DashboardTransformsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- DashboardTransformsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DashboardTransformsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DashboardTransformsResource.update: `nexla_sdk/resources/dashboard_transforms.py:34` +- DataCredentialsGroupsResource: `nexla_sdk/resources/data_credentials_groups.py:13` +- DataCredentialsGroupsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- DataCredentialsGroupsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DataCredentialsGroupsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DataCredentialsGroupsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DataCredentialsGroupsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- DataCredentialsGroupsResource.create: `nexla_sdk/resources/data_credentials_groups.py:27` +- DataCredentialsGroupsResource.delete: `nexla_sdk/resources/data_credentials_groups.py:39` +- DataCredentialsGroupsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DataCredentialsGroupsResource.get: `nexla_sdk/resources/data_credentials_groups.py:24` +- DataCredentialsGroupsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DataCredentialsGroupsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DataCredentialsGroupsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- DataCredentialsGroupsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DataCredentialsGroupsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DataCredentialsGroupsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DataCredentialsGroupsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DataCredentialsGroupsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DataCredentialsGroupsResource.list: `nexla_sdk/resources/data_credentials_groups.py:21` +- DataCredentialsGroupsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- DataCredentialsGroupsResource.list_credentials: `nexla_sdk/resources/data_credentials_groups.py:42` +- DataCredentialsGroupsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- DataCredentialsGroupsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- DataCredentialsGroupsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- DataCredentialsGroupsResource.remove_credentials: `nexla_sdk/resources/data_credentials_groups.py:47` +- DataCredentialsGroupsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DataCredentialsGroupsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DataCredentialsGroupsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DataCredentialsGroupsResource.search: `nexla_sdk/resources/base_resource.py:408` +- DataCredentialsGroupsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- DataCredentialsGroupsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DataCredentialsGroupsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DataCredentialsGroupsResource.update: `nexla_sdk/resources/data_credentials_groups.py:32` +- DataFlowsResource: `nexla_sdk/resources/data_flows.py:6` +- DataFlowsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- DataFlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DataFlowsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DataFlowsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DataFlowsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- DataFlowsResource.create: `nexla_sdk/resources/data_flows.py:22` +- DataFlowsResource.create_data_sink_flow: `nexla_sdk/resources/data_flows.py:48` +- DataFlowsResource.create_data_source_flow: `nexla_sdk/resources/data_flows.py:38` +- DataFlowsResource.delete: `nexla_sdk/resources/base_resource.py:274` +- DataFlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DataFlowsResource.get: `nexla_sdk/resources/data_flows.py:18` +- DataFlowsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DataFlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DataFlowsResource.get_audit_log: `nexla_sdk/resources/data_flows.py:25` +- DataFlowsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DataFlowsResource.get_data_sink_audit_log: `nexla_sdk/resources/data_flows.py:59` +- DataFlowsResource.get_data_sink_flow: `nexla_sdk/resources/data_flows.py:44` +- DataFlowsResource.get_data_source_audit_log: `nexla_sdk/resources/data_flows.py:54` +- DataFlowsResource.get_data_source_flow: `nexla_sdk/resources/data_flows.py:34` +- DataFlowsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DataFlowsResource.get_flow_audit_log: `nexla_sdk/resources/data_flows.py:51` +- DataFlowsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DataFlowsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DataFlowsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DataFlowsResource.list: `nexla_sdk/resources/data_flows.py:14` +- DataFlowsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- DataFlowsResource.list_data_sink_flows: `nexla_sdk/resources/data_flows.py:41` +- DataFlowsResource.list_data_source_flows: `nexla_sdk/resources/data_flows.py:29` +- DataFlowsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- DataFlowsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- DataFlowsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- DataFlowsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DataFlowsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DataFlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DataFlowsResource.search: `nexla_sdk/resources/base_resource.py:408` +- DataFlowsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- DataFlowsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DataFlowsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DataFlowsResource.update: `nexla_sdk/resources/base_resource.py:252` +- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:8` - DataSchemasResource.activate: `nexla_sdk/resources/base_resource.py:289` -- DataSchemasResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DataSchemasResource.copy: `nexla_sdk/resources/base_resource.py:321` -- DataSchemasResource.create: `nexla_sdk/resources/base_resource.py:229` -- DataSchemasResource.delete: `nexla_sdk/resources/base_resource.py:274` -- DataSchemasResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DataSchemasResource.get: `nexla_sdk/resources/base_resource.py:199` -- DataSchemasResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:15` -- DataSchemasResource.list: `nexla_sdk/resources/base_resource.py:130` +- DataSchemasResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DataSchemasResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DataSchemasResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DataSchemasResource.copy: `nexla_sdk/resources/data_schemas.py:56` +- DataSchemasResource.create: `nexla_sdk/resources/data_schemas.py:33` +- DataSchemasResource.delete: `nexla_sdk/resources/data_schemas.py:39` +- DataSchemasResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DataSchemasResource.get: `nexla_sdk/resources/data_schemas.py:30` +- DataSchemasResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DataSchemasResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:61` +- DataSchemasResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DataSchemasResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DataSchemasResource.get_metrics: `nexla_sdk/resources/data_schemas.py:42` +- DataSchemasResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DataSchemasResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DataSchemasResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DataSchemasResource.list: `nexla_sdk/resources/data_schemas.py:16` +- DataSchemasResource.list_accessible: `nexla_sdk/resources/data_schemas.py:27` +- DataSchemasResource.list_all: `nexla_sdk/resources/data_schemas.py:19` +- DataSchemasResource.list_public: `nexla_sdk/resources/data_schemas.py:23` - DataSchemasResource.paginate: `nexla_sdk/resources/base_resource.py:181` - DataSchemasResource.pause: `nexla_sdk/resources/base_resource.py:305` -- DataSchemasResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DataSchemasResource.update: `nexla_sdk/resources/base_resource.py:252` +- DataSchemasResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DataSchemasResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DataSchemasResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DataSchemasResource.search: `nexla_sdk/resources/data_schemas.py:50` +- DataSchemasResource.search_tags: `nexla_sdk/resources/data_schemas.py:53` +- DataSchemasResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DataSchemasResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DataSchemasResource.update: `nexla_sdk/resources/data_schemas.py:36` - DestinationsResource: `nexla_sdk/resources/destinations.py:12` -- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:94` -- DestinationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:118` -- DestinationsResource.create: `nexla_sdk/resources/destinations.py:54` -- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:82` -- DestinationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DestinationsResource.get: `nexla_sdk/resources/destinations.py:38` -- DestinationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DestinationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:173` +- DestinationsResource.activate_api_key: `nexla_sdk/resources/destinations.py:354` +- DestinationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DestinationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DestinationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:197` +- DestinationsResource.create: `nexla_sdk/resources/destinations.py:86` +- DestinationsResource.create_api_key: `nexla_sdk/resources/destinations.py:340` +- DestinationsResource.create_dashboard_transforms: `nexla_sdk/resources/destinations.py:273` +- DestinationsResource.create_quarantine_settings: `nexla_sdk/resources/destinations.py:253` +- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:114` +- DestinationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DestinationsResource.delete_api_key: `nexla_sdk/resources/destinations.py:366` +- DestinationsResource.delete_dashboard_transforms: `nexla_sdk/resources/destinations.py:285` +- DestinationsResource.delete_quarantine_settings: `nexla_sdk/resources/destinations.py:265` +- DestinationsResource.edit_flow_triggers: `nexla_sdk/resources/destinations.py:309` +- DestinationsResource.get: `nexla_sdk/resources/destinations.py:70` +- DestinationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DestinationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DestinationsResource.get_api_key: `nexla_sdk/resources/destinations.py:336` +- DestinationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- DestinationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DestinationsResource.get_dashboard_transforms: `nexla_sdk/resources/destinations.py:269` +- DestinationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DestinationsResource.get_flow: `nexla_sdk/resources/destinations.py:126` +- DestinationsResource.get_flow_dashboard: `nexla_sdk/resources/destinations.py:129` +- DestinationsResource.get_flow_logs: `nexla_sdk/resources/destinations.py:144` +- DestinationsResource.get_flow_metrics: `nexla_sdk/resources/destinations.py:139` +- DestinationsResource.get_flow_status_metrics: `nexla_sdk/resources/destinations.py:134` +- DestinationsResource.get_metrics: `nexla_sdk/resources/destinations.py:149` +- DestinationsResource.get_offset: `nexla_sdk/resources/destinations.py:165` +- DestinationsResource.get_quarantine_aggregation: `nexla_sdk/resources/destinations.py:376` +- DestinationsResource.get_quarantine_offset: `nexla_sdk/resources/destinations.py:157` +- DestinationsResource.get_quarantine_settings: `nexla_sdk/resources/destinations.py:249` +- DestinationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DestinationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DestinationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - DestinationsResource.list: `nexla_sdk/resources/destinations.py:20` +- DestinationsResource.list_accessible: `nexla_sdk/resources/destinations.py:60` +- DestinationsResource.list_all: `nexla_sdk/resources/destinations.py:44` +- DestinationsResource.list_all_by_data_set: `nexla_sdk/resources/destinations.py:54` +- DestinationsResource.list_all_condensed: `nexla_sdk/resources/destinations.py:48` +- DestinationsResource.list_all_ids: `nexla_sdk/resources/destinations.py:51` +- DestinationsResource.list_api_keys: `nexla_sdk/resources/destinations.py:326` +- DestinationsResource.list_flow_triggers: `nexla_sdk/resources/destinations.py:305` +- DestinationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - DestinationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:106` -- DestinationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DestinationsResource.update: `nexla_sdk/resources/destinations.py:69` -- DocContainersResource: `nexla_sdk/resources/doc_containers.py:7` +- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:185` +- DestinationsResource.pause_all_api_keys: `nexla_sdk/resources/destinations.py:362` +- DestinationsResource.pause_api_key: `nexla_sdk/resources/destinations.py:358` +- DestinationsResource.probe_authenticate: `nexla_sdk/resources/destinations.py:221` +- DestinationsResource.probe_detect_schemas: `nexla_sdk/resources/destinations.py:237` +- DestinationsResource.probe_list_buckets: `nexla_sdk/resources/destinations.py:213` +- DestinationsResource.probe_list_files: `nexla_sdk/resources/destinations.py:225` +- DestinationsResource.probe_quarantine_sample: `nexla_sdk/resources/destinations.py:243` +- DestinationsResource.probe_read_file: `nexla_sdk/resources/destinations.py:233` +- DestinationsResource.probe_summary: `nexla_sdk/resources/destinations.py:217` +- DestinationsResource.probe_tree: `nexla_sdk/resources/destinations.py:229` +- DestinationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DestinationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DestinationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DestinationsResource.rotate_api_key: `nexla_sdk/resources/destinations.py:350` +- DestinationsResource.run_analysis: `nexla_sdk/resources/destinations.py:301` +- DestinationsResource.run_status: `nexla_sdk/resources/destinations.py:295` +- DestinationsResource.script_sink_config: `nexla_sdk/resources/destinations.py:63` +- DestinationsResource.search: `nexla_sdk/resources/destinations.py:38` +- DestinationsResource.search_api_keys: `nexla_sdk/resources/destinations.py:330` +- DestinationsResource.search_tags: `nexla_sdk/resources/destinations.py:41` +- DestinationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DestinationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DestinationsResource.test_config: `nexla_sdk/resources/destinations.py:292` +- DestinationsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/destinations.py:370` +- DestinationsResource.update: `nexla_sdk/resources/destinations.py:101` +- DestinationsResource.update_api_key: `nexla_sdk/resources/destinations.py:344` +- DestinationsResource.update_dashboard_transforms: `nexla_sdk/resources/destinations.py:279` +- DestinationsResource.update_quarantine_settings: `nexla_sdk/resources/destinations.py:259` +- DestinationsResource.update_runtime_status: `nexla_sdk/resources/destinations.py:66` +- DestinationsResource.validate_config: `nexla_sdk/resources/destinations.py:289` +- DocContainersResource: `nexla_sdk/resources/doc_containers.py:8` - DocContainersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- DocContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- DocContainersResource.copy: `nexla_sdk/resources/base_resource.py:321` -- DocContainersResource.create: `nexla_sdk/resources/base_resource.py:229` -- DocContainersResource.delete: `nexla_sdk/resources/base_resource.py:274` -- DocContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- DocContainersResource.get: `nexla_sdk/resources/base_resource.py:199` -- DocContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:15` -- DocContainersResource.list: `nexla_sdk/resources/base_resource.py:130` +- DocContainersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- DocContainersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- DocContainersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- DocContainersResource.copy: `nexla_sdk/resources/doc_containers.py:31` +- DocContainersResource.create: `nexla_sdk/resources/doc_containers.py:22` +- DocContainersResource.delete: `nexla_sdk/resources/doc_containers.py:28` +- DocContainersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- DocContainersResource.get: `nexla_sdk/resources/doc_containers.py:19` +- DocContainersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- DocContainersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:42` +- DocContainersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- DocContainersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- DocContainersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- DocContainersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- DocContainersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- DocContainersResource.list: `nexla_sdk/resources/doc_containers.py:16` +- DocContainersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- DocContainersResource.list_public: `nexla_sdk/resources/base_resource.py:339` - DocContainersResource.paginate: `nexla_sdk/resources/base_resource.py:181` - DocContainersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- DocContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- DocContainersResource.update: `nexla_sdk/resources/base_resource.py:252` +- DocContainersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- DocContainersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- DocContainersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- DocContainersResource.search: `nexla_sdk/resources/doc_containers.py:36` +- DocContainersResource.search_tags: `nexla_sdk/resources/doc_containers.py:39` +- DocContainersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- DocContainersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- DocContainersResource.update: `nexla_sdk/resources/doc_containers.py:25` +- FlowNodesResource: `nexla_sdk/resources/flow_nodes.py:7` +- FlowNodesResource.activate: `nexla_sdk/resources/base_resource.py:289` +- FlowNodesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- FlowNodesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- FlowNodesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- FlowNodesResource.copy: `nexla_sdk/resources/base_resource.py:321` +- FlowNodesResource.create: `nexla_sdk/resources/base_resource.py:229` +- FlowNodesResource.delete: `nexla_sdk/resources/base_resource.py:274` +- FlowNodesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- FlowNodesResource.get: `nexla_sdk/resources/flow_nodes.py:15` +- FlowNodesResource.get_access_insights: `nexla_sdk/resources/flow_nodes.py:27` +- FlowNodesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- FlowNodesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- FlowNodesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- FlowNodesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- FlowNodesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- FlowNodesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- FlowNodesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- FlowNodesResource.list: `nexla_sdk/resources/base_resource.py:130` +- FlowNodesResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- FlowNodesResource.list_flows_minimal: `nexla_sdk/resources/flow_nodes.py:24` +- FlowNodesResource.list_origin_nodes_condensed: `nexla_sdk/resources/flow_nodes.py:21` +- FlowNodesResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- FlowNodesResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- FlowNodesResource.pause: `nexla_sdk/resources/base_resource.py:305` +- FlowNodesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- FlowNodesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- FlowNodesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- FlowNodesResource.search: `nexla_sdk/resources/base_resource.py:408` +- FlowNodesResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- FlowNodesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- FlowNodesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- FlowNodesResource.update: `nexla_sdk/resources/flow_nodes.py:18` +- FlowTriggersResource: `nexla_sdk/resources/flow_triggers.py:10` +- FlowTriggersResource.activate: `nexla_sdk/resources/flow_triggers.py:139` +- FlowTriggersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- FlowTriggersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- FlowTriggersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- FlowTriggersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- FlowTriggersResource.create: `nexla_sdk/resources/flow_triggers.py:111` +- FlowTriggersResource.delete: `nexla_sdk/resources/flow_triggers.py:128` +- FlowTriggersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- FlowTriggersResource.get: `nexla_sdk/resources/flow_triggers.py:99` +- FlowTriggersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- FlowTriggersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- FlowTriggersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- FlowTriggersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- FlowTriggersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- FlowTriggersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- FlowTriggersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- FlowTriggersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- FlowTriggersResource.list: `nexla_sdk/resources/flow_triggers.py:52` +- FlowTriggersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- FlowTriggersResource.list_all: `nexla_sdk/resources/flow_triggers.py:73` +- FlowTriggersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- FlowTriggersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- FlowTriggersResource.pause: `nexla_sdk/resources/flow_triggers.py:150` +- FlowTriggersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- FlowTriggersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- FlowTriggersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- FlowTriggersResource.search: `nexla_sdk/resources/base_resource.py:408` +- FlowTriggersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- FlowTriggersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- FlowTriggersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- FlowTriggersResource.update: `nexla_sdk/resources/flow_triggers.py:161` - FlowsResource: `nexla_sdk/resources/flows.py:21` +- FlowsResource.accessors_by_resource: `nexla_sdk/resources/flows.py:395` - FlowsResource.activate: `nexla_sdk/resources/flows.py:117` - FlowsResource.activate_by_resource: `nexla_sdk/resources/flows.py:314` -- FlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- FlowsResource.active_flows_metrics: `nexla_sdk/resources/flows.py:527` +- FlowsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- FlowsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- FlowsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- FlowsResource.bulk_assign_project: `nexla_sdk/resources/flows.py:512` - FlowsResource.copy: `nexla_sdk/resources/flows.py:171` - FlowsResource.copy_and_replace_credentials: `nexla_sdk/resources/flows.py:186` +- FlowsResource.copy_by_resource: `nexla_sdk/resources/flows.py:385` - FlowsResource.create: `nexla_sdk/resources/base_resource.py:229` +- FlowsResource.create_linked_flows: `nexla_sdk/resources/flows.py:453` +- FlowsResource.daily_metrics: `nexla_sdk/resources/flows.py:521` - FlowsResource.delete: `nexla_sdk/resources/flows.py:282` -- FlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- FlowsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- FlowsResource.delete_all_linked_flows: `nexla_sdk/resources/flows.py:471` - FlowsResource.delete_by_resource: `nexla_sdk/resources/flows.py:294` -- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:378` +- FlowsResource.delete_linked_flows: `nexla_sdk/resources/flows.py:465` +- FlowsResource.docs_by_resource: `nexla_sdk/resources/flows.py:407` +- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:535` +- FlowsResource.flow_logs: `nexla_sdk/resources/flows.py:435` +- FlowsResource.flow_logs_v2: `nexla_sdk/resources/flows.py:439` +- FlowsResource.flow_metrics: `nexla_sdk/resources/flows.py:445` - FlowsResource.get: `nexla_sdk/resources/flows.py:67` -- FlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:475` -- FlowsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- FlowsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- FlowsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:632` +- FlowsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` - FlowsResource.get_by_resource: `nexla_sdk/resources/flows.py:90` -- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:397` -- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:529` -- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:581` -- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:499` +- FlowsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- FlowsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:554` +- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:686` +- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:738` +- FlowsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- FlowsResource.get_resources_access: `nexla_sdk/resources/flows.py:532` +- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:656` +- FlowsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- FlowsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- FlowsResource.import_flow: `nexla_sdk/resources/flows.py:515` +- FlowsResource.insert_flow_node: `nexla_sdk/resources/flows.py:475` - FlowsResource.list: `nexla_sdk/resources/flows.py:29` +- FlowsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- FlowsResource.list_linked_flows: `nexla_sdk/resources/flows.py:449` +- FlowsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - FlowsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - FlowsResource.pause: `nexla_sdk/resources/flows.py:140` - FlowsResource.pause_by_resource: `nexla_sdk/resources/flows.py:346` -- FlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:438` +- FlowsResource.publish_rag: `nexla_sdk/resources/flows.py:489` +- FlowsResource.publish_raw: `nexla_sdk/resources/flows.py:518` +- FlowsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- FlowsResource.remove_flow_node: `nexla_sdk/resources/flows.py:479` +- FlowsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- FlowsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- FlowsResource.restore_archival: `nexla_sdk/resources/flows.py:499` +- FlowsResource.run_now: `nexla_sdk/resources/flows.py:431` +- FlowsResource.run_profiles_activate: `nexla_sdk/resources/flows.py:425` +- FlowsResource.run_status: `nexla_sdk/resources/flows.py:503` +- FlowsResource.run_status_by_resource: `nexla_sdk/resources/flows.py:419` +- FlowsResource.search: `nexla_sdk/resources/flows.py:509` +- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:595` +- FlowsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- FlowsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- FlowsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- FlowsResource.total_metrics: `nexla_sdk/resources/flows.py:524` - FlowsResource.update: `nexla_sdk/resources/base_resource.py:252` +- FlowsResource.update_archival_status: `nexla_sdk/resources/flows.py:493` +- FlowsResource.update_by_resource: `nexla_sdk/resources/flows.py:378` +- FlowsResource.update_linked_flows: `nexla_sdk/resources/flows.py:459` +- FlowsResource.update_samples: `nexla_sdk/resources/flows.py:485` - GenAIResource: `nexla_sdk/resources/genai.py:16` - GenAIResource.activate: `nexla_sdk/resources/base_resource.py:289` -- GenAIResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- GenAIResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- GenAIResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- GenAIResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - GenAIResource.copy: `nexla_sdk/resources/base_resource.py:321` - GenAIResource.create: `nexla_sdk/resources/base_resource.py:229` - GenAIResource.create_config: `nexla_sdk/resources/genai.py:29` - GenAIResource.create_org_setting: `nexla_sdk/resources/genai.py:66` - GenAIResource.delete: `nexla_sdk/resources/base_resource.py:274` -- GenAIResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- GenAIResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - GenAIResource.delete_config: `nexla_sdk/resources/genai.py:49` -- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:77` +- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:86` +- GenAIResource.delete_org_settings: `nexla_sdk/resources/genai.py:91` - GenAIResource.get: `nexla_sdk/resources/base_resource.py:199` -- GenAIResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- GenAIResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- GenAIResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- GenAIResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- GenAIResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` - GenAIResource.get_config: `nexla_sdk/resources/genai.py:34` +- GenAIResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- GenAIResource.get_docs: `nexla_sdk/resources/base_resource.py:438` - GenAIResource.get_org_setting: `nexla_sdk/resources/genai.py:71` +- GenAIResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- GenAIResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- GenAIResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - GenAIResource.list: `nexla_sdk/resources/base_resource.py:130` +- GenAIResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - GenAIResource.list_configs: `nexla_sdk/resources/genai.py:25` - GenAIResource.list_org_settings: `nexla_sdk/resources/genai.py:55` +- GenAIResource.list_public: `nexla_sdk/resources/base_resource.py:339` - GenAIResource.paginate: `nexla_sdk/resources/base_resource.py:181` - GenAIResource.pause: `nexla_sdk/resources/base_resource.py:305` -- GenAIResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:82` +- GenAIResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- GenAIResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- GenAIResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- GenAIResource.search: `nexla_sdk/resources/base_resource.py:408` +- GenAIResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- GenAIResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- GenAIResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:94` - GenAIResource.update: `nexla_sdk/resources/base_resource.py:252` - GenAIResource.update_config: `nexla_sdk/resources/genai.py:40` +- GenAIResource.update_org_setting: `nexla_sdk/resources/genai.py:77` - LookupsResource: `nexla_sdk/resources/lookups.py:14` - LookupsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- LookupsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- LookupsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- LookupsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- LookupsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - LookupsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- LookupsResource.create: `nexla_sdk/resources/lookups.py:56` -- LookupsResource.delete: `nexla_sdk/resources/lookups.py:84` -- LookupsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:137` -- LookupsResource.get: `nexla_sdk/resources/lookups.py:40` -- LookupsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- LookupsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:116` +- LookupsResource.create: `nexla_sdk/resources/lookups.py:63` +- LookupsResource.delete: `nexla_sdk/resources/lookups.py:91` +- LookupsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:165` +- LookupsResource.delete_entries_by_body: `nexla_sdk/resources/lookups.py:186` +- LookupsResource.download_map: `nexla_sdk/resources/lookups.py:113` +- LookupsResource.get: `nexla_sdk/resources/lookups.py:47` +- LookupsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- LookupsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- LookupsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- LookupsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- LookupsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:138` +- LookupsResource.get_entries_by_body: `nexla_sdk/resources/lookups.py:159` +- LookupsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- LookupsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- LookupsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - LookupsResource.list: `nexla_sdk/resources/lookups.py:22` +- LookupsResource.list_accessible: `nexla_sdk/resources/lookups.py:44` +- LookupsResource.list_public: `nexla_sdk/resources/lookups.py:40` - LookupsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - LookupsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- LookupsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- LookupsResource.update: `nexla_sdk/resources/lookups.py:71` -- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:96` +- LookupsResource.probe_sample: `nexla_sdk/resources/lookups.py:192` +- LookupsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- LookupsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- LookupsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- LookupsResource.search: `nexla_sdk/resources/lookups.py:103` +- LookupsResource.search_tags: `nexla_sdk/resources/lookups.py:106` +- LookupsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- LookupsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- LookupsResource.update: `nexla_sdk/resources/lookups.py:78` +- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:118` +- LookupsResource.validate: `nexla_sdk/resources/lookups.py:109` - MarketplaceResource: `nexla_sdk/resources/marketplace.py:16` - MarketplaceResource.activate: `nexla_sdk/resources/base_resource.py:289` -- MarketplaceResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:91` +- MarketplaceResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- MarketplaceResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:136` +- MarketplaceResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - MarketplaceResource.copy: `nexla_sdk/resources/base_resource.py:321` - MarketplaceResource.create: `nexla_sdk/resources/base_resource.py:229` - MarketplaceResource.create_domain: `nexla_sdk/resources/marketplace.py:53` -- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:66` +- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:71` - MarketplaceResource.create_domains: `nexla_sdk/resources/marketplace.py:29` - MarketplaceResource.delete: `nexla_sdk/resources/base_resource.py:274` -- MarketplaceResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- MarketplaceResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - MarketplaceResource.delete_domain: `nexla_sdk/resources/marketplace.py:58` +- MarketplaceResource.delist_domain_item: `nexla_sdk/resources/marketplace.py:94` - MarketplaceResource.get: `nexla_sdk/resources/base_resource.py:199` -- MarketplaceResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- MarketplaceResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- MarketplaceResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- MarketplaceResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- MarketplaceResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- MarketplaceResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- MarketplaceResource.get_docs: `nexla_sdk/resources/base_resource.py:438` - MarketplaceResource.get_domain: `nexla_sdk/resources/marketplace.py:40` +- MarketplaceResource.get_domain_audit_log: `nexla_sdk/resources/marketplace.py:61` +- MarketplaceResource.get_domain_item: `nexla_sdk/resources/marketplace.py:80` - MarketplaceResource.get_domains_for_org: `nexla_sdk/resources/marketplace.py:34` +- MarketplaceResource.get_item: `nexla_sdk/resources/marketplace.py:110` +- MarketplaceResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- MarketplaceResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- MarketplaceResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - MarketplaceResource.list: `nexla_sdk/resources/base_resource.py:130` -- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:76` -- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:62` +- MarketplaceResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:121` +- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:67` - MarketplaceResource.list_domains: `nexla_sdk/resources/marketplace.py:25` +- MarketplaceResource.list_items: `nexla_sdk/resources/marketplace.py:106` +- MarketplaceResource.list_public: `nexla_sdk/resources/base_resource.py:339` - MarketplaceResource.paginate: `nexla_sdk/resources/base_resource.py:181` - MarketplaceResource.pause: `nexla_sdk/resources/base_resource.py:305` -- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:100` -- MarketplaceResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- MarketplaceResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:145` +- MarketplaceResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- MarketplaceResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- MarketplaceResource.request_item_access: `nexla_sdk/resources/marketplace.py:99` +- MarketplaceResource.search: `nexla_sdk/resources/base_resource.py:408` +- MarketplaceResource.search_domain_items: `nexla_sdk/resources/marketplace.py:86` +- MarketplaceResource.search_items: `nexla_sdk/resources/marketplace.py:114` +- MarketplaceResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- MarketplaceResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- MarketplaceResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - MarketplaceResource.update: `nexla_sdk/resources/base_resource.py:252` - MarketplaceResource.update_domain: `nexla_sdk/resources/marketplace.py:44` -- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:82` +- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:127` - MetricsResource: `nexla_sdk/resources/metrics.py:26` - MetricsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- MetricsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- MetricsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- MetricsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- MetricsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - MetricsResource.copy: `nexla_sdk/resources/base_resource.py:321` - MetricsResource.create: `nexla_sdk/resources/base_resource.py:229` - MetricsResource.delete: `nexla_sdk/resources/base_resource.py:274` -- MetricsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- MetricsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - MetricsResource.get: `nexla_sdk/resources/base_resource.py:199` -- MetricsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- MetricsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:216` -- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:162` -- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:148` +- MetricsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- MetricsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- MetricsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- MetricsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- MetricsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:220` +- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:166` +- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:152` - MetricsResource.get_rate_limits: `nexla_sdk/resources/metrics.py:111` +- MetricsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` - MetricsResource.get_resource_daily_metrics: `nexla_sdk/resources/metrics.py:39` -- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:121` +- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:125` - MetricsResource.get_resource_metrics_by_run: `nexla_sdk/resources/metrics.py:70` +- MetricsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- MetricsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - MetricsResource.list: `nexla_sdk/resources/base_resource.py:130` +- MetricsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- MetricsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - MetricsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - MetricsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- MetricsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- MetricsResource.publish_raw: `nexla_sdk/resources/metrics.py:121` +- MetricsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- MetricsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- MetricsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- MetricsResource.search: `nexla_sdk/resources/base_resource.py:408` +- MetricsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- MetricsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- MetricsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - MetricsResource.update: `nexla_sdk/resources/base_resource.py:252` -- NexsetsResource: `nexla_sdk/resources/nexsets.py:12` -- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:94` -- NexsetsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:147` -- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:54` -- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:82` -- NexsetsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:161` -- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:38` -- NexsetsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- NexsetsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:118` -- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:20` +- NexsetsResource: `nexla_sdk/resources/nexsets.py:14` +- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:146` +- NexsetsResource.activate_api_key: `nexla_sdk/resources/nexsets.py:430` +- NexsetsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NexsetsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NexsetsResource.add_samples: `nexla_sdk/resources/nexsets.py:209` +- NexsetsResource.add_sharers: `nexla_sdk/resources/nexsets.py:321` +- NexsetsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- NexsetsResource.bulk_update_catalog_refs: `nexla_sdk/resources/nexsets.py:399` +- NexsetsResource.catalog_add: `nexla_sdk/resources/nexsets.py:261` +- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:216` +- NexsetsResource.copy_docs: `nexla_sdk/resources/nexsets.py:536` +- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:106` +- NexsetsResource.create_api_key: `nexla_sdk/resources/nexsets.py:416` +- NexsetsResource.create_catalog_ref: `nexla_sdk/resources/nexsets.py:385` +- NexsetsResource.create_dashboard_transforms: `nexla_sdk/resources/nexsets.py:297` +- NexsetsResource.create_quarantine_settings: `nexla_sdk/resources/nexsets.py:277` +- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:134` +- NexsetsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NexsetsResource.delete_api_key: `nexla_sdk/resources/nexsets.py:442` +- NexsetsResource.delete_catalog_ref: `nexla_sdk/resources/nexsets.py:395` +- NexsetsResource.delete_dashboard_transforms: `nexla_sdk/resources/nexsets.py:309` +- NexsetsResource.delete_quarantine_settings: `nexla_sdk/resources/nexsets.py:289` +- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:456` +- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:90` +- NexsetsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NexsetsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NexsetsResource.get_api_key: `nexla_sdk/resources/nexsets.py:412` +- NexsetsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NexsetsResource.get_catalog_ref: `nexla_sdk/resources/nexsets.py:380` +- NexsetsResource.get_characteristics: `nexla_sdk/resources/nexsets.py:353` +- NexsetsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NexsetsResource.get_dashboard_transforms: `nexla_sdk/resources/nexsets.py:293` +- NexsetsResource.get_data_update_time: `nexla_sdk/resources/nexsets.py:349` +- NexsetsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NexsetsResource.get_flow: `nexla_sdk/resources/nexsets.py:234` +- NexsetsResource.get_flow_dashboard: `nexla_sdk/resources/nexsets.py:237` +- NexsetsResource.get_flow_logs: `nexla_sdk/resources/nexsets.py:249` +- NexsetsResource.get_flow_metrics: `nexla_sdk/resources/nexsets.py:245` +- NexsetsResource.get_flow_status_metrics: `nexla_sdk/resources/nexsets.py:241` +- NexsetsResource.get_metrics: `nexla_sdk/resources/nexsets.py:253` +- NexsetsResource.get_offset: `nexla_sdk/resources/nexsets.py:345` +- NexsetsResource.get_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:452` +- NexsetsResource.get_quarantine_offset: `nexla_sdk/resources/nexsets.py:341` +- NexsetsResource.get_quarantine_settings: `nexla_sdk/resources/nexsets.py:273` +- NexsetsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:170` +- NexsetsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NexsetsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:22` +- NexsetsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NexsetsResource.list_all: `nexla_sdk/resources/nexsets.py:40` +- NexsetsResource.list_all_condensed: `nexla_sdk/resources/nexsets.py:44` +- NexsetsResource.list_all_ids: `nexla_sdk/resources/nexsets.py:47` +- NexsetsResource.list_api_keys: `nexla_sdk/resources/nexsets.py:402` +- NexsetsResource.list_available: `nexla_sdk/resources/nexsets.py:50` +- NexsetsResource.list_catalog_refs: `nexla_sdk/resources/nexsets.py:375` +- NexsetsResource.list_characteristics_search: `nexla_sdk/resources/nexsets.py:72` +- NexsetsResource.list_docs: `nexla_sdk/resources/nexsets.py:461` +- NexsetsResource.list_nexset_api_compatible: `nexla_sdk/resources/nexsets.py:80` +- NexsetsResource.list_public: `nexla_sdk/resources/nexsets.py:63` +- NexsetsResource.list_shared: `nexla_sdk/resources/nexsets.py:59` +- NexsetsResource.list_sharers: `nexla_sdk/resources/nexsets.py:313` +- NexsetsResource.list_summary: `nexla_sdk/resources/nexsets.py:77` +- NexsetsResource.mark_shared: `nexla_sdk/resources/nexsets.py:331` - NexsetsResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:106` -- NexsetsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:69` +- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:158` +- NexsetsResource.pause_all_api_keys: `nexla_sdk/resources/nexsets.py:438` +- NexsetsResource.pause_api_key: `nexla_sdk/resources/nexsets.py:434` +- NexsetsResource.probe_quarantine_sample: `nexla_sdk/resources/nexsets.py:335` +- NexsetsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NexsetsResource.remove_sharers: `nexla_sdk/resources/nexsets.py:325` +- NexsetsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NexsetsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NexsetsResource.rotate_api_key: `nexla_sdk/resources/nexsets.py:426` +- NexsetsResource.search: `nexla_sdk/resources/nexsets.py:361` +- NexsetsResource.search_api_keys: `nexla_sdk/resources/nexsets.py:406` +- NexsetsResource.search_available: `nexla_sdk/resources/nexsets.py:54` +- NexsetsResource.search_public_tags: `nexla_sdk/resources/nexsets.py:67` +- NexsetsResource.search_tags: `nexla_sdk/resources/nexsets.py:364` +- NexsetsResource.semantic_schemas: `nexla_sdk/resources/nexsets.py:265` +- NexsetsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NexsetsResource.set_sharers: `nexla_sdk/resources/nexsets.py:317` +- NexsetsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- NexsetsResource.summary: `nexla_sdk/resources/nexsets.py:357` +- NexsetsResource.sync_with_catalog: `nexla_sdk/resources/nexsets.py:230` +- NexsetsResource.transform: `nexla_sdk/resources/nexsets.py:269` +- NexsetsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:446` +- NexsetsResource.unvote: `nexla_sdk/resources/nexsets.py:371` +- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:121` +- NexsetsResource.update_api_key: `nexla_sdk/resources/nexsets.py:420` +- NexsetsResource.update_catalog_ref: `nexla_sdk/resources/nexsets.py:390` +- NexsetsResource.update_dashboard_transforms: `nexla_sdk/resources/nexsets.py:303` +- NexsetsResource.update_docs: `nexla_sdk/resources/nexsets.py:491` +- NexsetsResource.update_quarantine_settings: `nexla_sdk/resources/nexsets.py:283` +- NexsetsResource.update_runtime_status: `nexla_sdk/resources/nexsets.py:86` +- NexsetsResource.update_samples: `nexla_sdk/resources/nexsets.py:199` +- NexsetsResource.vote: `nexla_sdk/resources/nexsets.py:367` +- NotificationChannelSettingsResource: `nexla_sdk/resources/notification_channel_settings.py:13` +- NotificationChannelSettingsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- NotificationChannelSettingsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NotificationChannelSettingsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NotificationChannelSettingsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- NotificationChannelSettingsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- NotificationChannelSettingsResource.create: `nexla_sdk/resources/notification_channel_settings.py:27` +- NotificationChannelSettingsResource.delete: `nexla_sdk/resources/notification_channel_settings.py:39` +- NotificationChannelSettingsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NotificationChannelSettingsResource.get: `nexla_sdk/resources/notification_channel_settings.py:24` +- NotificationChannelSettingsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NotificationChannelSettingsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NotificationChannelSettingsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NotificationChannelSettingsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NotificationChannelSettingsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NotificationChannelSettingsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NotificationChannelSettingsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NotificationChannelSettingsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- NotificationChannelSettingsResource.list: `nexla_sdk/resources/notification_channel_settings.py:21` +- NotificationChannelSettingsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NotificationChannelSettingsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- NotificationChannelSettingsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- NotificationChannelSettingsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- NotificationChannelSettingsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NotificationChannelSettingsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NotificationChannelSettingsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NotificationChannelSettingsResource.search: `nexla_sdk/resources/base_resource.py:408` +- NotificationChannelSettingsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- NotificationChannelSettingsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NotificationChannelSettingsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- NotificationChannelSettingsResource.update: `nexla_sdk/resources/notification_channel_settings.py:32` +- NotificationSettingsResource: `nexla_sdk/resources/notification_settings.py:13` +- NotificationSettingsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- NotificationSettingsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NotificationSettingsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NotificationSettingsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- NotificationSettingsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- NotificationSettingsResource.create: `nexla_sdk/resources/notification_settings.py:137` +- NotificationSettingsResource.delete: `nexla_sdk/resources/notification_settings.py:166` +- NotificationSettingsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NotificationSettingsResource.get: `nexla_sdk/resources/notification_settings.py:125` +- NotificationSettingsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NotificationSettingsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NotificationSettingsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NotificationSettingsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NotificationSettingsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NotificationSettingsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NotificationSettingsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NotificationSettingsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- NotificationSettingsResource.list: `nexla_sdk/resources/notification_settings.py:49` +- NotificationSettingsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NotificationSettingsResource.list_all: `nexla_sdk/resources/notification_settings.py:90` +- NotificationSettingsResource.list_by: `nexla_sdk/resources/notification_settings.py:247` +- NotificationSettingsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- NotificationSettingsResource.org_create: `nexla_sdk/resources/notification_settings.py:288` +- NotificationSettingsResource.org_delete: `nexla_sdk/resources/notification_settings.py:326` +- NotificationSettingsResource.org_index: `nexla_sdk/resources/notification_settings.py:254` +- NotificationSettingsResource.org_update: `nexla_sdk/resources/notification_settings.py:305` +- NotificationSettingsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- NotificationSettingsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- NotificationSettingsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NotificationSettingsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NotificationSettingsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NotificationSettingsResource.search: `nexla_sdk/resources/base_resource.py:408` +- NotificationSettingsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- NotificationSettingsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NotificationSettingsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- NotificationSettingsResource.show_resource_settings: `nexla_sdk/resources/notification_settings.py:177` +- NotificationSettingsResource.show_type_settings: `nexla_sdk/resources/notification_settings.py:213` +- NotificationSettingsResource.update: `nexla_sdk/resources/notification_settings.py:150` +- NotificationTypesResource: `nexla_sdk/resources/notification_types.py:7` +- NotificationTypesResource.activate: `nexla_sdk/resources/base_resource.py:289` +- NotificationTypesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NotificationTypesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NotificationTypesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- NotificationTypesResource.copy: `nexla_sdk/resources/base_resource.py:321` +- NotificationTypesResource.create: `nexla_sdk/resources/base_resource.py:229` +- NotificationTypesResource.delete: `nexla_sdk/resources/base_resource.py:274` +- NotificationTypesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NotificationTypesResource.get: `nexla_sdk/resources/base_resource.py:199` +- NotificationTypesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NotificationTypesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NotificationTypesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NotificationTypesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NotificationTypesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NotificationTypesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NotificationTypesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NotificationTypesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- NotificationTypesResource.list: `nexla_sdk/resources/notification_types.py:15` +- NotificationTypesResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NotificationTypesResource.list_all: `nexla_sdk/resources/notification_types.py:19` +- NotificationTypesResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- NotificationTypesResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- NotificationTypesResource.pause: `nexla_sdk/resources/base_resource.py:305` +- NotificationTypesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NotificationTypesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NotificationTypesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NotificationTypesResource.search: `nexla_sdk/resources/base_resource.py:408` +- NotificationTypesResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- NotificationTypesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NotificationTypesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- NotificationTypesResource.update: `nexla_sdk/resources/base_resource.py:252` - NotificationsResource: `nexla_sdk/resources/notifications.py:19` - NotificationsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- NotificationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- NotificationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- NotificationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- NotificationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - NotificationsResource.copy: `nexla_sdk/resources/base_resource.py:321` - NotificationsResource.create: `nexla_sdk/resources/base_resource.py:229` -- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:195` -- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:285` +- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:221` +- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:311` - NotificationsResource.delete: `nexla_sdk/resources/notifications.py:40` -- NotificationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:90` -- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:242` -- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:330` +- NotificationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:96` +- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:268` +- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:356` - NotificationsResource.get: `nexla_sdk/resources/notifications.py:27` -- NotificationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- NotificationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:211` -- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:100` -- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:361` -- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:299` -- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:343` -- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:167` -- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:152` +- NotificationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- NotificationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- NotificationsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:237` +- NotificationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:111` +- NotificationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- NotificationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:387` +- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:325` +- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:369` +- NotificationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:193` +- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:178` +- NotificationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - NotificationsResource.list: `nexla_sdk/resources/notifications.py:52` -- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:184` -- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:256` -- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:115` -- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:133` +- NotificationsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:210` +- NotificationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:282` +- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:126` +- NotificationsResource.mark_read_for: `nexla_sdk/resources/notifications.py:162` +- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:144` +- NotificationsResource.mark_unread_for: `nexla_sdk/resources/notifications.py:168` - NotificationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - NotificationsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- NotificationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- NotificationsResource.publish_raw: `nexla_sdk/resources/notifications.py:174` +- NotificationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- NotificationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- NotificationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- NotificationsResource.search: `nexla_sdk/resources/base_resource.py:408` +- NotificationsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- NotificationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- NotificationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - NotificationsResource.update: `nexla_sdk/resources/base_resource.py:252` -- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:225` -- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:313` +- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:251` +- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:339` - OrgAuthConfigsResource: `nexla_sdk/resources/org_auth_configs.py:8` - OrgAuthConfigsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- OrgAuthConfigsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- OrgAuthConfigsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- OrgAuthConfigsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- OrgAuthConfigsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- OrgAuthConfigsResource.client_config: `nexla_sdk/resources/org_auth_configs.py:30` - OrgAuthConfigsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:31` -- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:45` -- OrgAuthConfigsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:26` -- OrgAuthConfigsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- OrgAuthConfigsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:43` +- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:57` +- OrgAuthConfigsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:38` +- OrgAuthConfigsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- OrgAuthConfigsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- OrgAuthConfigsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- OrgAuthConfigsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- OrgAuthConfigsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- OrgAuthConfigsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- OrgAuthConfigsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- OrgAuthConfigsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- OrgAuthConfigsResource.info: `nexla_sdk/resources/org_auth_configs.py:34` - OrgAuthConfigsResource.list: `nexla_sdk/resources/org_auth_configs.py:16` +- OrgAuthConfigsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - OrgAuthConfigsResource.list_all: `nexla_sdk/resources/org_auth_configs.py:21` +- OrgAuthConfigsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- OrgAuthConfigsResource.list_sign_on_options: `nexla_sdk/resources/org_auth_configs.py:26` - OrgAuthConfigsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - OrgAuthConfigsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- OrgAuthConfigsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:37` +- OrgAuthConfigsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- OrgAuthConfigsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- OrgAuthConfigsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- OrgAuthConfigsResource.search: `nexla_sdk/resources/base_resource.py:408` +- OrgAuthConfigsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- OrgAuthConfigsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- OrgAuthConfigsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:49` +- OrgTiersResource: `nexla_sdk/resources/org_tiers.py:7` +- OrgTiersResource.activate: `nexla_sdk/resources/base_resource.py:289` +- OrgTiersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- OrgTiersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- OrgTiersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- OrgTiersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- OrgTiersResource.create: `nexla_sdk/resources/org_tiers.py:21` +- OrgTiersResource.delete: `nexla_sdk/resources/org_tiers.py:27` +- OrgTiersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- OrgTiersResource.get: `nexla_sdk/resources/org_tiers.py:18` +- OrgTiersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- OrgTiersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- OrgTiersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- OrgTiersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- OrgTiersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- OrgTiersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- OrgTiersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- OrgTiersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- OrgTiersResource.list: `nexla_sdk/resources/org_tiers.py:15` +- OrgTiersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- OrgTiersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- OrgTiersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- OrgTiersResource.pause: `nexla_sdk/resources/base_resource.py:305` +- OrgTiersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- OrgTiersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- OrgTiersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- OrgTiersResource.search: `nexla_sdk/resources/base_resource.py:408` +- OrgTiersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- OrgTiersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- OrgTiersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- OrgTiersResource.update: `nexla_sdk/resources/org_tiers.py:24` - OrganizationsResource: `nexla_sdk/resources/organizations.py:22` - OrganizationsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:173` -- OrganizationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:365` +- OrganizationsResource.activate_cluster: `nexla_sdk/resources/organizations.py:273` +- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:190` +- OrganizationsResource.activate_org: `nexla_sdk/resources/organizations.py:245` +- OrganizationsResource.activate_rate_limited_sources: `nexla_sdk/resources/organizations.py:236` +- OrganizationsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:501` +- OrganizationsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- OrganizationsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - OrganizationsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:61` -- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:156` -- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:86` -- OrganizationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:142` -- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:48` -- OrganizationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:190` -- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:227` -- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:316` -- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:204` -- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:348` -- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:269` -- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:98` -- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:215` -- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:294` +- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:65` +- OrganizationsResource.create_dashboard_transforms: `nexla_sdk/resources/organizations.py:335` +- OrganizationsResource.create_notification_settings: `nexla_sdk/resources/organizations.py:285` +- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:173` +- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:90` +- OrganizationsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- OrganizationsResource.delete_dashboard_transforms: `nexla_sdk/resources/organizations.py:347` +- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:159` +- OrganizationsResource.delete_notification_settings: `nexla_sdk/resources/organizations.py:297` +- OrganizationsResource.disable_feature: `nexla_sdk/resources/organizations.py:315` +- OrganizationsResource.enable_feature: `nexla_sdk/resources/organizations.py:311` +- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:52` +- OrganizationsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- OrganizationsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- OrganizationsResource.get_account_rate_limited: `nexla_sdk/resources/organizations.py:232` +- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:207` +- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:363` +- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:452` +- OrganizationsResource.get_clusters: `nexla_sdk/resources/organizations.py:265` +- OrganizationsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:221` +- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:484` +- OrganizationsResource.get_dashboard_transforms: `nexla_sdk/resources/organizations.py:331` +- OrganizationsResource.get_data_sets_catalog_config: `nexla_sdk/resources/organizations.py:307` +- OrganizationsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:405` +- OrganizationsResource.get_flows_account_metrics: `nexla_sdk/resources/organizations.py:359` +- OrganizationsResource.get_flows_dashboard: `nexla_sdk/resources/organizations.py:351` +- OrganizationsResource.get_flows_report: `nexla_sdk/resources/organizations.py:261` +- OrganizationsResource.get_flows_status_metrics: `nexla_sdk/resources/organizations.py:355` +- OrganizationsResource.get_login_history: `nexla_sdk/resources/organizations.py:102` +- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:115` +- OrganizationsResource.get_metrics: `nexla_sdk/resources/organizations.py:107` +- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:319` +- OrganizationsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:430` +- OrganizationsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- OrganizationsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - OrganizationsResource.list: `nexla_sdk/resources/organizations.py:30` +- OrganizationsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- OrganizationsResource.list_all: `nexla_sdk/resources/organizations.py:48` +- OrganizationsResource.list_data_sets_catalog_configs: `nexla_sdk/resources/organizations.py:303` +- OrganizationsResource.list_notification_settings: `nexla_sdk/resources/organizations.py:281` +- OrganizationsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - OrganizationsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - OrganizationsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:375` -- OrganizationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:127` -- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:73` -- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:329` -- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:355` -- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:112` +- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:511` +- OrganizationsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- OrganizationsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- OrganizationsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:144` +- OrganizationsResource.revert_cluster: `nexla_sdk/resources/organizations.py:277` +- OrganizationsResource.search: `nexla_sdk/resources/base_resource.py:408` +- OrganizationsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- OrganizationsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- OrganizationsResource.set_rate_limits: `nexla_sdk/resources/organizations.py:253` +- OrganizationsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- OrganizationsResource.throttle: `nexla_sdk/resources/organizations.py:257` +- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:77` +- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:465` +- OrganizationsResource.update_cluster: `nexla_sdk/resources/organizations.py:269` +- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:491` +- OrganizationsResource.update_dashboard_transforms: `nexla_sdk/resources/organizations.py:341` +- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:129` +- OrganizationsResource.update_notification_settings: `nexla_sdk/resources/organizations.py:291` - ProjectsResource: `nexla_sdk/resources/projects.py:13` - ProjectsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- ProjectsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:170` -- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:113` -- ProjectsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ProjectsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:184` +- ProjectsResource.add_data_flows_legacy: `nexla_sdk/resources/projects.py:215` +- ProjectsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:127` +- ProjectsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ProjectsResource.copy: `nexla_sdk/resources/projects.py:99` - ProjectsResource.create: `nexla_sdk/resources/projects.py:59` - ProjectsResource.delete: `nexla_sdk/resources/projects.py:87` -- ProjectsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- ProjectsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - ProjectsResource.get: `nexla_sdk/resources/projects.py:43` -- ProjectsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- ProjectsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:99` +- ProjectsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ProjectsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ProjectsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ProjectsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ProjectsResource.get_data_flows_legacy: `nexla_sdk/resources/projects.py:194` +- ProjectsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:113` +- ProjectsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ProjectsResource.get_resources_access: `nexla_sdk/resources/projects.py:110` +- ProjectsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ProjectsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - ProjectsResource.list: `nexla_sdk/resources/projects.py:21` +- ProjectsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ProjectsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - ProjectsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - ProjectsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:190` -- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:151` -- ProjectsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:180` -- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:132` -- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:200` +- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:233` +- ProjectsResource.remove_data_flows_legacy: `nexla_sdk/resources/projects.py:243` +- ProjectsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:165` +- ProjectsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ProjectsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:205` +- ProjectsResource.replace_data_flows_legacy: `nexla_sdk/resources/projects.py:224` +- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:146` +- ProjectsResource.search: `nexla_sdk/resources/projects.py:104` +- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:252` +- ProjectsResource.search_tags: `nexla_sdk/resources/projects.py:107` +- ProjectsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ProjectsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - ProjectsResource.update: `nexla_sdk/resources/projects.py:74` +- QuarantineSettingsResource: `nexla_sdk/resources/quarantine_settings.py:7` +- QuarantineSettingsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- QuarantineSettingsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- QuarantineSettingsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- QuarantineSettingsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- QuarantineSettingsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- QuarantineSettingsResource.create: `nexla_sdk/resources/base_resource.py:229` +- QuarantineSettingsResource.delete: `nexla_sdk/resources/base_resource.py:274` +- QuarantineSettingsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- QuarantineSettingsResource.get: `nexla_sdk/resources/quarantine_settings.py:18` +- QuarantineSettingsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- QuarantineSettingsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- QuarantineSettingsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- QuarantineSettingsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- QuarantineSettingsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- QuarantineSettingsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- QuarantineSettingsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- QuarantineSettingsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- QuarantineSettingsResource.list: `nexla_sdk/resources/quarantine_settings.py:15` +- QuarantineSettingsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- QuarantineSettingsResource.list_all: `nexla_sdk/resources/quarantine_settings.py:21` +- QuarantineSettingsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- QuarantineSettingsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- QuarantineSettingsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- QuarantineSettingsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- QuarantineSettingsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- QuarantineSettingsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- QuarantineSettingsResource.search: `nexla_sdk/resources/base_resource.py:408` +- QuarantineSettingsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- QuarantineSettingsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- QuarantineSettingsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- QuarantineSettingsResource.update: `nexla_sdk/resources/base_resource.py:252` +- ResourceParametersResource: `nexla_sdk/resources/resource_parameters.py:11` +- ResourceParametersResource.activate: `nexla_sdk/resources/base_resource.py:289` +- ResourceParametersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ResourceParametersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ResourceParametersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ResourceParametersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ResourceParametersResource.create: `nexla_sdk/resources/resource_parameters.py:25` +- ResourceParametersResource.delete: `nexla_sdk/resources/resource_parameters.py:37` +- ResourceParametersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ResourceParametersResource.get: `nexla_sdk/resources/resource_parameters.py:22` +- ResourceParametersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ResourceParametersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ResourceParametersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ResourceParametersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ResourceParametersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ResourceParametersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ResourceParametersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ResourceParametersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ResourceParametersResource.list: `nexla_sdk/resources/resource_parameters.py:19` +- ResourceParametersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ResourceParametersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ResourceParametersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ResourceParametersResource.pause: `nexla_sdk/resources/base_resource.py:305` +- ResourceParametersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ResourceParametersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ResourceParametersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ResourceParametersResource.search: `nexla_sdk/resources/base_resource.py:408` +- ResourceParametersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ResourceParametersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ResourceParametersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ResourceParametersResource.update: `nexla_sdk/resources/resource_parameters.py:30` - RuntimesResource: `nexla_sdk/resources/runtimes.py:8` - RuntimesResource.activate: `nexla_sdk/resources/runtimes.py:45` -- RuntimesResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- RuntimesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- RuntimesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- RuntimesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - RuntimesResource.copy: `nexla_sdk/resources/base_resource.py:321` - RuntimesResource.create: `nexla_sdk/resources/runtimes.py:21` - RuntimesResource.delete: `nexla_sdk/resources/runtimes.py:40` -- RuntimesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- RuntimesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - RuntimesResource.get: `nexla_sdk/resources/runtimes.py:27` -- RuntimesResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- RuntimesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- RuntimesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- RuntimesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- RuntimesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- RuntimesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- RuntimesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- RuntimesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- RuntimesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- RuntimesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - RuntimesResource.list: `nexla_sdk/resources/runtimes.py:16` +- RuntimesResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- RuntimesResource.list_public: `nexla_sdk/resources/base_resource.py:339` - RuntimesResource.paginate: `nexla_sdk/resources/base_resource.py:181` - RuntimesResource.pause: `nexla_sdk/resources/runtimes.py:51` -- RuntimesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- RuntimesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- RuntimesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- RuntimesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- RuntimesResource.search: `nexla_sdk/resources/base_resource.py:408` +- RuntimesResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- RuntimesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- RuntimesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - RuntimesResource.update: `nexla_sdk/resources/runtimes.py:33` +- SearchHealthResource: `nexla_sdk/resources/search_health.py:6` +- SearchHealthResource.activate: `nexla_sdk/resources/base_resource.py:289` +- SearchHealthResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SearchHealthResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SearchHealthResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- SearchHealthResource.copy: `nexla_sdk/resources/base_resource.py:321` +- SearchHealthResource.create: `nexla_sdk/resources/base_resource.py:229` +- SearchHealthResource.delete: `nexla_sdk/resources/base_resource.py:274` +- SearchHealthResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SearchHealthResource.get: `nexla_sdk/resources/search_health.py:14` +- SearchHealthResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SearchHealthResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SearchHealthResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SearchHealthResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SearchHealthResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SearchHealthResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SearchHealthResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SearchHealthResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- SearchHealthResource.list: `nexla_sdk/resources/base_resource.py:130` +- SearchHealthResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- SearchHealthResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- SearchHealthResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- SearchHealthResource.pause: `nexla_sdk/resources/base_resource.py:305` +- SearchHealthResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SearchHealthResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SearchHealthResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SearchHealthResource.search: `nexla_sdk/resources/base_resource.py:408` +- SearchHealthResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- SearchHealthResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SearchHealthResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- SearchHealthResource.test: `nexla_sdk/resources/search_health.py:17` +- SearchHealthResource.update: `nexla_sdk/resources/base_resource.py:252` +- SelfSignupBlockedDomainsResource: `nexla_sdk/resources/self_signup_blocked_domains.py:6` +- SelfSignupBlockedDomainsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- SelfSignupBlockedDomainsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SelfSignupBlockedDomainsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SelfSignupBlockedDomainsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- SelfSignupBlockedDomainsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- SelfSignupBlockedDomainsResource.create: `nexla_sdk/resources/self_signup_blocked_domains.py:17` +- SelfSignupBlockedDomainsResource.delete: `nexla_sdk/resources/self_signup_blocked_domains.py:23` +- SelfSignupBlockedDomainsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SelfSignupBlockedDomainsResource.get: `nexla_sdk/resources/base_resource.py:199` +- SelfSignupBlockedDomainsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SelfSignupBlockedDomainsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SelfSignupBlockedDomainsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SelfSignupBlockedDomainsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SelfSignupBlockedDomainsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SelfSignupBlockedDomainsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SelfSignupBlockedDomainsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SelfSignupBlockedDomainsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- SelfSignupBlockedDomainsResource.list: `nexla_sdk/resources/self_signup_blocked_domains.py:14` +- SelfSignupBlockedDomainsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- SelfSignupBlockedDomainsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- SelfSignupBlockedDomainsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- SelfSignupBlockedDomainsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- SelfSignupBlockedDomainsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SelfSignupBlockedDomainsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SelfSignupBlockedDomainsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SelfSignupBlockedDomainsResource.search: `nexla_sdk/resources/base_resource.py:408` +- SelfSignupBlockedDomainsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- SelfSignupBlockedDomainsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SelfSignupBlockedDomainsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- SelfSignupBlockedDomainsResource.update: `nexla_sdk/resources/self_signup_blocked_domains.py:20` - SelfSignupResource: `nexla_sdk/resources/self_signup.py:7` - SelfSignupResource.activate: `nexla_sdk/resources/base_resource.py:289` -- SelfSignupResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:39` +- SelfSignupResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:40` +- SelfSignupResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SelfSignupResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - SelfSignupResource.approve_request: `nexla_sdk/resources/self_signup.py:29` - SelfSignupResource.copy: `nexla_sdk/resources/base_resource.py:321` - SelfSignupResource.create: `nexla_sdk/resources/base_resource.py:229` - SelfSignupResource.delete: `nexla_sdk/resources/base_resource.py:274` -- SelfSignupResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:51` +- SelfSignupResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:52` - SelfSignupResource.get: `nexla_sdk/resources/base_resource.py:199` -- SelfSignupResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- SelfSignupResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- SelfSignupResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SelfSignupResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SelfSignupResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SelfSignupResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SelfSignupResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SelfSignupResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SelfSignupResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SelfSignupResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - SelfSignupResource.list: `nexla_sdk/resources/base_resource.py:130` -- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:35` +- SelfSignupResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:36` +- SelfSignupResource.list_public: `nexla_sdk/resources/base_resource.py:339` - SelfSignupResource.list_requests: `nexla_sdk/resources/self_signup.py:25` - SelfSignupResource.paginate: `nexla_sdk/resources/base_resource.py:181` - SelfSignupResource.pause: `nexla_sdk/resources/base_resource.py:305` -- SelfSignupResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- SelfSignupResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SelfSignupResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SelfSignupResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SelfSignupResource.search: `nexla_sdk/resources/base_resource.py:408` +- SelfSignupResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- SelfSignupResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SelfSignupResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - SelfSignupResource.signup: `nexla_sdk/resources/self_signup.py:16` - SelfSignupResource.update: `nexla_sdk/resources/base_resource.py:252` -- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:45` +- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:46` - SelfSignupResource.verify_email: `nexla_sdk/resources/self_signup.py:19` +- ServiceKeysResource: `nexla_sdk/resources/service_keys.py:10` +- ServiceKeysResource.activate: `nexla_sdk/resources/service_keys.py:151` +- ServiceKeysResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ServiceKeysResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ServiceKeysResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ServiceKeysResource.copy: `nexla_sdk/resources/base_resource.py:321` +- ServiceKeysResource.create: `nexla_sdk/resources/service_keys.py:92` +- ServiceKeysResource.delete: `nexla_sdk/resources/service_keys.py:120` +- ServiceKeysResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ServiceKeysResource.get: `nexla_sdk/resources/service_keys.py:79` +- ServiceKeysResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ServiceKeysResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ServiceKeysResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ServiceKeysResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ServiceKeysResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ServiceKeysResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ServiceKeysResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ServiceKeysResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ServiceKeysResource.list: `nexla_sdk/resources/service_keys.py:47` +- ServiceKeysResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ServiceKeysResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- ServiceKeysResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ServiceKeysResource.pause: `nexla_sdk/resources/service_keys.py:164` +- ServiceKeysResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ServiceKeysResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ServiceKeysResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ServiceKeysResource.rotate: `nexla_sdk/resources/service_keys.py:135` +- ServiceKeysResource.search: `nexla_sdk/resources/base_resource.py:408` +- ServiceKeysResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- ServiceKeysResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ServiceKeysResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ServiceKeysResource.update: `nexla_sdk/resources/service_keys.py:103` - SourcesResource: `nexla_sdk/resources/sources.py:12` -- SourcesResource.activate: `nexla_sdk/resources/sources.py:98` -- SourcesResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- SourcesResource.copy: `nexla_sdk/resources/sources.py:122` -- SourcesResource.create: `nexla_sdk/resources/sources.py:58` -- SourcesResource.delete: `nexla_sdk/resources/sources.py:86` -- SourcesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- SourcesResource.get: `nexla_sdk/resources/sources.py:42` -- SourcesResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- SourcesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- SourcesResource.activate: `nexla_sdk/resources/sources.py:171` +- SourcesResource.activate_api_key: `nexla_sdk/resources/sources.py:374` +- SourcesResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- SourcesResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- SourcesResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- SourcesResource.copy: `nexla_sdk/resources/sources.py:195` +- SourcesResource.create: `nexla_sdk/resources/sources.py:84` +- SourcesResource.create_api_key: `nexla_sdk/resources/sources.py:360` +- SourcesResource.create_dashboard_transforms: `nexla_sdk/resources/sources.py:287` +- SourcesResource.create_quarantine_settings: `nexla_sdk/resources/sources.py:267` +- SourcesResource.delete: `nexla_sdk/resources/sources.py:112` +- SourcesResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- SourcesResource.delete_api_key: `nexla_sdk/resources/sources.py:386` +- SourcesResource.delete_dashboard_transforms: `nexla_sdk/resources/sources.py:299` +- SourcesResource.delete_quarantine_settings: `nexla_sdk/resources/sources.py:279` +- SourcesResource.edit_flow_triggers: `nexla_sdk/resources/sources.py:329` +- SourcesResource.get: `nexla_sdk/resources/sources.py:68` +- SourcesResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- SourcesResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- SourcesResource.get_api_key: `nexla_sdk/resources/sources.py:356` +- SourcesResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- SourcesResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- SourcesResource.get_dashboard_transforms: `nexla_sdk/resources/sources.py:283` +- SourcesResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- SourcesResource.get_flow: `nexla_sdk/resources/sources.py:124` +- SourcesResource.get_flow_dashboard: `nexla_sdk/resources/sources.py:127` +- SourcesResource.get_flow_logs: `nexla_sdk/resources/sources.py:142` +- SourcesResource.get_flow_metrics: `nexla_sdk/resources/sources.py:137` +- SourcesResource.get_flow_status_metrics: `nexla_sdk/resources/sources.py:132` +- SourcesResource.get_metrics: `nexla_sdk/resources/sources.py:147` +- SourcesResource.get_offset: `nexla_sdk/resources/sources.py:163` +- SourcesResource.get_quarantine_aggregation: `nexla_sdk/resources/sources.py:396` +- SourcesResource.get_quarantine_offset: `nexla_sdk/resources/sources.py:155` +- SourcesResource.get_quarantine_settings: `nexla_sdk/resources/sources.py:263` +- SourcesResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- SourcesResource.get_reingested_files: `nexla_sdk/resources/sources.py:255` +- SourcesResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- SourcesResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - SourcesResource.list: `nexla_sdk/resources/sources.py:20` +- SourcesResource.list_accessible: `nexla_sdk/resources/sources.py:58` +- SourcesResource.list_all: `nexla_sdk/resources/sources.py:48` +- SourcesResource.list_all_condensed: `nexla_sdk/resources/sources.py:52` +- SourcesResource.list_all_ids: `nexla_sdk/resources/sources.py:55` +- SourcesResource.list_api_keys: `nexla_sdk/resources/sources.py:346` +- SourcesResource.list_data_sinks: `nexla_sdk/resources/sources.py:309` +- SourcesResource.list_flow_triggers: `nexla_sdk/resources/sources.py:325` +- SourcesResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- SourcesResource.list_runs: `nexla_sdk/resources/sources.py:321` - SourcesResource.paginate: `nexla_sdk/resources/base_resource.py:181` -- SourcesResource.pause: `nexla_sdk/resources/sources.py:110` -- SourcesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- SourcesResource.update: `nexla_sdk/resources/sources.py:73` -- TeamsResource: `nexla_sdk/resources/teams.py:8` +- SourcesResource.pause: `nexla_sdk/resources/sources.py:183` +- SourcesResource.pause_all_api_keys: `nexla_sdk/resources/sources.py:382` +- SourcesResource.pause_api_key: `nexla_sdk/resources/sources.py:378` +- SourcesResource.probe_authenticate: `nexla_sdk/resources/sources.py:219` +- SourcesResource.probe_detect_schemas: `nexla_sdk/resources/sources.py:239` +- SourcesResource.probe_list_buckets: `nexla_sdk/resources/sources.py:211` +- SourcesResource.probe_list_files: `nexla_sdk/resources/sources.py:223` +- SourcesResource.probe_quarantine_sample: `nexla_sdk/resources/sources.py:245` +- SourcesResource.probe_read_file: `nexla_sdk/resources/sources.py:233` +- SourcesResource.probe_sample: `nexla_sdk/resources/sources.py:251` +- SourcesResource.probe_summary: `nexla_sdk/resources/sources.py:215` +- SourcesResource.probe_tree: `nexla_sdk/resources/sources.py:229` +- SourcesResource.ready: `nexla_sdk/resources/sources.py:317` +- SourcesResource.reingest_files: `nexla_sdk/resources/sources.py:259` +- SourcesResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- SourcesResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- SourcesResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- SourcesResource.rotate_api_key: `nexla_sdk/resources/sources.py:370` +- SourcesResource.run_now: `nexla_sdk/resources/sources.py:313` +- SourcesResource.script_source_config: `nexla_sdk/resources/sources.py:61` +- SourcesResource.search: `nexla_sdk/resources/sources.py:42` +- SourcesResource.search_api_keys: `nexla_sdk/resources/sources.py:350` +- SourcesResource.search_tags: `nexla_sdk/resources/sources.py:45` +- SourcesResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- SourcesResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- SourcesResource.test_config: `nexla_sdk/resources/sources.py:306` +- SourcesResource.trigger_quarantine_aggregation: `nexla_sdk/resources/sources.py:390` +- SourcesResource.update: `nexla_sdk/resources/sources.py:99` +- SourcesResource.update_api_key: `nexla_sdk/resources/sources.py:364` +- SourcesResource.update_dashboard_transforms: `nexla_sdk/resources/sources.py:293` +- SourcesResource.update_quarantine_settings: `nexla_sdk/resources/sources.py:273` +- SourcesResource.update_runtime_status: `nexla_sdk/resources/sources.py:64` +- SourcesResource.validate_config: `nexla_sdk/resources/sources.py:303` +- TeamsResource: `nexla_sdk/resources/teams.py:9` - TeamsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- TeamsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` -- TeamsResource.add_members: `nexla_sdk/resources/teams.py:104` +- TeamsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- TeamsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- TeamsResource.add_members: `nexla_sdk/resources/teams.py:105` +- TeamsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - TeamsResource.copy: `nexla_sdk/resources/base_resource.py:321` -- TeamsResource.create: `nexla_sdk/resources/teams.py:50` -- TeamsResource.delete: `nexla_sdk/resources/teams.py:78` -- TeamsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- TeamsResource.get: `nexla_sdk/resources/teams.py:34` -- TeamsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- TeamsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` -- TeamsResource.get_members: `nexla_sdk/resources/teams.py:90` -- TeamsResource.list: `nexla_sdk/resources/teams.py:16` +- TeamsResource.create: `nexla_sdk/resources/teams.py:51` +- TeamsResource.delete: `nexla_sdk/resources/teams.py:79` +- TeamsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- TeamsResource.get: `nexla_sdk/resources/teams.py:35` +- TeamsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- TeamsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- TeamsResource.get_audit_log: `nexla_sdk/resources/teams.py:155` +- TeamsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- TeamsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- TeamsResource.get_members: `nexla_sdk/resources/teams.py:91` +- TeamsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- TeamsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- TeamsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- TeamsResource.list: `nexla_sdk/resources/teams.py:17` +- TeamsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- TeamsResource.list_public: `nexla_sdk/resources/base_resource.py:339` - TeamsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - TeamsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:136` -- TeamsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:119` -- TeamsResource.update: `nexla_sdk/resources/teams.py:65` +- TeamsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:137` +- TeamsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- TeamsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:120` +- TeamsResource.search: `nexla_sdk/resources/base_resource.py:408` +- TeamsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- TeamsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- TeamsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- TeamsResource.update: `nexla_sdk/resources/teams.py:66` +- TokensResource: `nexla_sdk/resources/tokens.py:6` +- TokensResource.activate: `nexla_sdk/resources/base_resource.py:289` +- TokensResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- TokensResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- TokensResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- TokensResource.aws_marketplace_token: `nexla_sdk/resources/tokens.py:39` +- TokensResource.copy: `nexla_sdk/resources/base_resource.py:321` +- TokensResource.create: `nexla_sdk/resources/base_resource.py:229` +- TokensResource.create_google_token: `nexla_sdk/resources/tokens.py:20` +- TokensResource.create_idp_token: `nexla_sdk/resources/tokens.py:29` +- TokensResource.create_token: `nexla_sdk/resources/tokens.py:14` +- TokensResource.delete: `nexla_sdk/resources/base_resource.py:274` +- TokensResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- TokensResource.get: `nexla_sdk/resources/base_resource.py:199` +- TokensResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- TokensResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- TokensResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- TokensResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- TokensResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- TokensResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- TokensResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- TokensResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- TokensResource.list: `nexla_sdk/resources/base_resource.py:130` +- TokensResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- TokensResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- TokensResource.logout: `nexla_sdk/resources/tokens.py:26` +- TokensResource.metadata: `nexla_sdk/resources/tokens.py:35` +- TokensResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- TokensResource.pause: `nexla_sdk/resources/base_resource.py:305` +- TokensResource.refresh_token: `nexla_sdk/resources/tokens.py:23` +- TokensResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- TokensResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- TokensResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- TokensResource.resource_authorize: `nexla_sdk/resources/tokens.py:42` +- TokensResource.search: `nexla_sdk/resources/base_resource.py:408` +- TokensResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- TokensResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- TokensResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- TokensResource.update: `nexla_sdk/resources/base_resource.py:252` +- TokensResource.update_token: `nexla_sdk/resources/tokens.py:17` - TransformsResource: `nexla_sdk/resources/transforms.py:8` - TransformsResource.activate: `nexla_sdk/resources/base_resource.py:289` -- TransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- TransformsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- TransformsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- TransformsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - TransformsResource.copy: `nexla_sdk/resources/transforms.py:50` - TransformsResource.create: `nexla_sdk/resources/transforms.py:38` - TransformsResource.delete: `nexla_sdk/resources/transforms.py:46` -- TransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- TransformsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - TransformsResource.get: `nexla_sdk/resources/transforms.py:34` -- TransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- TransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- TransformsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- TransformsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- TransformsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- TransformsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- TransformsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- TransformsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- TransformsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- TransformsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - TransformsResource.list: `nexla_sdk/resources/transforms.py:16` +- TransformsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` - TransformsResource.list_public: `nexla_sdk/resources/transforms.py:54` - TransformsResource.paginate: `nexla_sdk/resources/base_resource.py:181` - TransformsResource.pause: `nexla_sdk/resources/base_resource.py:305` -- TransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- TransformsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- TransformsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- TransformsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- TransformsResource.search: `nexla_sdk/resources/transforms.py:60` +- TransformsResource.search_tags: `nexla_sdk/resources/transforms.py:63` +- TransformsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- TransformsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- TransformsResource.transform: `nexla_sdk/resources/transforms.py:66` +- TransformsResource.transform_data: `nexla_sdk/resources/transforms.py:73` +- TransformsResource.transform_features: `nexla_sdk/resources/transforms.py:70` - TransformsResource.update: `nexla_sdk/resources/transforms.py:42` -- UsersResource: `nexla_sdk/resources/users.py:9` -- UsersResource.activate: `nexla_sdk/resources/base_resource.py:289` -- UsersResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- UserSettingsResource: `nexla_sdk/resources/user_settings.py:8` +- UserSettingsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- UserSettingsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- UserSettingsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- UserSettingsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- UserSettingsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- UserSettingsResource.create: `nexla_sdk/resources/user_settings.py:27` +- UserSettingsResource.delete: `nexla_sdk/resources/user_settings.py:37` +- UserSettingsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- UserSettingsResource.get: `nexla_sdk/resources/user_settings.py:24` +- UserSettingsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- UserSettingsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- UserSettingsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- UserSettingsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- UserSettingsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- UserSettingsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- UserSettingsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- UserSettingsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- UserSettingsResource.list: `nexla_sdk/resources/user_settings.py:16` +- UserSettingsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- UserSettingsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- UserSettingsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- UserSettingsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- UserSettingsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- UserSettingsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- UserSettingsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- UserSettingsResource.search: `nexla_sdk/resources/user_settings.py:19` +- UserSettingsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- UserSettingsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- UserSettingsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- UserSettingsResource.update: `nexla_sdk/resources/user_settings.py:30` +- UserTiersResource: `nexla_sdk/resources/user_tiers.py:7` +- UserTiersResource.activate: `nexla_sdk/resources/base_resource.py:289` +- UserTiersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- UserTiersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- UserTiersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- UserTiersResource.copy: `nexla_sdk/resources/base_resource.py:321` +- UserTiersResource.create: `nexla_sdk/resources/user_tiers.py:21` +- UserTiersResource.delete: `nexla_sdk/resources/user_tiers.py:27` +- UserTiersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- UserTiersResource.get: `nexla_sdk/resources/user_tiers.py:18` +- UserTiersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- UserTiersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- UserTiersResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- UserTiersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- UserTiersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- UserTiersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- UserTiersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- UserTiersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- UserTiersResource.list: `nexla_sdk/resources/user_tiers.py:15` +- UserTiersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- UserTiersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- UserTiersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- UserTiersResource.pause: `nexla_sdk/resources/base_resource.py:305` +- UserTiersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- UserTiersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- UserTiersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- UserTiersResource.search: `nexla_sdk/resources/base_resource.py:408` +- UserTiersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- UserTiersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- UserTiersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- UserTiersResource.update: `nexla_sdk/resources/user_tiers.py:24` +- UsersResource: `nexla_sdk/resources/users.py:10` +- UsersResource.activate: `nexla_sdk/resources/users.py:332` +- UsersResource.activate_api_key: `nexla_sdk/resources/users.py:462` +- UsersResource.activate_rate_limited_sources: `nexla_sdk/resources/users.py:345` +- UsersResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- UsersResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- UsersResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- UsersResource.change_password: `nexla_sdk/resources/users.py:132` - UsersResource.copy: `nexla_sdk/resources/base_resource.py:321` -- UsersResource.create: `nexla_sdk/resources/users.py:65` -- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:134` -- UsersResource.delete: `nexla_sdk/resources/users.py:93` -- UsersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` -- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:168` -- UsersResource.get: `nexla_sdk/resources/users.py:43` -- UsersResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:258` -- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:181` -- UsersResource.get_current: `nexla_sdk/resources/users.py:116` -- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:339` -- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:319` -- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:290` -- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:121` -- UsersResource.get_settings: `nexla_sdk/resources/users.py:105` -- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:225` -- UsersResource.list: `nexla_sdk/resources/users.py:17` +- UsersResource.create: `nexla_sdk/resources/users.py:69` +- UsersResource.create_api_key: `nexla_sdk/resources/users.py:448` +- UsersResource.create_credit: `nexla_sdk/resources/users.py:398` +- UsersResource.create_dashboard_transforms: `nexla_sdk/resources/users.py:302` +- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:206` +- UsersResource.delete: `nexla_sdk/resources/users.py:97` +- UsersResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- UsersResource.delete_api_key: `nexla_sdk/resources/users.py:474` +- UsersResource.delete_credit: `nexla_sdk/resources/users.py:429` +- UsersResource.delete_dashboard_transforms: `nexla_sdk/resources/users.py:314` +- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:240` +- UsersResource.expire_credit: `nexla_sdk/resources/users.py:425` +- UsersResource.get: `nexla_sdk/resources/users.py:47` +- UsersResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- UsersResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:479` +- UsersResource.get_account_rate_limited: `nexla_sdk/resources/users.py:354` +- UsersResource.get_account_summary: `nexla_sdk/resources/users.py:110` +- UsersResource.get_api_key: `nexla_sdk/resources/users.py:444` +- UsersResource.get_api_key_events: `nexla_sdk/resources/users.py:168` +- UsersResource.get_audit_history: `nexla_sdk/resources/users.py:160` +- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:258` +- UsersResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- UsersResource.get_credit: `nexla_sdk/resources/users.py:404` +- UsersResource.get_current: `nexla_sdk/resources/users.py:154` +- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:560` +- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:540` +- UsersResource.get_dashboard_transforms: `nexla_sdk/resources/users.py:254` +- UsersResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:511` +- UsersResource.get_flows_account_metrics: `nexla_sdk/resources/users.py:327` +- UsersResource.get_flows_dashboard: `nexla_sdk/resources/users.py:319` +- UsersResource.get_flows_status_metrics: `nexla_sdk/resources/users.py:323` +- UsersResource.get_login_history: `nexla_sdk/resources/users.py:164` +- UsersResource.get_metrics: `nexla_sdk/resources/users.py:180` +- UsersResource.get_orgs: `nexla_sdk/resources/users.py:188` +- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:193` +- UsersResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- UsersResource.get_resource_audit_log: `nexla_sdk/resources/users.py:172` +- UsersResource.get_settings: `nexla_sdk/resources/users.py:143` +- UsersResource.get_sso_options: `nexla_sdk/resources/users.py:136` +- UsersResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:359` +- UsersResource.get_user_account_summary: `nexla_sdk/resources/users.py:114` +- UsersResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- UsersResource.list: `nexla_sdk/resources/users.py:18` +- UsersResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- UsersResource.list_api_keys: `nexla_sdk/resources/users.py:434` +- UsersResource.list_credits: `nexla_sdk/resources/users.py:393` +- UsersResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- UsersResource.list_sso_options: `nexla_sdk/resources/users.py:44` +- UsersResource.lock_account: `nexla_sdk/resources/users.py:337` - UsersResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- UsersResource.password_entropy: `nexla_sdk/resources/users.py:126` - UsersResource.pause: `nexla_sdk/resources/base_resource.py:305` -- UsersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` -- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:240` -- UsersResource.update: `nexla_sdk/resources/users.py:80` -- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:152` +- UsersResource.pause_all_api_keys: `nexla_sdk/resources/users.py:470` +- UsersResource.pause_api_key: `nexla_sdk/resources/users.py:466` +- UsersResource.refresh_credit: `nexla_sdk/resources/users.py:421` +- UsersResource.refresh_credits: `nexla_sdk/resources/users.py:417` +- UsersResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- UsersResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- UsersResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- UsersResource.reset_password: `nexla_sdk/resources/users.py:120` +- UsersResource.rotate_api_key: `nexla_sdk/resources/users.py:458` +- UsersResource.search: `nexla_sdk/resources/base_resource.py:408` +- UsersResource.search_api_keys: `nexla_sdk/resources/users.py:438` +- UsersResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- UsersResource.send_invite: `nexla_sdk/resources/users.py:129` +- UsersResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- UsersResource.set_password: `nexla_sdk/resources/users.py:123` +- UsersResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:374` +- UsersResource.unlock_account: `nexla_sdk/resources/users.py:341` +- UsersResource.update: `nexla_sdk/resources/users.py:84` +- UsersResource.update_api_key: `nexla_sdk/resources/users.py:452` +- UsersResource.update_dashboard_transforms: `nexla_sdk/resources/users.py:308` +- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:224` +- UsersResource.use_credit: `nexla_sdk/resources/users.py:413` +- UsersResource.use_credits: `nexla_sdk/resources/users.py:409` +- ValidatorsResource: `nexla_sdk/resources/validators.py:14` +- ValidatorsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- ValidatorsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- ValidatorsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- ValidatorsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- ValidatorsResource.copy: `nexla_sdk/resources/validators.py:145` +- ValidatorsResource.create: `nexla_sdk/resources/validators.py:109` +- ValidatorsResource.delete: `nexla_sdk/resources/validators.py:134` +- ValidatorsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- ValidatorsResource.get: `nexla_sdk/resources/validators.py:97` +- ValidatorsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- ValidatorsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- ValidatorsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- ValidatorsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- ValidatorsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- ValidatorsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- ValidatorsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- ValidatorsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- ValidatorsResource.list: `nexla_sdk/resources/validators.py:48` +- ValidatorsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- ValidatorsResource.list_public: `nexla_sdk/resources/validators.py:74` +- ValidatorsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- ValidatorsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- ValidatorsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- ValidatorsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- ValidatorsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- ValidatorsResource.search: `nexla_sdk/resources/validators.py:174` +- ValidatorsResource.search_tags: `nexla_sdk/resources/validators.py:161` +- ValidatorsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- ValidatorsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- ValidatorsResource.update: `nexla_sdk/resources/validators.py:120` +- VendorEndpointsResource: `nexla_sdk/resources/vendor_endpoints.py:11` +- VendorEndpointsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- VendorEndpointsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- VendorEndpointsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- VendorEndpointsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- VendorEndpointsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- VendorEndpointsResource.create: `nexla_sdk/resources/vendor_endpoints.py:25` +- VendorEndpointsResource.delete: `nexla_sdk/resources/vendor_endpoints.py:37` +- VendorEndpointsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- VendorEndpointsResource.delete_all: `nexla_sdk/resources/vendor_endpoints.py:43` +- VendorEndpointsResource.get: `nexla_sdk/resources/vendor_endpoints.py:22` +- VendorEndpointsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- VendorEndpointsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- VendorEndpointsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- VendorEndpointsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- VendorEndpointsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- VendorEndpointsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- VendorEndpointsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- VendorEndpointsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- VendorEndpointsResource.list: `nexla_sdk/resources/vendor_endpoints.py:19` +- VendorEndpointsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- VendorEndpointsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- VendorEndpointsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- VendorEndpointsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- VendorEndpointsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- VendorEndpointsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- VendorEndpointsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- VendorEndpointsResource.search: `nexla_sdk/resources/base_resource.py:408` +- VendorEndpointsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- VendorEndpointsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- VendorEndpointsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- VendorEndpointsResource.update: `nexla_sdk/resources/vendor_endpoints.py:30` +- VendorEndpointsResource.update_all: `nexla_sdk/resources/vendor_endpoints.py:40` +- VendorsResource: `nexla_sdk/resources/vendors.py:10` +- VendorsResource.activate: `nexla_sdk/resources/base_resource.py:289` +- VendorsResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- VendorsResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- VendorsResource.add_tags: `nexla_sdk/resources/base_resource.py:549` +- VendorsResource.copy: `nexla_sdk/resources/base_resource.py:321` +- VendorsResource.create: `nexla_sdk/resources/vendors.py:111` +- VendorsResource.delete: `nexla_sdk/resources/vendors.py:155` +- VendorsResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` +- VendorsResource.delete_all: `nexla_sdk/resources/vendors.py:182` +- VendorsResource.delete_auth_template: `nexla_sdk/resources/vendors.py:186` +- VendorsResource.delete_by_name: `nexla_sdk/resources/vendors.py:166` +- VendorsResource.get: `nexla_sdk/resources/vendors.py:80` +- VendorsResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- VendorsResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- VendorsResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- VendorsResource.get_by_name: `nexla_sdk/resources/vendors.py:95` +- VendorsResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- VendorsResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- VendorsResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- VendorsResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- VendorsResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` +- VendorsResource.list: `nexla_sdk/resources/vendors.py:53` +- VendorsResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- VendorsResource.list_public: `nexla_sdk/resources/base_resource.py:339` +- VendorsResource.paginate: `nexla_sdk/resources/base_resource.py:181` +- VendorsResource.pause: `nexla_sdk/resources/base_resource.py:305` +- VendorsResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- VendorsResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- VendorsResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- VendorsResource.search: `nexla_sdk/resources/base_resource.py:408` +- VendorsResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- VendorsResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- VendorsResource.set_tags: `nexla_sdk/resources/base_resource.py:535` +- VendorsResource.update: `nexla_sdk/resources/vendors.py:122` +- VendorsResource.update_all: `nexla_sdk/resources/vendors.py:178` +- VendorsResource.update_by_name: `nexla_sdk/resources/vendors.py:136` +### nexla_sdk.resources.api_keys +- ApiKeysResource: `nexla_sdk/resources/api_keys.py:9` +- ApiKeysResource.activate: `nexla_sdk/resources/api_keys.py:149` +- ApiKeysResource.copy: `nexla_sdk/resources/api_keys.py:146` +- ApiKeysResource.create: `nexla_sdk/resources/api_keys.py:137` +- ApiKeysResource.delete: `nexla_sdk/resources/api_keys.py:143` +- ApiKeysResource.get: `nexla_sdk/resources/api_keys.py:99` +- ApiKeysResource.list: `nexla_sdk/resources/api_keys.py:47` +- ApiKeysResource.list_grouped: `nexla_sdk/resources/api_keys.py:74` +- ApiKeysResource.pause: `nexla_sdk/resources/api_keys.py:152` +- ApiKeysResource.search: `nexla_sdk/resources/api_keys.py:112` +- ApiKeysResource.update: `nexla_sdk/resources/api_keys.py:140` ### nexla_sdk.resources.approval_requests - ApprovalRequestsResource: `nexla_sdk/resources/approval_requests.py:7` -- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:25` +- ApprovalRequestsResource.approve: `nexla_sdk/resources/approval_requests.py:60` +- ApprovalRequestsResource.cancel: `nexla_sdk/resources/approval_requests.py:71` +- ApprovalRequestsResource.get: `nexla_sdk/resources/approval_requests.py:50` +- ApprovalRequestsResource.list_access_pending: `nexla_sdk/resources/approval_requests.py:35` +- ApprovalRequestsResource.list_access_requested: `nexla_sdk/resources/approval_requests.py:30` +- ApprovalRequestsResource.list_assigned: `nexla_sdk/resources/approval_requests.py:20` +- ApprovalRequestsResource.list_listings_pending: `nexla_sdk/resources/approval_requests.py:45` +- ApprovalRequestsResource.list_listings_requested: `nexla_sdk/resources/approval_requests.py:40` - ApprovalRequestsResource.list_pending: `nexla_sdk/resources/approval_requests.py:15` -- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:20` -- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:30` +- ApprovalRequestsResource.list_requested: `nexla_sdk/resources/approval_requests.py:25` +- ApprovalRequestsResource.reject: `nexla_sdk/resources/approval_requests.py:65` +- ApprovalRequestsResource.show_data_set: `nexla_sdk/resources/approval_requests.py:55` ### nexla_sdk.resources.async_tasks - AsyncTasksResource: `nexla_sdk/resources/async_tasks.py:8` - AsyncTasksResource.acknowledge: `nexla_sdk/resources/async_tasks.py:73` @@ -1989,212 +4864,656 @@ Each API page embeds per-symbol source links. Summary below. - AsyncTasksResource.types: `nexla_sdk/resources/async_tasks.py:37` ### nexla_sdk.resources.attribute_transforms - AttributeTransformsResource: `nexla_sdk/resources/attribute_transforms.py:11` +- AttributeTransformsResource.copy: `nexla_sdk/resources/attribute_transforms.py:63` - AttributeTransformsResource.create: `nexla_sdk/resources/attribute_transforms.py:43` - AttributeTransformsResource.delete: `nexla_sdk/resources/attribute_transforms.py:53` - AttributeTransformsResource.get: `nexla_sdk/resources/attribute_transforms.py:37` - AttributeTransformsResource.list: `nexla_sdk/resources/attribute_transforms.py:19` - AttributeTransformsResource.list_public: `nexla_sdk/resources/attribute_transforms.py:57` +- AttributeTransformsResource.search: `nexla_sdk/resources/attribute_transforms.py:67` +- AttributeTransformsResource.search_tags: `nexla_sdk/resources/attribute_transforms.py:70` - AttributeTransformsResource.update: `nexla_sdk/resources/attribute_transforms.py:47` +### nexla_sdk.resources.auth_parameters +- AuthParametersResource: `nexla_sdk/resources/auth_parameters.py:11` +- AuthParametersResource.create: `nexla_sdk/resources/auth_parameters.py:25` +- AuthParametersResource.delete: `nexla_sdk/resources/auth_parameters.py:35` +- AuthParametersResource.get: `nexla_sdk/resources/auth_parameters.py:22` +- AuthParametersResource.list: `nexla_sdk/resources/auth_parameters.py:19` +- AuthParametersResource.update: `nexla_sdk/resources/auth_parameters.py:28` +### nexla_sdk.resources.auth_templates +- AuthTemplatesResource: `nexla_sdk/resources/auth_templates.py:13` +- AuthTemplatesResource.create: `nexla_sdk/resources/auth_templates.py:101` +- AuthTemplatesResource.delete: `nexla_sdk/resources/auth_templates.py:145` +- AuthTemplatesResource.delete_all: `nexla_sdk/resources/auth_templates.py:172` +- AuthTemplatesResource.delete_by_name: `nexla_sdk/resources/auth_templates.py:156` +- AuthTemplatesResource.get: `nexla_sdk/resources/auth_templates.py:76` +- AuthTemplatesResource.get_by_name: `nexla_sdk/resources/auth_templates.py:88` +- AuthTemplatesResource.list: `nexla_sdk/resources/auth_templates.py:55` +- AuthTemplatesResource.update: `nexla_sdk/resources/auth_templates.py:112` +- AuthTemplatesResource.update_all: `nexla_sdk/resources/auth_templates.py:168` +- AuthTemplatesResource.update_by_name: `nexla_sdk/resources/auth_templates.py:126` ### nexla_sdk.resources.base_resource - BaseResource: `nexla_sdk/resources/base_resource.py:15` - BaseResource.activate: `nexla_sdk/resources/base_resource.py:289` -- BaseResource.add_accessors: `nexla_sdk/resources/base_resource.py:398` +- BaseResource.add_accessors: `nexla_sdk/resources/base_resource.py:636` +- BaseResource.add_docs: `nexla_sdk/resources/base_resource.py:465` +- BaseResource.add_tags: `nexla_sdk/resources/base_resource.py:549` - BaseResource.copy: `nexla_sdk/resources/base_resource.py:321` - BaseResource.create: `nexla_sdk/resources/base_resource.py:229` - BaseResource.delete: `nexla_sdk/resources/base_resource.py:274` -- BaseResource.delete_accessors: `nexla_sdk/resources/base_resource.py:450` +- BaseResource.delete_accessors: `nexla_sdk/resources/base_resource.py:688` - BaseResource.get: `nexla_sdk/resources/base_resource.py:199` -- BaseResource.get_accessors: `nexla_sdk/resources/base_resource.py:380` -- BaseResource.get_audit_log: `nexla_sdk/resources/base_resource.py:339` +- BaseResource.get_access_insights: `nexla_sdk/resources/base_resource.py:380` +- BaseResource.get_accessors: `nexla_sdk/resources/base_resource.py:618` +- BaseResource.get_audit_log: `nexla_sdk/resources/base_resource.py:577` +- BaseResource.get_control_event: `nexla_sdk/resources/base_resource.py:508` +- BaseResource.get_docs: `nexla_sdk/resources/base_resource.py:438` +- BaseResource.get_referenced_by: `nexla_sdk/resources/base_resource.py:495` +- BaseResource.get_tags: `nexla_sdk/resources/base_resource.py:522` +- BaseResource.get_users_access_insights: `nexla_sdk/resources/base_resource.py:394` - BaseResource.list: `nexla_sdk/resources/base_resource.py:130` +- BaseResource.list_accessible: `nexla_sdk/resources/base_resource.py:366` +- BaseResource.list_public: `nexla_sdk/resources/base_resource.py:339` - BaseResource.paginate: `nexla_sdk/resources/base_resource.py:181` - BaseResource.pause: `nexla_sdk/resources/base_resource.py:305` -- BaseResource.replace_accessors: `nexla_sdk/resources/base_resource.py:424` +- BaseResource.remove_docs: `nexla_sdk/resources/base_resource.py:479` +- BaseResource.remove_tags: `nexla_sdk/resources/base_resource.py:563` +- BaseResource.replace_accessors: `nexla_sdk/resources/base_resource.py:662` +- BaseResource.search: `nexla_sdk/resources/base_resource.py:408` +- BaseResource.search_tags: `nexla_sdk/resources/base_resource.py:423` +- BaseResource.set_docs: `nexla_sdk/resources/base_resource.py:451` +- BaseResource.set_tags: `nexla_sdk/resources/base_resource.py:535` - BaseResource.update: `nexla_sdk/resources/base_resource.py:252` +### nexla_sdk.resources.catalog_configs +- CatalogConfigsResource: `nexla_sdk/resources/catalog_configs.py:11` +- CatalogConfigsResource.check_job_status: `nexla_sdk/resources/catalog_configs.py:43` +- CatalogConfigsResource.create: `nexla_sdk/resources/catalog_configs.py:29` +- CatalogConfigsResource.delete: `nexla_sdk/resources/catalog_configs.py:37` +- CatalogConfigsResource.get: `nexla_sdk/resources/catalog_configs.py:26` +- CatalogConfigsResource.list: `nexla_sdk/resources/catalog_configs.py:19` +- CatalogConfigsResource.list_all: `nexla_sdk/resources/catalog_configs.py:22` +- CatalogConfigsResource.mock_catalog_add: `nexla_sdk/resources/catalog_configs.py:40` +- CatalogConfigsResource.start_bulk_create_update: `nexla_sdk/resources/catalog_configs.py:47` +- CatalogConfigsResource.update: `nexla_sdk/resources/catalog_configs.py:32` +### nexla_sdk.resources.cluster_endpoints +- ClusterEndpointsResource: `nexla_sdk/resources/cluster_endpoints.py:13` +- ClusterEndpointsResource.create: `nexla_sdk/resources/cluster_endpoints.py:84` +- ClusterEndpointsResource.get: `nexla_sdk/resources/cluster_endpoints.py:71` +- ClusterEndpointsResource.get_audit_log: `nexla_sdk/resources/cluster_endpoints.py:116` +- ClusterEndpointsResource.list: `nexla_sdk/resources/cluster_endpoints.py:54` +- ClusterEndpointsResource.update: `nexla_sdk/resources/cluster_endpoints.py:99` +### nexla_sdk.resources.clusters +- ClustersResource: `nexla_sdk/resources/clusters.py:10` +- ClustersResource.activate: `nexla_sdk/resources/clusters.py:117` +- ClustersResource.create: `nexla_sdk/resources/clusters.py:81` +- ClustersResource.delete: `nexla_sdk/resources/clusters.py:106` +- ClustersResource.delete_endpoint: `nexla_sdk/resources/clusters.py:144` +- ClustersResource.get: `nexla_sdk/resources/clusters.py:69` +- ClustersResource.list: `nexla_sdk/resources/clusters.py:48` +- ClustersResource.set_default: `nexla_sdk/resources/clusters.py:128` +- ClustersResource.update: `nexla_sdk/resources/clusters.py:92` ### nexla_sdk.resources.code_containers - CodeContainersResource: `nexla_sdk/resources/code_containers.py:11` - CodeContainersResource.copy: `nexla_sdk/resources/code_containers.py:67` - CodeContainersResource.create: `nexla_sdk/resources/code_containers.py:45` - CodeContainersResource.delete: `nexla_sdk/resources/code_containers.py:63` +- CodeContainersResource.error_functions: `nexla_sdk/resources/code_containers.py:84` - CodeContainersResource.get: `nexla_sdk/resources/code_containers.py:37` - CodeContainersResource.list: `nexla_sdk/resources/code_containers.py:19` +- CodeContainersResource.list_accessible: `nexla_sdk/resources/code_containers.py:77` - CodeContainersResource.list_public: `nexla_sdk/resources/code_containers.py:71` +- CodeContainersResource.repo: `nexla_sdk/resources/code_containers.py:80` +- CodeContainersResource.search: `nexla_sdk/resources/code_containers.py:87` +- CodeContainersResource.search_tags: `nexla_sdk/resources/code_containers.py:90` - CodeContainersResource.update: `nexla_sdk/resources/code_containers.py:53` +### nexla_sdk.resources.connectors +- ConnectorsResource: `nexla_sdk/resources/connectors.py:10` +- ConnectorsResource.activate: `nexla_sdk/resources/connectors.py:135` +- ConnectorsResource.copy: `nexla_sdk/resources/connectors.py:132` +- ConnectorsResource.create: `nexla_sdk/resources/connectors.py:126` +- ConnectorsResource.delete: `nexla_sdk/resources/connectors.py:129` +- ConnectorsResource.get: `nexla_sdk/resources/connectors.py:94` +- ConnectorsResource.list: `nexla_sdk/resources/connectors.py:59` +- ConnectorsResource.pause: `nexla_sdk/resources/connectors.py:138` +- ConnectorsResource.update: `nexla_sdk/resources/connectors.py:107` ### nexla_sdk.resources.credentials - CredentialsResource: `nexla_sdk/resources/credentials.py:19` -- CredentialsResource.create: `nexla_sdk/resources/credentials.py:75` -- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:105` -- CredentialsResource.get: `nexla_sdk/resources/credentials.py:59` +- CredentialsResource.create: `nexla_sdk/resources/credentials.py:103` +- CredentialsResource.credentials_schema: `nexla_sdk/resources/credentials.py:71` +- CredentialsResource.db_data_types: `nexla_sdk/resources/credentials.py:77` +- CredentialsResource.delete: `nexla_sdk/resources/credentials.py:133` +- CredentialsResource.get: `nexla_sdk/resources/credentials.py:87` +- CredentialsResource.intent: `nexla_sdk/resources/credentials.py:297` - CredentialsResource.list: `nexla_sdk/resources/credentials.py:27` -- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:117` -- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:183` -- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:155` -- CredentialsResource.update: `nexla_sdk/resources/credentials.py:92` +- CredentialsResource.list_accessible: `nexla_sdk/resources/credentials.py:68` +- CredentialsResource.list_all: `nexla_sdk/resources/credentials.py:59` +- CredentialsResource.list_public: `nexla_sdk/resources/credentials.py:64` +- CredentialsResource.migrate_iceberg: `nexla_sdk/resources/credentials.py:303` +- CredentialsResource.probe: `nexla_sdk/resources/credentials.py:145` +- CredentialsResource.probe_detect_schemas: `nexla_sdk/resources/credentials.py:209` +- CredentialsResource.probe_file_download: `nexla_sdk/resources/credentials.py:221` +- CredentialsResource.probe_list_buckets: `nexla_sdk/resources/credentials.py:183` +- CredentialsResource.probe_list_files: `nexla_sdk/resources/credentials.py:191` +- CredentialsResource.probe_read_file: `nexla_sdk/resources/credentials.py:203` +- CredentialsResource.probe_read_sample: `nexla_sdk/resources/credentials.py:215` +- CredentialsResource.probe_sample: `nexla_sdk/resources/credentials.py:261` +- CredentialsResource.probe_search_path: `nexla_sdk/resources/credentials.py:227` +- CredentialsResource.probe_summary: `nexla_sdk/resources/credentials.py:187` +- CredentialsResource.probe_tree: `nexla_sdk/resources/credentials.py:233` +- CredentialsResource.probe_tree_request: `nexla_sdk/resources/credentials.py:197` +- CredentialsResource.refresh: `nexla_sdk/resources/credentials.py:289` +- CredentialsResource.search: `nexla_sdk/resources/credentials.py:81` +- CredentialsResource.search_tags: `nexla_sdk/resources/credentials.py:84` +- CredentialsResource.update: `nexla_sdk/resources/credentials.py:120` +- CredentialsResource.usage: `nexla_sdk/resources/credentials.py:293` +### nexla_sdk.resources.cubejs +- CubeJsResource: `nexla_sdk/resources/cubejs.py:6` +- CubeJsResource.query: `nexla_sdk/resources/cubejs.py:14` +### nexla_sdk.resources.custom_data_flows +- CustomDataFlowsResource: `nexla_sdk/resources/custom_data_flows.py:11` +- CustomDataFlowsResource.activate: `nexla_sdk/resources/custom_data_flows.py:48` +- CustomDataFlowsResource.copy: `nexla_sdk/resources/custom_data_flows.py:43` +- CustomDataFlowsResource.create: `nexla_sdk/resources/custom_data_flows.py:28` +- CustomDataFlowsResource.delete: `nexla_sdk/resources/custom_data_flows.py:40` +- CustomDataFlowsResource.edit_code_containers: `nexla_sdk/resources/custom_data_flows.py:60` +- CustomDataFlowsResource.edit_data_credentials: `nexla_sdk/resources/custom_data_flows.py:68` +- CustomDataFlowsResource.get: `nexla_sdk/resources/custom_data_flows.py:25` +- CustomDataFlowsResource.get_metrics: `nexla_sdk/resources/custom_data_flows.py:56` +- CustomDataFlowsResource.list: `nexla_sdk/resources/custom_data_flows.py:19` +- CustomDataFlowsResource.list_accessible: `nexla_sdk/resources/custom_data_flows.py:22` +- CustomDataFlowsResource.search: `nexla_sdk/resources/custom_data_flows.py:76` +- CustomDataFlowsResource.search_tags: `nexla_sdk/resources/custom_data_flows.py:79` +- CustomDataFlowsResource.update: `nexla_sdk/resources/custom_data_flows.py:33` +### nexla_sdk.resources.dashboard_transforms +- DashboardTransformsResource: `nexla_sdk/resources/dashboard_transforms.py:11` +- DashboardTransformsResource.create: `nexla_sdk/resources/dashboard_transforms.py:29` +- DashboardTransformsResource.delete: `nexla_sdk/resources/dashboard_transforms.py:41` +- DashboardTransformsResource.get: `nexla_sdk/resources/dashboard_transforms.py:26` +- DashboardTransformsResource.list: `nexla_sdk/resources/dashboard_transforms.py:19` +- DashboardTransformsResource.list_all: `nexla_sdk/resources/dashboard_transforms.py:22` +- DashboardTransformsResource.update: `nexla_sdk/resources/dashboard_transforms.py:34` +### nexla_sdk.resources.data_credentials_groups +- DataCredentialsGroupsResource: `nexla_sdk/resources/data_credentials_groups.py:13` +- DataCredentialsGroupsResource.create: `nexla_sdk/resources/data_credentials_groups.py:27` +- DataCredentialsGroupsResource.delete: `nexla_sdk/resources/data_credentials_groups.py:39` +- DataCredentialsGroupsResource.get: `nexla_sdk/resources/data_credentials_groups.py:24` +- DataCredentialsGroupsResource.list: `nexla_sdk/resources/data_credentials_groups.py:21` +- DataCredentialsGroupsResource.list_credentials: `nexla_sdk/resources/data_credentials_groups.py:42` +- DataCredentialsGroupsResource.remove_credentials: `nexla_sdk/resources/data_credentials_groups.py:47` +- DataCredentialsGroupsResource.update: `nexla_sdk/resources/data_credentials_groups.py:32` +### nexla_sdk.resources.data_flows +- DataFlowsResource: `nexla_sdk/resources/data_flows.py:6` +- DataFlowsResource.create: `nexla_sdk/resources/data_flows.py:22` +- DataFlowsResource.create_data_sink_flow: `nexla_sdk/resources/data_flows.py:48` +- DataFlowsResource.create_data_source_flow: `nexla_sdk/resources/data_flows.py:38` +- DataFlowsResource.get: `nexla_sdk/resources/data_flows.py:18` +- DataFlowsResource.get_audit_log: `nexla_sdk/resources/data_flows.py:25` +- DataFlowsResource.get_data_sink_audit_log: `nexla_sdk/resources/data_flows.py:59` +- DataFlowsResource.get_data_sink_flow: `nexla_sdk/resources/data_flows.py:44` +- DataFlowsResource.get_data_source_audit_log: `nexla_sdk/resources/data_flows.py:54` +- DataFlowsResource.get_data_source_flow: `nexla_sdk/resources/data_flows.py:34` +- DataFlowsResource.get_flow_audit_log: `nexla_sdk/resources/data_flows.py:51` +- DataFlowsResource.list: `nexla_sdk/resources/data_flows.py:14` +- DataFlowsResource.list_data_sink_flows: `nexla_sdk/resources/data_flows.py:41` +- DataFlowsResource.list_data_source_flows: `nexla_sdk/resources/data_flows.py:29` ### nexla_sdk.resources.data_schemas -- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:7` -- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:15` +- DataSchemasResource: `nexla_sdk/resources/data_schemas.py:8` +- DataSchemasResource.copy: `nexla_sdk/resources/data_schemas.py:56` +- DataSchemasResource.create: `nexla_sdk/resources/data_schemas.py:33` +- DataSchemasResource.delete: `nexla_sdk/resources/data_schemas.py:39` +- DataSchemasResource.get: `nexla_sdk/resources/data_schemas.py:30` +- DataSchemasResource.get_audit_log: `nexla_sdk/resources/data_schemas.py:61` +- DataSchemasResource.get_metrics: `nexla_sdk/resources/data_schemas.py:42` +- DataSchemasResource.list: `nexla_sdk/resources/data_schemas.py:16` +- DataSchemasResource.list_accessible: `nexla_sdk/resources/data_schemas.py:27` +- DataSchemasResource.list_all: `nexla_sdk/resources/data_schemas.py:19` +- DataSchemasResource.list_public: `nexla_sdk/resources/data_schemas.py:23` +- DataSchemasResource.search: `nexla_sdk/resources/data_schemas.py:50` +- DataSchemasResource.search_tags: `nexla_sdk/resources/data_schemas.py:53` +- DataSchemasResource.update: `nexla_sdk/resources/data_schemas.py:36` ### nexla_sdk.resources.destinations - DestinationsResource: `nexla_sdk/resources/destinations.py:12` -- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:94` -- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:118` -- DestinationsResource.create: `nexla_sdk/resources/destinations.py:54` -- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:82` -- DestinationsResource.get: `nexla_sdk/resources/destinations.py:38` +- DestinationsResource.activate: `nexla_sdk/resources/destinations.py:173` +- DestinationsResource.activate_api_key: `nexla_sdk/resources/destinations.py:354` +- DestinationsResource.copy: `nexla_sdk/resources/destinations.py:197` +- DestinationsResource.create: `nexla_sdk/resources/destinations.py:86` +- DestinationsResource.create_api_key: `nexla_sdk/resources/destinations.py:340` +- DestinationsResource.create_dashboard_transforms: `nexla_sdk/resources/destinations.py:273` +- DestinationsResource.create_quarantine_settings: `nexla_sdk/resources/destinations.py:253` +- DestinationsResource.delete: `nexla_sdk/resources/destinations.py:114` +- DestinationsResource.delete_api_key: `nexla_sdk/resources/destinations.py:366` +- DestinationsResource.delete_dashboard_transforms: `nexla_sdk/resources/destinations.py:285` +- DestinationsResource.delete_quarantine_settings: `nexla_sdk/resources/destinations.py:265` +- DestinationsResource.edit_flow_triggers: `nexla_sdk/resources/destinations.py:309` +- DestinationsResource.get: `nexla_sdk/resources/destinations.py:70` +- DestinationsResource.get_api_key: `nexla_sdk/resources/destinations.py:336` +- DestinationsResource.get_dashboard_transforms: `nexla_sdk/resources/destinations.py:269` +- DestinationsResource.get_flow: `nexla_sdk/resources/destinations.py:126` +- DestinationsResource.get_flow_dashboard: `nexla_sdk/resources/destinations.py:129` +- DestinationsResource.get_flow_logs: `nexla_sdk/resources/destinations.py:144` +- DestinationsResource.get_flow_metrics: `nexla_sdk/resources/destinations.py:139` +- DestinationsResource.get_flow_status_metrics: `nexla_sdk/resources/destinations.py:134` +- DestinationsResource.get_metrics: `nexla_sdk/resources/destinations.py:149` +- DestinationsResource.get_offset: `nexla_sdk/resources/destinations.py:165` +- DestinationsResource.get_quarantine_aggregation: `nexla_sdk/resources/destinations.py:376` +- DestinationsResource.get_quarantine_offset: `nexla_sdk/resources/destinations.py:157` +- DestinationsResource.get_quarantine_settings: `nexla_sdk/resources/destinations.py:249` - DestinationsResource.list: `nexla_sdk/resources/destinations.py:20` -- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:106` -- DestinationsResource.update: `nexla_sdk/resources/destinations.py:69` +- DestinationsResource.list_accessible: `nexla_sdk/resources/destinations.py:60` +- DestinationsResource.list_all: `nexla_sdk/resources/destinations.py:44` +- DestinationsResource.list_all_by_data_set: `nexla_sdk/resources/destinations.py:54` +- DestinationsResource.list_all_condensed: `nexla_sdk/resources/destinations.py:48` +- DestinationsResource.list_all_ids: `nexla_sdk/resources/destinations.py:51` +- DestinationsResource.list_api_keys: `nexla_sdk/resources/destinations.py:326` +- DestinationsResource.list_flow_triggers: `nexla_sdk/resources/destinations.py:305` +- DestinationsResource.pause: `nexla_sdk/resources/destinations.py:185` +- DestinationsResource.pause_all_api_keys: `nexla_sdk/resources/destinations.py:362` +- DestinationsResource.pause_api_key: `nexla_sdk/resources/destinations.py:358` +- DestinationsResource.probe_authenticate: `nexla_sdk/resources/destinations.py:221` +- DestinationsResource.probe_detect_schemas: `nexla_sdk/resources/destinations.py:237` +- DestinationsResource.probe_list_buckets: `nexla_sdk/resources/destinations.py:213` +- DestinationsResource.probe_list_files: `nexla_sdk/resources/destinations.py:225` +- DestinationsResource.probe_quarantine_sample: `nexla_sdk/resources/destinations.py:243` +- DestinationsResource.probe_read_file: `nexla_sdk/resources/destinations.py:233` +- DestinationsResource.probe_summary: `nexla_sdk/resources/destinations.py:217` +- DestinationsResource.probe_tree: `nexla_sdk/resources/destinations.py:229` +- DestinationsResource.rotate_api_key: `nexla_sdk/resources/destinations.py:350` +- DestinationsResource.run_analysis: `nexla_sdk/resources/destinations.py:301` +- DestinationsResource.run_status: `nexla_sdk/resources/destinations.py:295` +- DestinationsResource.script_sink_config: `nexla_sdk/resources/destinations.py:63` +- DestinationsResource.search: `nexla_sdk/resources/destinations.py:38` +- DestinationsResource.search_api_keys: `nexla_sdk/resources/destinations.py:330` +- DestinationsResource.search_tags: `nexla_sdk/resources/destinations.py:41` +- DestinationsResource.test_config: `nexla_sdk/resources/destinations.py:292` +- DestinationsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/destinations.py:370` +- DestinationsResource.update: `nexla_sdk/resources/destinations.py:101` +- DestinationsResource.update_api_key: `nexla_sdk/resources/destinations.py:344` +- DestinationsResource.update_dashboard_transforms: `nexla_sdk/resources/destinations.py:279` +- DestinationsResource.update_quarantine_settings: `nexla_sdk/resources/destinations.py:259` +- DestinationsResource.update_runtime_status: `nexla_sdk/resources/destinations.py:66` +- DestinationsResource.validate_config: `nexla_sdk/resources/destinations.py:289` ### nexla_sdk.resources.doc_containers -- DocContainersResource: `nexla_sdk/resources/doc_containers.py:7` -- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:15` +- DocContainersResource: `nexla_sdk/resources/doc_containers.py:8` +- DocContainersResource.copy: `nexla_sdk/resources/doc_containers.py:31` +- DocContainersResource.create: `nexla_sdk/resources/doc_containers.py:22` +- DocContainersResource.delete: `nexla_sdk/resources/doc_containers.py:28` +- DocContainersResource.get: `nexla_sdk/resources/doc_containers.py:19` +- DocContainersResource.get_audit_log: `nexla_sdk/resources/doc_containers.py:42` +- DocContainersResource.list: `nexla_sdk/resources/doc_containers.py:16` +- DocContainersResource.search: `nexla_sdk/resources/doc_containers.py:36` +- DocContainersResource.search_tags: `nexla_sdk/resources/doc_containers.py:39` +- DocContainersResource.update: `nexla_sdk/resources/doc_containers.py:25` +### nexla_sdk.resources.flow_nodes +- FlowNodesResource: `nexla_sdk/resources/flow_nodes.py:7` +- FlowNodesResource.get: `nexla_sdk/resources/flow_nodes.py:15` +- FlowNodesResource.get_access_insights: `nexla_sdk/resources/flow_nodes.py:27` +- FlowNodesResource.list_flows_minimal: `nexla_sdk/resources/flow_nodes.py:24` +- FlowNodesResource.list_origin_nodes_condensed: `nexla_sdk/resources/flow_nodes.py:21` +- FlowNodesResource.update: `nexla_sdk/resources/flow_nodes.py:18` +### nexla_sdk.resources.flow_triggers +- FlowTriggersResource: `nexla_sdk/resources/flow_triggers.py:10` +- FlowTriggersResource.activate: `nexla_sdk/resources/flow_triggers.py:139` +- FlowTriggersResource.create: `nexla_sdk/resources/flow_triggers.py:111` +- FlowTriggersResource.delete: `nexla_sdk/resources/flow_triggers.py:128` +- FlowTriggersResource.get: `nexla_sdk/resources/flow_triggers.py:99` +- FlowTriggersResource.list: `nexla_sdk/resources/flow_triggers.py:52` +- FlowTriggersResource.list_all: `nexla_sdk/resources/flow_triggers.py:73` +- FlowTriggersResource.pause: `nexla_sdk/resources/flow_triggers.py:150` +- FlowTriggersResource.update: `nexla_sdk/resources/flow_triggers.py:161` ### nexla_sdk.resources.flows - FlowsResource: `nexla_sdk/resources/flows.py:21` +- FlowsResource.accessors_by_resource: `nexla_sdk/resources/flows.py:395` - FlowsResource.activate: `nexla_sdk/resources/flows.py:117` - FlowsResource.activate_by_resource: `nexla_sdk/resources/flows.py:314` +- FlowsResource.active_flows_metrics: `nexla_sdk/resources/flows.py:527` +- FlowsResource.bulk_assign_project: `nexla_sdk/resources/flows.py:512` - FlowsResource.copy: `nexla_sdk/resources/flows.py:171` - FlowsResource.copy_and_replace_credentials: `nexla_sdk/resources/flows.py:186` +- FlowsResource.copy_by_resource: `nexla_sdk/resources/flows.py:385` +- FlowsResource.create_linked_flows: `nexla_sdk/resources/flows.py:453` +- FlowsResource.daily_metrics: `nexla_sdk/resources/flows.py:521` - FlowsResource.delete: `nexla_sdk/resources/flows.py:282` +- FlowsResource.delete_all_linked_flows: `nexla_sdk/resources/flows.py:471` - FlowsResource.delete_by_resource: `nexla_sdk/resources/flows.py:294` -- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:378` +- FlowsResource.delete_linked_flows: `nexla_sdk/resources/flows.py:465` +- FlowsResource.docs_by_resource: `nexla_sdk/resources/flows.py:407` +- FlowsResource.docs_recommendation: `nexla_sdk/resources/flows.py:535` +- FlowsResource.flow_logs: `nexla_sdk/resources/flows.py:435` +- FlowsResource.flow_logs_v2: `nexla_sdk/resources/flows.py:439` +- FlowsResource.flow_metrics: `nexla_sdk/resources/flows.py:445` - FlowsResource.get: `nexla_sdk/resources/flows.py:67` -- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:475` +- FlowsResource.get_active_flows_metrics: `nexla_sdk/resources/flows.py:632` - FlowsResource.get_by_resource: `nexla_sdk/resources/flows.py:90` -- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:397` -- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:529` -- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:581` -- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:499` +- FlowsResource.get_flow_logs: `nexla_sdk/resources/flows.py:554` +- FlowsResource.get_logs: `nexla_sdk/resources/flows.py:686` +- FlowsResource.get_metrics: `nexla_sdk/resources/flows.py:738` +- FlowsResource.get_resources_access: `nexla_sdk/resources/flows.py:532` +- FlowsResource.get_run_status: `nexla_sdk/resources/flows.py:656` +- FlowsResource.import_flow: `nexla_sdk/resources/flows.py:515` +- FlowsResource.insert_flow_node: `nexla_sdk/resources/flows.py:475` - FlowsResource.list: `nexla_sdk/resources/flows.py:29` +- FlowsResource.list_linked_flows: `nexla_sdk/resources/flows.py:449` - FlowsResource.pause: `nexla_sdk/resources/flows.py:140` - FlowsResource.pause_by_resource: `nexla_sdk/resources/flows.py:346` -- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:438` +- FlowsResource.publish_rag: `nexla_sdk/resources/flows.py:489` +- FlowsResource.publish_raw: `nexla_sdk/resources/flows.py:518` +- FlowsResource.remove_flow_node: `nexla_sdk/resources/flows.py:479` +- FlowsResource.restore_archival: `nexla_sdk/resources/flows.py:499` +- FlowsResource.run_now: `nexla_sdk/resources/flows.py:431` +- FlowsResource.run_profiles_activate: `nexla_sdk/resources/flows.py:425` +- FlowsResource.run_status: `nexla_sdk/resources/flows.py:503` +- FlowsResource.run_status_by_resource: `nexla_sdk/resources/flows.py:419` +- FlowsResource.search: `nexla_sdk/resources/flows.py:509` +- FlowsResource.search_flow_logs: `nexla_sdk/resources/flows.py:595` +- FlowsResource.total_metrics: `nexla_sdk/resources/flows.py:524` +- FlowsResource.update_archival_status: `nexla_sdk/resources/flows.py:493` +- FlowsResource.update_by_resource: `nexla_sdk/resources/flows.py:378` +- FlowsResource.update_linked_flows: `nexla_sdk/resources/flows.py:459` +- FlowsResource.update_samples: `nexla_sdk/resources/flows.py:485` ### nexla_sdk.resources.genai - GenAIResource: `nexla_sdk/resources/genai.py:16` - GenAIResource.create_config: `nexla_sdk/resources/genai.py:29` - GenAIResource.create_org_setting: `nexla_sdk/resources/genai.py:66` - GenAIResource.delete_config: `nexla_sdk/resources/genai.py:49` -- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:77` +- GenAIResource.delete_org_setting: `nexla_sdk/resources/genai.py:86` +- GenAIResource.delete_org_settings: `nexla_sdk/resources/genai.py:91` - GenAIResource.get_config: `nexla_sdk/resources/genai.py:34` - GenAIResource.get_org_setting: `nexla_sdk/resources/genai.py:71` - GenAIResource.list_configs: `nexla_sdk/resources/genai.py:25` - GenAIResource.list_org_settings: `nexla_sdk/resources/genai.py:55` -- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:82` +- GenAIResource.show_active_config: `nexla_sdk/resources/genai.py:94` - GenAIResource.update_config: `nexla_sdk/resources/genai.py:40` +- GenAIResource.update_org_setting: `nexla_sdk/resources/genai.py:77` ### nexla_sdk.resources.lookups - LookupsResource: `nexla_sdk/resources/lookups.py:14` -- LookupsResource.create: `nexla_sdk/resources/lookups.py:56` -- LookupsResource.delete: `nexla_sdk/resources/lookups.py:84` -- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:137` -- LookupsResource.get: `nexla_sdk/resources/lookups.py:40` -- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:116` +- LookupsResource.create: `nexla_sdk/resources/lookups.py:63` +- LookupsResource.delete: `nexla_sdk/resources/lookups.py:91` +- LookupsResource.delete_entries: `nexla_sdk/resources/lookups.py:165` +- LookupsResource.delete_entries_by_body: `nexla_sdk/resources/lookups.py:186` +- LookupsResource.download_map: `nexla_sdk/resources/lookups.py:113` +- LookupsResource.get: `nexla_sdk/resources/lookups.py:47` +- LookupsResource.get_entries: `nexla_sdk/resources/lookups.py:138` +- LookupsResource.get_entries_by_body: `nexla_sdk/resources/lookups.py:159` - LookupsResource.list: `nexla_sdk/resources/lookups.py:22` -- LookupsResource.update: `nexla_sdk/resources/lookups.py:71` -- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:96` +- LookupsResource.list_accessible: `nexla_sdk/resources/lookups.py:44` +- LookupsResource.list_public: `nexla_sdk/resources/lookups.py:40` +- LookupsResource.probe_sample: `nexla_sdk/resources/lookups.py:192` +- LookupsResource.search: `nexla_sdk/resources/lookups.py:103` +- LookupsResource.search_tags: `nexla_sdk/resources/lookups.py:106` +- LookupsResource.update: `nexla_sdk/resources/lookups.py:78` +- LookupsResource.upsert_entries: `nexla_sdk/resources/lookups.py:118` +- LookupsResource.validate: `nexla_sdk/resources/lookups.py:109` ### nexla_sdk.resources.marketplace - MarketplaceResource: `nexla_sdk/resources/marketplace.py:16` -- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:91` +- MarketplaceResource.add_domain_custodians: `nexla_sdk/resources/marketplace.py:136` - MarketplaceResource.create_domain: `nexla_sdk/resources/marketplace.py:53` -- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:66` +- MarketplaceResource.create_domain_item: `nexla_sdk/resources/marketplace.py:71` - MarketplaceResource.create_domains: `nexla_sdk/resources/marketplace.py:29` - MarketplaceResource.delete_domain: `nexla_sdk/resources/marketplace.py:58` +- MarketplaceResource.delist_domain_item: `nexla_sdk/resources/marketplace.py:94` - MarketplaceResource.get_domain: `nexla_sdk/resources/marketplace.py:40` +- MarketplaceResource.get_domain_audit_log: `nexla_sdk/resources/marketplace.py:61` +- MarketplaceResource.get_domain_item: `nexla_sdk/resources/marketplace.py:80` - MarketplaceResource.get_domains_for_org: `nexla_sdk/resources/marketplace.py:34` -- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:76` -- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:62` +- MarketplaceResource.get_item: `nexla_sdk/resources/marketplace.py:110` +- MarketplaceResource.list_domain_custodians: `nexla_sdk/resources/marketplace.py:121` +- MarketplaceResource.list_domain_items: `nexla_sdk/resources/marketplace.py:67` - MarketplaceResource.list_domains: `nexla_sdk/resources/marketplace.py:25` -- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:100` +- MarketplaceResource.list_items: `nexla_sdk/resources/marketplace.py:106` +- MarketplaceResource.remove_domain_custodians: `nexla_sdk/resources/marketplace.py:145` +- MarketplaceResource.request_item_access: `nexla_sdk/resources/marketplace.py:99` +- MarketplaceResource.search_domain_items: `nexla_sdk/resources/marketplace.py:86` +- MarketplaceResource.search_items: `nexla_sdk/resources/marketplace.py:114` - MarketplaceResource.update_domain: `nexla_sdk/resources/marketplace.py:44` -- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:82` +- MarketplaceResource.update_domain_custodians: `nexla_sdk/resources/marketplace.py:127` ### nexla_sdk.resources.metrics - MetricsResource: `nexla_sdk/resources/metrics.py:26` -- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:216` -- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:162` -- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:148` +- MetricsResource.get_flow_logs: `nexla_sdk/resources/metrics.py:220` +- MetricsResource.get_flow_metrics: `nexla_sdk/resources/metrics.py:166` +- MetricsResource.get_flow_metrics_summary: `nexla_sdk/resources/metrics.py:152` - MetricsResource.get_rate_limits: `nexla_sdk/resources/metrics.py:111` - MetricsResource.get_resource_daily_metrics: `nexla_sdk/resources/metrics.py:39` -- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:121` +- MetricsResource.get_resource_flow_metrics: `nexla_sdk/resources/metrics.py:125` - MetricsResource.get_resource_metrics_by_run: `nexla_sdk/resources/metrics.py:70` +- MetricsResource.publish_raw: `nexla_sdk/resources/metrics.py:121` ### nexla_sdk.resources.nexsets -- NexsetsResource: `nexla_sdk/resources/nexsets.py:12` -- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:94` -- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:147` -- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:54` -- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:82` -- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:161` -- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:38` -- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:118` -- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:20` -- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:106` -- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:69` +- NexsetsResource: `nexla_sdk/resources/nexsets.py:14` +- NexsetsResource.activate: `nexla_sdk/resources/nexsets.py:146` +- NexsetsResource.activate_api_key: `nexla_sdk/resources/nexsets.py:430` +- NexsetsResource.add_samples: `nexla_sdk/resources/nexsets.py:209` +- NexsetsResource.add_sharers: `nexla_sdk/resources/nexsets.py:321` +- NexsetsResource.bulk_update_catalog_refs: `nexla_sdk/resources/nexsets.py:399` +- NexsetsResource.catalog_add: `nexla_sdk/resources/nexsets.py:261` +- NexsetsResource.copy: `nexla_sdk/resources/nexsets.py:216` +- NexsetsResource.copy_docs: `nexla_sdk/resources/nexsets.py:536` +- NexsetsResource.create: `nexla_sdk/resources/nexsets.py:106` +- NexsetsResource.create_api_key: `nexla_sdk/resources/nexsets.py:416` +- NexsetsResource.create_catalog_ref: `nexla_sdk/resources/nexsets.py:385` +- NexsetsResource.create_dashboard_transforms: `nexla_sdk/resources/nexsets.py:297` +- NexsetsResource.create_quarantine_settings: `nexla_sdk/resources/nexsets.py:277` +- NexsetsResource.delete: `nexla_sdk/resources/nexsets.py:134` +- NexsetsResource.delete_api_key: `nexla_sdk/resources/nexsets.py:442` +- NexsetsResource.delete_catalog_ref: `nexla_sdk/resources/nexsets.py:395` +- NexsetsResource.delete_dashboard_transforms: `nexla_sdk/resources/nexsets.py:309` +- NexsetsResource.delete_quarantine_settings: `nexla_sdk/resources/nexsets.py:289` +- NexsetsResource.docs_recommendation: `nexla_sdk/resources/nexsets.py:456` +- NexsetsResource.get: `nexla_sdk/resources/nexsets.py:90` +- NexsetsResource.get_api_key: `nexla_sdk/resources/nexsets.py:412` +- NexsetsResource.get_catalog_ref: `nexla_sdk/resources/nexsets.py:380` +- NexsetsResource.get_characteristics: `nexla_sdk/resources/nexsets.py:353` +- NexsetsResource.get_dashboard_transforms: `nexla_sdk/resources/nexsets.py:293` +- NexsetsResource.get_data_update_time: `nexla_sdk/resources/nexsets.py:349` +- NexsetsResource.get_flow: `nexla_sdk/resources/nexsets.py:234` +- NexsetsResource.get_flow_dashboard: `nexla_sdk/resources/nexsets.py:237` +- NexsetsResource.get_flow_logs: `nexla_sdk/resources/nexsets.py:249` +- NexsetsResource.get_flow_metrics: `nexla_sdk/resources/nexsets.py:245` +- NexsetsResource.get_flow_status_metrics: `nexla_sdk/resources/nexsets.py:241` +- NexsetsResource.get_metrics: `nexla_sdk/resources/nexsets.py:253` +- NexsetsResource.get_offset: `nexla_sdk/resources/nexsets.py:345` +- NexsetsResource.get_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:452` +- NexsetsResource.get_quarantine_offset: `nexla_sdk/resources/nexsets.py:341` +- NexsetsResource.get_quarantine_settings: `nexla_sdk/resources/nexsets.py:273` +- NexsetsResource.get_samples: `nexla_sdk/resources/nexsets.py:170` +- NexsetsResource.list: `nexla_sdk/resources/nexsets.py:22` +- NexsetsResource.list_all: `nexla_sdk/resources/nexsets.py:40` +- NexsetsResource.list_all_condensed: `nexla_sdk/resources/nexsets.py:44` +- NexsetsResource.list_all_ids: `nexla_sdk/resources/nexsets.py:47` +- NexsetsResource.list_api_keys: `nexla_sdk/resources/nexsets.py:402` +- NexsetsResource.list_available: `nexla_sdk/resources/nexsets.py:50` +- NexsetsResource.list_catalog_refs: `nexla_sdk/resources/nexsets.py:375` +- NexsetsResource.list_characteristics_search: `nexla_sdk/resources/nexsets.py:72` +- NexsetsResource.list_docs: `nexla_sdk/resources/nexsets.py:461` +- NexsetsResource.list_nexset_api_compatible: `nexla_sdk/resources/nexsets.py:80` +- NexsetsResource.list_public: `nexla_sdk/resources/nexsets.py:63` +- NexsetsResource.list_shared: `nexla_sdk/resources/nexsets.py:59` +- NexsetsResource.list_sharers: `nexla_sdk/resources/nexsets.py:313` +- NexsetsResource.list_summary: `nexla_sdk/resources/nexsets.py:77` +- NexsetsResource.mark_shared: `nexla_sdk/resources/nexsets.py:331` +- NexsetsResource.pause: `nexla_sdk/resources/nexsets.py:158` +- NexsetsResource.pause_all_api_keys: `nexla_sdk/resources/nexsets.py:438` +- NexsetsResource.pause_api_key: `nexla_sdk/resources/nexsets.py:434` +- NexsetsResource.probe_quarantine_sample: `nexla_sdk/resources/nexsets.py:335` +- NexsetsResource.remove_sharers: `nexla_sdk/resources/nexsets.py:325` +- NexsetsResource.rotate_api_key: `nexla_sdk/resources/nexsets.py:426` +- NexsetsResource.search: `nexla_sdk/resources/nexsets.py:361` +- NexsetsResource.search_api_keys: `nexla_sdk/resources/nexsets.py:406` +- NexsetsResource.search_available: `nexla_sdk/resources/nexsets.py:54` +- NexsetsResource.search_public_tags: `nexla_sdk/resources/nexsets.py:67` +- NexsetsResource.search_tags: `nexla_sdk/resources/nexsets.py:364` +- NexsetsResource.semantic_schemas: `nexla_sdk/resources/nexsets.py:265` +- NexsetsResource.set_sharers: `nexla_sdk/resources/nexsets.py:317` +- NexsetsResource.summary: `nexla_sdk/resources/nexsets.py:357` +- NexsetsResource.sync_with_catalog: `nexla_sdk/resources/nexsets.py:230` +- NexsetsResource.transform: `nexla_sdk/resources/nexsets.py:269` +- NexsetsResource.trigger_quarantine_aggregation: `nexla_sdk/resources/nexsets.py:446` +- NexsetsResource.unvote: `nexla_sdk/resources/nexsets.py:371` +- NexsetsResource.update: `nexla_sdk/resources/nexsets.py:121` +- NexsetsResource.update_api_key: `nexla_sdk/resources/nexsets.py:420` +- NexsetsResource.update_catalog_ref: `nexla_sdk/resources/nexsets.py:390` +- NexsetsResource.update_dashboard_transforms: `nexla_sdk/resources/nexsets.py:303` +- NexsetsResource.update_docs: `nexla_sdk/resources/nexsets.py:491` +- NexsetsResource.update_quarantine_settings: `nexla_sdk/resources/nexsets.py:283` +- NexsetsResource.update_runtime_status: `nexla_sdk/resources/nexsets.py:86` +- NexsetsResource.update_samples: `nexla_sdk/resources/nexsets.py:199` +- NexsetsResource.vote: `nexla_sdk/resources/nexsets.py:367` +### nexla_sdk.resources.notification_channel_settings +- NotificationChannelSettingsResource: `nexla_sdk/resources/notification_channel_settings.py:13` +- NotificationChannelSettingsResource.create: `nexla_sdk/resources/notification_channel_settings.py:27` +- NotificationChannelSettingsResource.delete: `nexla_sdk/resources/notification_channel_settings.py:39` +- NotificationChannelSettingsResource.get: `nexla_sdk/resources/notification_channel_settings.py:24` +- NotificationChannelSettingsResource.list: `nexla_sdk/resources/notification_channel_settings.py:21` +- NotificationChannelSettingsResource.update: `nexla_sdk/resources/notification_channel_settings.py:32` +### nexla_sdk.resources.notification_settings +- NotificationSettingsResource: `nexla_sdk/resources/notification_settings.py:13` +- NotificationSettingsResource.create: `nexla_sdk/resources/notification_settings.py:137` +- NotificationSettingsResource.delete: `nexla_sdk/resources/notification_settings.py:166` +- NotificationSettingsResource.get: `nexla_sdk/resources/notification_settings.py:125` +- NotificationSettingsResource.list: `nexla_sdk/resources/notification_settings.py:49` +- NotificationSettingsResource.list_all: `nexla_sdk/resources/notification_settings.py:90` +- NotificationSettingsResource.list_by: `nexla_sdk/resources/notification_settings.py:247` +- NotificationSettingsResource.org_create: `nexla_sdk/resources/notification_settings.py:288` +- NotificationSettingsResource.org_delete: `nexla_sdk/resources/notification_settings.py:326` +- NotificationSettingsResource.org_index: `nexla_sdk/resources/notification_settings.py:254` +- NotificationSettingsResource.org_update: `nexla_sdk/resources/notification_settings.py:305` +- NotificationSettingsResource.show_resource_settings: `nexla_sdk/resources/notification_settings.py:177` +- NotificationSettingsResource.show_type_settings: `nexla_sdk/resources/notification_settings.py:213` +- NotificationSettingsResource.update: `nexla_sdk/resources/notification_settings.py:150` +### nexla_sdk.resources.notification_types +- NotificationTypesResource: `nexla_sdk/resources/notification_types.py:7` +- NotificationTypesResource.list: `nexla_sdk/resources/notification_types.py:15` +- NotificationTypesResource.list_all: `nexla_sdk/resources/notification_types.py:19` ### nexla_sdk.resources.notifications - NotificationsResource: `nexla_sdk/resources/notifications.py:19` -- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:195` -- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:285` +- NotificationsResource.create_channel_setting: `nexla_sdk/resources/notifications.py:221` +- NotificationsResource.create_setting: `nexla_sdk/resources/notifications.py:311` - NotificationsResource.delete: `nexla_sdk/resources/notifications.py:40` -- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:90` -- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:242` -- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:330` +- NotificationsResource.delete_all: `nexla_sdk/resources/notifications.py:96` +- NotificationsResource.delete_channel_setting: `nexla_sdk/resources/notifications.py:268` +- NotificationsResource.delete_setting: `nexla_sdk/resources/notifications.py:356` - NotificationsResource.get: `nexla_sdk/resources/notifications.py:27` -- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:211` -- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:100` -- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:361` -- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:299` -- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:343` -- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:167` -- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:152` +- NotificationsResource.get_channel_setting: `nexla_sdk/resources/notifications.py:237` +- NotificationsResource.get_count: `nexla_sdk/resources/notifications.py:111` +- NotificationsResource.get_resource_settings: `nexla_sdk/resources/notifications.py:387` +- NotificationsResource.get_setting: `nexla_sdk/resources/notifications.py:325` +- NotificationsResource.get_settings_by_type: `nexla_sdk/resources/notifications.py:369` +- NotificationsResource.get_type: `nexla_sdk/resources/notifications.py:193` +- NotificationsResource.get_types: `nexla_sdk/resources/notifications.py:178` - NotificationsResource.list: `nexla_sdk/resources/notifications.py:52` -- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:184` -- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:256` -- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:115` -- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:133` -- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:225` -- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:313` +- NotificationsResource.list_channel_settings: `nexla_sdk/resources/notifications.py:210` +- NotificationsResource.list_settings: `nexla_sdk/resources/notifications.py:282` +- NotificationsResource.mark_read: `nexla_sdk/resources/notifications.py:126` +- NotificationsResource.mark_read_for: `nexla_sdk/resources/notifications.py:162` +- NotificationsResource.mark_unread: `nexla_sdk/resources/notifications.py:144` +- NotificationsResource.mark_unread_for: `nexla_sdk/resources/notifications.py:168` +- NotificationsResource.publish_raw: `nexla_sdk/resources/notifications.py:174` +- NotificationsResource.update_channel_setting: `nexla_sdk/resources/notifications.py:251` +- NotificationsResource.update_setting: `nexla_sdk/resources/notifications.py:339` ### nexla_sdk.resources.org_auth_configs - OrgAuthConfigsResource: `nexla_sdk/resources/org_auth_configs.py:8` -- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:31` -- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:45` -- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:26` +- OrgAuthConfigsResource.client_config: `nexla_sdk/resources/org_auth_configs.py:30` +- OrgAuthConfigsResource.create: `nexla_sdk/resources/org_auth_configs.py:43` +- OrgAuthConfigsResource.delete: `nexla_sdk/resources/org_auth_configs.py:57` +- OrgAuthConfigsResource.get: `nexla_sdk/resources/org_auth_configs.py:38` +- OrgAuthConfigsResource.info: `nexla_sdk/resources/org_auth_configs.py:34` - OrgAuthConfigsResource.list: `nexla_sdk/resources/org_auth_configs.py:16` - OrgAuthConfigsResource.list_all: `nexla_sdk/resources/org_auth_configs.py:21` -- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:37` +- OrgAuthConfigsResource.list_sign_on_options: `nexla_sdk/resources/org_auth_configs.py:26` +- OrgAuthConfigsResource.update: `nexla_sdk/resources/org_auth_configs.py:49` +### nexla_sdk.resources.org_tiers +- OrgTiersResource: `nexla_sdk/resources/org_tiers.py:7` +- OrgTiersResource.create: `nexla_sdk/resources/org_tiers.py:21` +- OrgTiersResource.delete: `nexla_sdk/resources/org_tiers.py:27` +- OrgTiersResource.get: `nexla_sdk/resources/org_tiers.py:18` +- OrgTiersResource.list: `nexla_sdk/resources/org_tiers.py:15` +- OrgTiersResource.update: `nexla_sdk/resources/org_tiers.py:24` ### nexla_sdk.resources.organizations - OrganizationsResource: `nexla_sdk/resources/organizations.py:22` -- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:173` -- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:365` -- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:61` -- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:156` -- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:86` -- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:142` -- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:48` -- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:190` -- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:227` -- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:316` -- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:204` -- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:348` -- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:269` -- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:98` -- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:215` -- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:294` +- OrganizationsResource.activate_cluster: `nexla_sdk/resources/organizations.py:273` +- OrganizationsResource.activate_members: `nexla_sdk/resources/organizations.py:190` +- OrganizationsResource.activate_org: `nexla_sdk/resources/organizations.py:245` +- OrganizationsResource.activate_rate_limited_sources: `nexla_sdk/resources/organizations.py:236` +- OrganizationsResource.add_custodians: `nexla_sdk/resources/organizations.py:501` +- OrganizationsResource.create: `nexla_sdk/resources/organizations.py:65` +- OrganizationsResource.create_dashboard_transforms: `nexla_sdk/resources/organizations.py:335` +- OrganizationsResource.create_notification_settings: `nexla_sdk/resources/organizations.py:285` +- OrganizationsResource.deactivate_members: `nexla_sdk/resources/organizations.py:173` +- OrganizationsResource.delete: `nexla_sdk/resources/organizations.py:90` +- OrganizationsResource.delete_dashboard_transforms: `nexla_sdk/resources/organizations.py:347` +- OrganizationsResource.delete_members: `nexla_sdk/resources/organizations.py:159` +- OrganizationsResource.delete_notification_settings: `nexla_sdk/resources/organizations.py:297` +- OrganizationsResource.disable_feature: `nexla_sdk/resources/organizations.py:315` +- OrganizationsResource.enable_feature: `nexla_sdk/resources/organizations.py:311` +- OrganizationsResource.get: `nexla_sdk/resources/organizations.py:52` +- OrganizationsResource.get_account_rate_limited: `nexla_sdk/resources/organizations.py:232` +- OrganizationsResource.get_account_summary: `nexla_sdk/resources/organizations.py:207` +- OrganizationsResource.get_audit_log: `nexla_sdk/resources/organizations.py:363` +- OrganizationsResource.get_auth_settings: `nexla_sdk/resources/organizations.py:452` +- OrganizationsResource.get_clusters: `nexla_sdk/resources/organizations.py:265` +- OrganizationsResource.get_current_account_summary: `nexla_sdk/resources/organizations.py:221` +- OrganizationsResource.get_custodians: `nexla_sdk/resources/organizations.py:484` +- OrganizationsResource.get_dashboard_transforms: `nexla_sdk/resources/organizations.py:331` +- OrganizationsResource.get_data_sets_catalog_config: `nexla_sdk/resources/organizations.py:307` +- OrganizationsResource.get_flow_status_metrics: `nexla_sdk/resources/organizations.py:405` +- OrganizationsResource.get_flows_account_metrics: `nexla_sdk/resources/organizations.py:359` +- OrganizationsResource.get_flows_dashboard: `nexla_sdk/resources/organizations.py:351` +- OrganizationsResource.get_flows_report: `nexla_sdk/resources/organizations.py:261` +- OrganizationsResource.get_flows_status_metrics: `nexla_sdk/resources/organizations.py:355` +- OrganizationsResource.get_login_history: `nexla_sdk/resources/organizations.py:102` +- OrganizationsResource.get_members: `nexla_sdk/resources/organizations.py:115` +- OrganizationsResource.get_metrics: `nexla_sdk/resources/organizations.py:107` +- OrganizationsResource.get_org_flow_account_metrics: `nexla_sdk/resources/organizations.py:319` +- OrganizationsResource.get_resource_audit_log: `nexla_sdk/resources/organizations.py:430` - OrganizationsResource.list: `nexla_sdk/resources/organizations.py:30` -- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:375` -- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:127` -- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:73` -- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:329` -- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:355` -- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:112` +- OrganizationsResource.list_all: `nexla_sdk/resources/organizations.py:48` +- OrganizationsResource.list_data_sets_catalog_configs: `nexla_sdk/resources/organizations.py:303` +- OrganizationsResource.list_notification_settings: `nexla_sdk/resources/organizations.py:281` +- OrganizationsResource.remove_custodians: `nexla_sdk/resources/organizations.py:511` +- OrganizationsResource.replace_members: `nexla_sdk/resources/organizations.py:144` +- OrganizationsResource.revert_cluster: `nexla_sdk/resources/organizations.py:277` +- OrganizationsResource.set_rate_limits: `nexla_sdk/resources/organizations.py:253` +- OrganizationsResource.throttle: `nexla_sdk/resources/organizations.py:257` +- OrganizationsResource.update: `nexla_sdk/resources/organizations.py:77` +- OrganizationsResource.update_auth_setting: `nexla_sdk/resources/organizations.py:465` +- OrganizationsResource.update_cluster: `nexla_sdk/resources/organizations.py:269` +- OrganizationsResource.update_custodians: `nexla_sdk/resources/organizations.py:491` +- OrganizationsResource.update_dashboard_transforms: `nexla_sdk/resources/organizations.py:341` +- OrganizationsResource.update_members: `nexla_sdk/resources/organizations.py:129` +- OrganizationsResource.update_notification_settings: `nexla_sdk/resources/organizations.py:291` ### nexla_sdk.resources.projects - ProjectsResource: `nexla_sdk/resources/projects.py:13` -- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:170` -- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:113` +- ProjectsResource.add_data_flows: `nexla_sdk/resources/projects.py:184` +- ProjectsResource.add_data_flows_legacy: `nexla_sdk/resources/projects.py:215` +- ProjectsResource.add_flows: `nexla_sdk/resources/projects.py:127` +- ProjectsResource.copy: `nexla_sdk/resources/projects.py:99` - ProjectsResource.create: `nexla_sdk/resources/projects.py:59` - ProjectsResource.delete: `nexla_sdk/resources/projects.py:87` - ProjectsResource.get: `nexla_sdk/resources/projects.py:43` -- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:99` +- ProjectsResource.get_data_flows_legacy: `nexla_sdk/resources/projects.py:194` +- ProjectsResource.get_flows: `nexla_sdk/resources/projects.py:113` +- ProjectsResource.get_resources_access: `nexla_sdk/resources/projects.py:110` - ProjectsResource.list: `nexla_sdk/resources/projects.py:21` -- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:190` -- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:151` -- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:180` -- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:132` -- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:200` +- ProjectsResource.remove_data_flows: `nexla_sdk/resources/projects.py:233` +- ProjectsResource.remove_data_flows_legacy: `nexla_sdk/resources/projects.py:243` +- ProjectsResource.remove_flows: `nexla_sdk/resources/projects.py:165` +- ProjectsResource.replace_data_flows: `nexla_sdk/resources/projects.py:205` +- ProjectsResource.replace_data_flows_legacy: `nexla_sdk/resources/projects.py:224` +- ProjectsResource.replace_flows: `nexla_sdk/resources/projects.py:146` +- ProjectsResource.search: `nexla_sdk/resources/projects.py:104` +- ProjectsResource.search_flows: `nexla_sdk/resources/projects.py:252` +- ProjectsResource.search_tags: `nexla_sdk/resources/projects.py:107` - ProjectsResource.update: `nexla_sdk/resources/projects.py:74` +### nexla_sdk.resources.quarantine_settings +- QuarantineSettingsResource: `nexla_sdk/resources/quarantine_settings.py:7` +- QuarantineSettingsResource.get: `nexla_sdk/resources/quarantine_settings.py:18` +- QuarantineSettingsResource.list: `nexla_sdk/resources/quarantine_settings.py:15` +- QuarantineSettingsResource.list_all: `nexla_sdk/resources/quarantine_settings.py:21` +### nexla_sdk.resources.resource_parameters +- ResourceParametersResource: `nexla_sdk/resources/resource_parameters.py:11` +- ResourceParametersResource.create: `nexla_sdk/resources/resource_parameters.py:25` +- ResourceParametersResource.delete: `nexla_sdk/resources/resource_parameters.py:37` +- ResourceParametersResource.get: `nexla_sdk/resources/resource_parameters.py:22` +- ResourceParametersResource.list: `nexla_sdk/resources/resource_parameters.py:19` +- ResourceParametersResource.update: `nexla_sdk/resources/resource_parameters.py:30` ### nexla_sdk.resources.runtimes - RuntimesResource: `nexla_sdk/resources/runtimes.py:8` - RuntimesResource.activate: `nexla_sdk/resources/runtimes.py:45` @@ -2204,37 +5523,124 @@ Each API page embeds per-symbol source links. Summary below. - RuntimesResource.list: `nexla_sdk/resources/runtimes.py:16` - RuntimesResource.pause: `nexla_sdk/resources/runtimes.py:51` - RuntimesResource.update: `nexla_sdk/resources/runtimes.py:33` +### nexla_sdk.resources.search_health +- SearchHealthResource: `nexla_sdk/resources/search_health.py:6` +- SearchHealthResource.get: `nexla_sdk/resources/search_health.py:14` +- SearchHealthResource.test: `nexla_sdk/resources/search_health.py:17` ### nexla_sdk.resources.self_signup - SelfSignupResource: `nexla_sdk/resources/self_signup.py:7` -- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:39` +- SelfSignupResource.add_blocked_domain: `nexla_sdk/resources/self_signup.py:40` - SelfSignupResource.approve_request: `nexla_sdk/resources/self_signup.py:29` -- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:51` -- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:35` +- SelfSignupResource.delete_blocked_domain: `nexla_sdk/resources/self_signup.py:52` +- SelfSignupResource.list_blocked_domains: `nexla_sdk/resources/self_signup.py:36` - SelfSignupResource.list_requests: `nexla_sdk/resources/self_signup.py:25` - SelfSignupResource.signup: `nexla_sdk/resources/self_signup.py:16` -- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:45` +- SelfSignupResource.update_blocked_domain: `nexla_sdk/resources/self_signup.py:46` - SelfSignupResource.verify_email: `nexla_sdk/resources/self_signup.py:19` +### nexla_sdk.resources.self_signup_blocked_domains +- SelfSignupBlockedDomainsResource: `nexla_sdk/resources/self_signup_blocked_domains.py:6` +- SelfSignupBlockedDomainsResource.create: `nexla_sdk/resources/self_signup_blocked_domains.py:17` +- SelfSignupBlockedDomainsResource.delete: `nexla_sdk/resources/self_signup_blocked_domains.py:23` +- SelfSignupBlockedDomainsResource.list: `nexla_sdk/resources/self_signup_blocked_domains.py:14` +- SelfSignupBlockedDomainsResource.update: `nexla_sdk/resources/self_signup_blocked_domains.py:20` +### nexla_sdk.resources.service_keys +- ServiceKeysResource: `nexla_sdk/resources/service_keys.py:10` +- ServiceKeysResource.activate: `nexla_sdk/resources/service_keys.py:151` +- ServiceKeysResource.create: `nexla_sdk/resources/service_keys.py:92` +- ServiceKeysResource.delete: `nexla_sdk/resources/service_keys.py:120` +- ServiceKeysResource.get: `nexla_sdk/resources/service_keys.py:79` +- ServiceKeysResource.list: `nexla_sdk/resources/service_keys.py:47` +- ServiceKeysResource.pause: `nexla_sdk/resources/service_keys.py:164` +- ServiceKeysResource.rotate: `nexla_sdk/resources/service_keys.py:135` +- ServiceKeysResource.update: `nexla_sdk/resources/service_keys.py:103` ### nexla_sdk.resources.sources - SourcesResource: `nexla_sdk/resources/sources.py:12` -- SourcesResource.activate: `nexla_sdk/resources/sources.py:98` -- SourcesResource.copy: `nexla_sdk/resources/sources.py:122` -- SourcesResource.create: `nexla_sdk/resources/sources.py:58` -- SourcesResource.delete: `nexla_sdk/resources/sources.py:86` -- SourcesResource.get: `nexla_sdk/resources/sources.py:42` +- SourcesResource.activate: `nexla_sdk/resources/sources.py:171` +- SourcesResource.activate_api_key: `nexla_sdk/resources/sources.py:374` +- SourcesResource.copy: `nexla_sdk/resources/sources.py:195` +- SourcesResource.create: `nexla_sdk/resources/sources.py:84` +- SourcesResource.create_api_key: `nexla_sdk/resources/sources.py:360` +- SourcesResource.create_dashboard_transforms: `nexla_sdk/resources/sources.py:287` +- SourcesResource.create_quarantine_settings: `nexla_sdk/resources/sources.py:267` +- SourcesResource.delete: `nexla_sdk/resources/sources.py:112` +- SourcesResource.delete_api_key: `nexla_sdk/resources/sources.py:386` +- SourcesResource.delete_dashboard_transforms: `nexla_sdk/resources/sources.py:299` +- SourcesResource.delete_quarantine_settings: `nexla_sdk/resources/sources.py:279` +- SourcesResource.edit_flow_triggers: `nexla_sdk/resources/sources.py:329` +- SourcesResource.get: `nexla_sdk/resources/sources.py:68` +- SourcesResource.get_api_key: `nexla_sdk/resources/sources.py:356` +- SourcesResource.get_dashboard_transforms: `nexla_sdk/resources/sources.py:283` +- SourcesResource.get_flow: `nexla_sdk/resources/sources.py:124` +- SourcesResource.get_flow_dashboard: `nexla_sdk/resources/sources.py:127` +- SourcesResource.get_flow_logs: `nexla_sdk/resources/sources.py:142` +- SourcesResource.get_flow_metrics: `nexla_sdk/resources/sources.py:137` +- SourcesResource.get_flow_status_metrics: `nexla_sdk/resources/sources.py:132` +- SourcesResource.get_metrics: `nexla_sdk/resources/sources.py:147` +- SourcesResource.get_offset: `nexla_sdk/resources/sources.py:163` +- SourcesResource.get_quarantine_aggregation: `nexla_sdk/resources/sources.py:396` +- SourcesResource.get_quarantine_offset: `nexla_sdk/resources/sources.py:155` +- SourcesResource.get_quarantine_settings: `nexla_sdk/resources/sources.py:263` +- SourcesResource.get_reingested_files: `nexla_sdk/resources/sources.py:255` - SourcesResource.list: `nexla_sdk/resources/sources.py:20` -- SourcesResource.pause: `nexla_sdk/resources/sources.py:110` -- SourcesResource.update: `nexla_sdk/resources/sources.py:73` +- SourcesResource.list_accessible: `nexla_sdk/resources/sources.py:58` +- SourcesResource.list_all: `nexla_sdk/resources/sources.py:48` +- SourcesResource.list_all_condensed: `nexla_sdk/resources/sources.py:52` +- SourcesResource.list_all_ids: `nexla_sdk/resources/sources.py:55` +- SourcesResource.list_api_keys: `nexla_sdk/resources/sources.py:346` +- SourcesResource.list_data_sinks: `nexla_sdk/resources/sources.py:309` +- SourcesResource.list_flow_triggers: `nexla_sdk/resources/sources.py:325` +- SourcesResource.list_runs: `nexla_sdk/resources/sources.py:321` +- SourcesResource.pause: `nexla_sdk/resources/sources.py:183` +- SourcesResource.pause_all_api_keys: `nexla_sdk/resources/sources.py:382` +- SourcesResource.pause_api_key: `nexla_sdk/resources/sources.py:378` +- SourcesResource.probe_authenticate: `nexla_sdk/resources/sources.py:219` +- SourcesResource.probe_detect_schemas: `nexla_sdk/resources/sources.py:239` +- SourcesResource.probe_list_buckets: `nexla_sdk/resources/sources.py:211` +- SourcesResource.probe_list_files: `nexla_sdk/resources/sources.py:223` +- SourcesResource.probe_quarantine_sample: `nexla_sdk/resources/sources.py:245` +- SourcesResource.probe_read_file: `nexla_sdk/resources/sources.py:233` +- SourcesResource.probe_sample: `nexla_sdk/resources/sources.py:251` +- SourcesResource.probe_summary: `nexla_sdk/resources/sources.py:215` +- SourcesResource.probe_tree: `nexla_sdk/resources/sources.py:229` +- SourcesResource.ready: `nexla_sdk/resources/sources.py:317` +- SourcesResource.reingest_files: `nexla_sdk/resources/sources.py:259` +- SourcesResource.rotate_api_key: `nexla_sdk/resources/sources.py:370` +- SourcesResource.run_now: `nexla_sdk/resources/sources.py:313` +- SourcesResource.script_source_config: `nexla_sdk/resources/sources.py:61` +- SourcesResource.search: `nexla_sdk/resources/sources.py:42` +- SourcesResource.search_api_keys: `nexla_sdk/resources/sources.py:350` +- SourcesResource.search_tags: `nexla_sdk/resources/sources.py:45` +- SourcesResource.test_config: `nexla_sdk/resources/sources.py:306` +- SourcesResource.trigger_quarantine_aggregation: `nexla_sdk/resources/sources.py:390` +- SourcesResource.update: `nexla_sdk/resources/sources.py:99` +- SourcesResource.update_api_key: `nexla_sdk/resources/sources.py:364` +- SourcesResource.update_dashboard_transforms: `nexla_sdk/resources/sources.py:293` +- SourcesResource.update_quarantine_settings: `nexla_sdk/resources/sources.py:273` +- SourcesResource.update_runtime_status: `nexla_sdk/resources/sources.py:64` +- SourcesResource.validate_config: `nexla_sdk/resources/sources.py:303` ### nexla_sdk.resources.teams -- TeamsResource: `nexla_sdk/resources/teams.py:8` -- TeamsResource.add_members: `nexla_sdk/resources/teams.py:104` -- TeamsResource.create: `nexla_sdk/resources/teams.py:50` -- TeamsResource.delete: `nexla_sdk/resources/teams.py:78` -- TeamsResource.get: `nexla_sdk/resources/teams.py:34` -- TeamsResource.get_members: `nexla_sdk/resources/teams.py:90` -- TeamsResource.list: `nexla_sdk/resources/teams.py:16` -- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:136` -- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:119` -- TeamsResource.update: `nexla_sdk/resources/teams.py:65` +- TeamsResource: `nexla_sdk/resources/teams.py:9` +- TeamsResource.add_members: `nexla_sdk/resources/teams.py:105` +- TeamsResource.create: `nexla_sdk/resources/teams.py:51` +- TeamsResource.delete: `nexla_sdk/resources/teams.py:79` +- TeamsResource.get: `nexla_sdk/resources/teams.py:35` +- TeamsResource.get_audit_log: `nexla_sdk/resources/teams.py:155` +- TeamsResource.get_members: `nexla_sdk/resources/teams.py:91` +- TeamsResource.list: `nexla_sdk/resources/teams.py:17` +- TeamsResource.remove_members: `nexla_sdk/resources/teams.py:137` +- TeamsResource.replace_members: `nexla_sdk/resources/teams.py:120` +- TeamsResource.update: `nexla_sdk/resources/teams.py:66` +### nexla_sdk.resources.tokens +- TokensResource: `nexla_sdk/resources/tokens.py:6` +- TokensResource.aws_marketplace_token: `nexla_sdk/resources/tokens.py:39` +- TokensResource.create_google_token: `nexla_sdk/resources/tokens.py:20` +- TokensResource.create_idp_token: `nexla_sdk/resources/tokens.py:29` +- TokensResource.create_token: `nexla_sdk/resources/tokens.py:14` +- TokensResource.logout: `nexla_sdk/resources/tokens.py:26` +- TokensResource.metadata: `nexla_sdk/resources/tokens.py:35` +- TokensResource.refresh_token: `nexla_sdk/resources/tokens.py:23` +- TokensResource.resource_authorize: `nexla_sdk/resources/tokens.py:42` +- TokensResource.update_token: `nexla_sdk/resources/tokens.py:17` ### nexla_sdk.resources.transforms - TransformsResource: `nexla_sdk/resources/transforms.py:8` - TransformsResource.copy: `nexla_sdk/resources/transforms.py:50` @@ -2243,31 +5649,130 @@ Each API page embeds per-symbol source links. Summary below. - TransformsResource.get: `nexla_sdk/resources/transforms.py:34` - TransformsResource.list: `nexla_sdk/resources/transforms.py:16` - TransformsResource.list_public: `nexla_sdk/resources/transforms.py:54` +- TransformsResource.search: `nexla_sdk/resources/transforms.py:60` +- TransformsResource.search_tags: `nexla_sdk/resources/transforms.py:63` +- TransformsResource.transform: `nexla_sdk/resources/transforms.py:66` +- TransformsResource.transform_data: `nexla_sdk/resources/transforms.py:73` +- TransformsResource.transform_features: `nexla_sdk/resources/transforms.py:70` - TransformsResource.update: `nexla_sdk/resources/transforms.py:42` +### nexla_sdk.resources.user_settings +- UserSettingsResource: `nexla_sdk/resources/user_settings.py:8` +- UserSettingsResource.create: `nexla_sdk/resources/user_settings.py:27` +- UserSettingsResource.delete: `nexla_sdk/resources/user_settings.py:37` +- UserSettingsResource.get: `nexla_sdk/resources/user_settings.py:24` +- UserSettingsResource.list: `nexla_sdk/resources/user_settings.py:16` +- UserSettingsResource.search: `nexla_sdk/resources/user_settings.py:19` +- UserSettingsResource.update: `nexla_sdk/resources/user_settings.py:30` +### nexla_sdk.resources.user_tiers +- UserTiersResource: `nexla_sdk/resources/user_tiers.py:7` +- UserTiersResource.create: `nexla_sdk/resources/user_tiers.py:21` +- UserTiersResource.delete: `nexla_sdk/resources/user_tiers.py:27` +- UserTiersResource.get: `nexla_sdk/resources/user_tiers.py:18` +- UserTiersResource.list: `nexla_sdk/resources/user_tiers.py:15` +- UserTiersResource.update: `nexla_sdk/resources/user_tiers.py:24` ### nexla_sdk.resources.users -- UsersResource: `nexla_sdk/resources/users.py:9` -- UsersResource.create: `nexla_sdk/resources/users.py:65` -- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:134` -- UsersResource.delete: `nexla_sdk/resources/users.py:93` -- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:168` -- UsersResource.get: `nexla_sdk/resources/users.py:43` -- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:258` -- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:181` -- UsersResource.get_current: `nexla_sdk/resources/users.py:116` -- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:339` -- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:319` -- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:290` -- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:121` -- UsersResource.get_settings: `nexla_sdk/resources/users.py:105` -- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:225` -- UsersResource.list: `nexla_sdk/resources/users.py:17` -- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:240` -- UsersResource.update: `nexla_sdk/resources/users.py:80` -- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:152` +- UsersResource: `nexla_sdk/resources/users.py:10` +- UsersResource.activate: `nexla_sdk/resources/users.py:332` +- UsersResource.activate_api_key: `nexla_sdk/resources/users.py:462` +- UsersResource.activate_rate_limited_sources: `nexla_sdk/resources/users.py:345` +- UsersResource.change_password: `nexla_sdk/resources/users.py:132` +- UsersResource.create: `nexla_sdk/resources/users.py:69` +- UsersResource.create_api_key: `nexla_sdk/resources/users.py:448` +- UsersResource.create_credit: `nexla_sdk/resources/users.py:398` +- UsersResource.create_dashboard_transforms: `nexla_sdk/resources/users.py:302` +- UsersResource.create_quarantine_settings: `nexla_sdk/resources/users.py:206` +- UsersResource.delete: `nexla_sdk/resources/users.py:97` +- UsersResource.delete_api_key: `nexla_sdk/resources/users.py:474` +- UsersResource.delete_credit: `nexla_sdk/resources/users.py:429` +- UsersResource.delete_dashboard_transforms: `nexla_sdk/resources/users.py:314` +- UsersResource.delete_quarantine_settings: `nexla_sdk/resources/users.py:240` +- UsersResource.expire_credit: `nexla_sdk/resources/users.py:425` +- UsersResource.get: `nexla_sdk/resources/users.py:47` +- UsersResource.get_account_metrics: `nexla_sdk/resources/users.py:479` +- UsersResource.get_account_rate_limited: `nexla_sdk/resources/users.py:354` +- UsersResource.get_account_summary: `nexla_sdk/resources/users.py:110` +- UsersResource.get_api_key: `nexla_sdk/resources/users.py:444` +- UsersResource.get_api_key_events: `nexla_sdk/resources/users.py:168` +- UsersResource.get_audit_history: `nexla_sdk/resources/users.py:160` +- UsersResource.get_audit_log: `nexla_sdk/resources/users.py:258` +- UsersResource.get_credit: `nexla_sdk/resources/users.py:404` +- UsersResource.get_current: `nexla_sdk/resources/users.py:154` +- UsersResource.get_daily_metrics: `nexla_sdk/resources/users.py:560` +- UsersResource.get_dashboard_metrics: `nexla_sdk/resources/users.py:540` +- UsersResource.get_dashboard_transforms: `nexla_sdk/resources/users.py:254` +- UsersResource.get_flow_status_metrics: `nexla_sdk/resources/users.py:511` +- UsersResource.get_flows_account_metrics: `nexla_sdk/resources/users.py:327` +- UsersResource.get_flows_dashboard: `nexla_sdk/resources/users.py:319` +- UsersResource.get_flows_status_metrics: `nexla_sdk/resources/users.py:323` +- UsersResource.get_login_history: `nexla_sdk/resources/users.py:164` +- UsersResource.get_metrics: `nexla_sdk/resources/users.py:180` +- UsersResource.get_orgs: `nexla_sdk/resources/users.py:188` +- UsersResource.get_quarantine_settings: `nexla_sdk/resources/users.py:193` +- UsersResource.get_resource_audit_log: `nexla_sdk/resources/users.py:172` +- UsersResource.get_settings: `nexla_sdk/resources/users.py:143` +- UsersResource.get_sso_options: `nexla_sdk/resources/users.py:136` +- UsersResource.get_transferable_resources: `nexla_sdk/resources/users.py:359` +- UsersResource.get_user_account_summary: `nexla_sdk/resources/users.py:114` +- UsersResource.list: `nexla_sdk/resources/users.py:18` +- UsersResource.list_api_keys: `nexla_sdk/resources/users.py:434` +- UsersResource.list_credits: `nexla_sdk/resources/users.py:393` +- UsersResource.list_sso_options: `nexla_sdk/resources/users.py:44` +- UsersResource.lock_account: `nexla_sdk/resources/users.py:337` +- UsersResource.password_entropy: `nexla_sdk/resources/users.py:126` +- UsersResource.pause_all_api_keys: `nexla_sdk/resources/users.py:470` +- UsersResource.pause_api_key: `nexla_sdk/resources/users.py:466` +- UsersResource.refresh_credit: `nexla_sdk/resources/users.py:421` +- UsersResource.refresh_credits: `nexla_sdk/resources/users.py:417` +- UsersResource.reset_password: `nexla_sdk/resources/users.py:120` +- UsersResource.rotate_api_key: `nexla_sdk/resources/users.py:458` +- UsersResource.search_api_keys: `nexla_sdk/resources/users.py:438` +- UsersResource.send_invite: `nexla_sdk/resources/users.py:129` +- UsersResource.set_password: `nexla_sdk/resources/users.py:123` +- UsersResource.transfer_resources: `nexla_sdk/resources/users.py:374` +- UsersResource.unlock_account: `nexla_sdk/resources/users.py:341` +- UsersResource.update: `nexla_sdk/resources/users.py:84` +- UsersResource.update_api_key: `nexla_sdk/resources/users.py:452` +- UsersResource.update_dashboard_transforms: `nexla_sdk/resources/users.py:308` +- UsersResource.update_quarantine_settings: `nexla_sdk/resources/users.py:224` +- UsersResource.use_credit: `nexla_sdk/resources/users.py:413` +- UsersResource.use_credits: `nexla_sdk/resources/users.py:409` +### nexla_sdk.resources.validators +- ValidatorsResource: `nexla_sdk/resources/validators.py:14` +- ValidatorsResource.copy: `nexla_sdk/resources/validators.py:145` +- ValidatorsResource.create: `nexla_sdk/resources/validators.py:109` +- ValidatorsResource.delete: `nexla_sdk/resources/validators.py:134` +- ValidatorsResource.get: `nexla_sdk/resources/validators.py:97` +- ValidatorsResource.list: `nexla_sdk/resources/validators.py:48` +- ValidatorsResource.list_public: `nexla_sdk/resources/validators.py:74` +- ValidatorsResource.search: `nexla_sdk/resources/validators.py:174` +- ValidatorsResource.search_tags: `nexla_sdk/resources/validators.py:161` +- ValidatorsResource.update: `nexla_sdk/resources/validators.py:120` +### nexla_sdk.resources.vendor_endpoints +- VendorEndpointsResource: `nexla_sdk/resources/vendor_endpoints.py:11` +- VendorEndpointsResource.create: `nexla_sdk/resources/vendor_endpoints.py:25` +- VendorEndpointsResource.delete: `nexla_sdk/resources/vendor_endpoints.py:37` +- VendorEndpointsResource.delete_all: `nexla_sdk/resources/vendor_endpoints.py:43` +- VendorEndpointsResource.get: `nexla_sdk/resources/vendor_endpoints.py:22` +- VendorEndpointsResource.list: `nexla_sdk/resources/vendor_endpoints.py:19` +- VendorEndpointsResource.update: `nexla_sdk/resources/vendor_endpoints.py:30` +- VendorEndpointsResource.update_all: `nexla_sdk/resources/vendor_endpoints.py:40` +### nexla_sdk.resources.vendors +- VendorsResource: `nexla_sdk/resources/vendors.py:10` +- VendorsResource.create: `nexla_sdk/resources/vendors.py:111` +- VendorsResource.delete: `nexla_sdk/resources/vendors.py:155` +- VendorsResource.delete_all: `nexla_sdk/resources/vendors.py:182` +- VendorsResource.delete_auth_template: `nexla_sdk/resources/vendors.py:186` +- VendorsResource.delete_by_name: `nexla_sdk/resources/vendors.py:166` +- VendorsResource.get: `nexla_sdk/resources/vendors.py:80` +- VendorsResource.get_by_name: `nexla_sdk/resources/vendors.py:95` +- VendorsResource.list: `nexla_sdk/resources/vendors.py:53` +- VendorsResource.update: `nexla_sdk/resources/vendors.py:122` +- VendorsResource.update_all: `nexla_sdk/resources/vendors.py:178` +- VendorsResource.update_by_name: `nexla_sdk/resources/vendors.py:136` ### nexla_sdk.resources.webhooks - WebhooksResource: `nexla_sdk/resources/webhooks.py:11` - WebhooksResource.send_many_records: `nexla_sdk/resources/webhooks.py:173` - WebhooksResource.send_one_record: `nexla_sdk/resources/webhooks.py:126` ### nexla_sdk.telemetry -- get_tracer(): `nexla_sdk/telemetry.py:58` -- is_tracing_configured(): `nexla_sdk/telemetry.py:84` +- get_tracer(): `nexla_sdk/telemetry.py:56` +- is_tracing_configured(): `nexla_sdk/telemetry.py:82` diff --git a/docs-site/docs/api/python/modules-index.md b/docs-site/docs/api/python/modules-index.md index 389a2b6..3e15ebe 100644 --- a/docs-site/docs/api/python/modules-index.md +++ b/docs-site/docs/api/python/modules-index.md @@ -8,12 +8,18 @@ slug: /api/python/modules - [nexla_sdk.auth](./modules/nexla_sdk.auth.mdx) - [nexla_sdk.client](./modules/nexla_sdk.client.mdx) - [nexla_sdk.exceptions](./modules/nexla_sdk.exceptions.mdx) +- [nexla_sdk.generated](./modules/nexla_sdk.generated.mdx) +- [nexla_sdk.generated.operation_map](./modules/nexla_sdk.generated.operation_map.mdx) +- [nexla_sdk.generated.schema](./modules/nexla_sdk.generated.schema.mdx) - [nexla_sdk.http_client](./modules/nexla_sdk.http_client.mdx) - [nexla_sdk.models](./modules/nexla_sdk.models.mdx) - [nexla_sdk.models.access](./modules/nexla_sdk.models.access.mdx) - [nexla_sdk.models.access.enums](./modules/nexla_sdk.models.access.enums.mdx) - [nexla_sdk.models.access.requests](./modules/nexla_sdk.models.access.requests.mdx) - [nexla_sdk.models.access.responses](./modules/nexla_sdk.models.access.responses.mdx) +- [nexla_sdk.models.api_keys](./modules/nexla_sdk.models.api_keys.mdx) +- [nexla_sdk.models.api_keys.requests](./modules/nexla_sdk.models.api_keys.requests.mdx) +- [nexla_sdk.models.api_keys.responses](./modules/nexla_sdk.models.api_keys.responses.mdx) - [nexla_sdk.models.approval_requests](./modules/nexla_sdk.models.approval_requests.mdx) - [nexla_sdk.models.approval_requests.requests](./modules/nexla_sdk.models.approval_requests.requests.mdx) - [nexla_sdk.models.approval_requests.responses](./modules/nexla_sdk.models.approval_requests.responses.mdx) @@ -23,15 +29,43 @@ slug: /api/python/modules - [nexla_sdk.models.attribute_transforms](./modules/nexla_sdk.models.attribute_transforms.mdx) - [nexla_sdk.models.attribute_transforms.requests](./modules/nexla_sdk.models.attribute_transforms.requests.mdx) - [nexla_sdk.models.attribute_transforms.responses](./modules/nexla_sdk.models.attribute_transforms.responses.mdx) +- [nexla_sdk.models.auth_parameters](./modules/nexla_sdk.models.auth_parameters.mdx) +- [nexla_sdk.models.auth_parameters.requests](./modules/nexla_sdk.models.auth_parameters.requests.mdx) +- [nexla_sdk.models.auth_parameters.responses](./modules/nexla_sdk.models.auth_parameters.responses.mdx) +- [nexla_sdk.models.auth_templates](./modules/nexla_sdk.models.auth_templates.mdx) +- [nexla_sdk.models.auth_templates.requests](./modules/nexla_sdk.models.auth_templates.requests.mdx) +- [nexla_sdk.models.auth_templates.responses](./modules/nexla_sdk.models.auth_templates.responses.mdx) - [nexla_sdk.models.base](./modules/nexla_sdk.models.base.mdx) +- [nexla_sdk.models.catalog_configs](./modules/nexla_sdk.models.catalog_configs.mdx) +- [nexla_sdk.models.catalog_configs.requests](./modules/nexla_sdk.models.catalog_configs.requests.mdx) +- [nexla_sdk.models.catalog_configs.responses](./modules/nexla_sdk.models.catalog_configs.responses.mdx) +- [nexla_sdk.models.catalog_refs](./modules/nexla_sdk.models.catalog_refs.mdx) +- [nexla_sdk.models.catalog_refs.requests](./modules/nexla_sdk.models.catalog_refs.requests.mdx) +- [nexla_sdk.models.catalog_refs.responses](./modules/nexla_sdk.models.catalog_refs.responses.mdx) +- [nexla_sdk.models.clusters](./modules/nexla_sdk.models.clusters.mdx) +- [nexla_sdk.models.clusters.requests](./modules/nexla_sdk.models.clusters.requests.mdx) +- [nexla_sdk.models.clusters.responses](./modules/nexla_sdk.models.clusters.responses.mdx) - [nexla_sdk.models.code_containers](./modules/nexla_sdk.models.code_containers.mdx) - [nexla_sdk.models.code_containers.requests](./modules/nexla_sdk.models.code_containers.requests.mdx) - [nexla_sdk.models.code_containers.responses](./modules/nexla_sdk.models.code_containers.responses.mdx) - [nexla_sdk.models.common](./modules/nexla_sdk.models.common.mdx) +- [nexla_sdk.models.connectors](./modules/nexla_sdk.models.connectors.mdx) +- [nexla_sdk.models.connectors.enums](./modules/nexla_sdk.models.connectors.enums.mdx) +- [nexla_sdk.models.connectors.requests](./modules/nexla_sdk.models.connectors.requests.mdx) +- [nexla_sdk.models.connectors.responses](./modules/nexla_sdk.models.connectors.responses.mdx) - [nexla_sdk.models.credentials](./modules/nexla_sdk.models.credentials.mdx) - [nexla_sdk.models.credentials.enums](./modules/nexla_sdk.models.credentials.enums.mdx) - [nexla_sdk.models.credentials.requests](./modules/nexla_sdk.models.credentials.requests.mdx) - [nexla_sdk.models.credentials.responses](./modules/nexla_sdk.models.credentials.responses.mdx) +- [nexla_sdk.models.custom_data_flows](./modules/nexla_sdk.models.custom_data_flows.mdx) +- [nexla_sdk.models.custom_data_flows.requests](./modules/nexla_sdk.models.custom_data_flows.requests.mdx) +- [nexla_sdk.models.custom_data_flows.responses](./modules/nexla_sdk.models.custom_data_flows.responses.mdx) +- [nexla_sdk.models.dashboard_transforms](./modules/nexla_sdk.models.dashboard_transforms.mdx) +- [nexla_sdk.models.dashboard_transforms.requests](./modules/nexla_sdk.models.dashboard_transforms.requests.mdx) +- [nexla_sdk.models.dashboard_transforms.responses](./modules/nexla_sdk.models.dashboard_transforms.responses.mdx) +- [nexla_sdk.models.data_credentials_groups](./modules/nexla_sdk.models.data_credentials_groups.mdx) +- [nexla_sdk.models.data_credentials_groups.requests](./modules/nexla_sdk.models.data_credentials_groups.requests.mdx) +- [nexla_sdk.models.data_credentials_groups.responses](./modules/nexla_sdk.models.data_credentials_groups.responses.mdx) - [nexla_sdk.models.data_schemas](./modules/nexla_sdk.models.data_schemas.mdx) - [nexla_sdk.models.data_schemas.responses](./modules/nexla_sdk.models.data_schemas.responses.mdx) - [nexla_sdk.models.destinations](./modules/nexla_sdk.models.destinations.mdx) @@ -39,8 +73,13 @@ slug: /api/python/modules - [nexla_sdk.models.destinations.requests](./modules/nexla_sdk.models.destinations.requests.mdx) - [nexla_sdk.models.destinations.responses](./modules/nexla_sdk.models.destinations.responses.mdx) - [nexla_sdk.models.doc_containers](./modules/nexla_sdk.models.doc_containers.mdx) +- [nexla_sdk.models.doc_containers.requests](./modules/nexla_sdk.models.doc_containers.requests.mdx) - [nexla_sdk.models.doc_containers.responses](./modules/nexla_sdk.models.doc_containers.responses.mdx) - [nexla_sdk.models.enums](./modules/nexla_sdk.models.enums.mdx) +- [nexla_sdk.models.flexible_enums](./modules/nexla_sdk.models.flexible_enums.mdx) +- [nexla_sdk.models.flow_triggers](./modules/nexla_sdk.models.flow_triggers.mdx) +- [nexla_sdk.models.flow_triggers.requests](./modules/nexla_sdk.models.flow_triggers.requests.mdx) +- [nexla_sdk.models.flow_triggers.responses](./modules/nexla_sdk.models.flow_triggers.responses.mdx) - [nexla_sdk.models.flows](./modules/nexla_sdk.models.flows.mdx) - [nexla_sdk.models.flows.requests](./modules/nexla_sdk.models.flows.requests.mdx) - [nexla_sdk.models.flows.responses](./modules/nexla_sdk.models.flows.responses.mdx) @@ -60,12 +99,22 @@ slug: /api/python/modules - [nexla_sdk.models.nexsets.enums](./modules/nexla_sdk.models.nexsets.enums.mdx) - [nexla_sdk.models.nexsets.requests](./modules/nexla_sdk.models.nexsets.requests.mdx) - [nexla_sdk.models.nexsets.responses](./modules/nexla_sdk.models.nexsets.responses.mdx) +- [nexla_sdk.models.notification_channel_settings](./modules/nexla_sdk.models.notification_channel_settings.mdx) +- [nexla_sdk.models.notification_channel_settings.requests](./modules/nexla_sdk.models.notification_channel_settings.requests.mdx) +- [nexla_sdk.models.notification_channel_settings.responses](./modules/nexla_sdk.models.notification_channel_settings.responses.mdx) +- [nexla_sdk.models.notification_settings](./modules/nexla_sdk.models.notification_settings.mdx) +- [nexla_sdk.models.notification_settings.requests](./modules/nexla_sdk.models.notification_settings.requests.mdx) +- [nexla_sdk.models.notification_settings.responses](./modules/nexla_sdk.models.notification_settings.responses.mdx) +- [nexla_sdk.models.notification_types](./modules/nexla_sdk.models.notification_types.mdx) +- [nexla_sdk.models.notification_types.responses](./modules/nexla_sdk.models.notification_types.responses.mdx) - [nexla_sdk.models.notifications](./modules/nexla_sdk.models.notifications.mdx) - [nexla_sdk.models.notifications.requests](./modules/nexla_sdk.models.notifications.requests.mdx) - [nexla_sdk.models.notifications.responses](./modules/nexla_sdk.models.notifications.responses.mdx) - [nexla_sdk.models.org_auth_configs](./modules/nexla_sdk.models.org_auth_configs.mdx) - [nexla_sdk.models.org_auth_configs.requests](./modules/nexla_sdk.models.org_auth_configs.requests.mdx) - [nexla_sdk.models.org_auth_configs.responses](./modules/nexla_sdk.models.org_auth_configs.responses.mdx) +- [nexla_sdk.models.org_tiers](./modules/nexla_sdk.models.org_tiers.mdx) +- [nexla_sdk.models.org_tiers.responses](./modules/nexla_sdk.models.org_tiers.responses.mdx) - [nexla_sdk.models.organizations](./modules/nexla_sdk.models.organizations.mdx) - [nexla_sdk.models.organizations.custodians](./modules/nexla_sdk.models.organizations.custodians.mdx) - [nexla_sdk.models.organizations.requests](./modules/nexla_sdk.models.organizations.requests.mdx) @@ -73,11 +122,20 @@ slug: /api/python/modules - [nexla_sdk.models.projects](./modules/nexla_sdk.models.projects.mdx) - [nexla_sdk.models.projects.requests](./modules/nexla_sdk.models.projects.requests.mdx) - [nexla_sdk.models.projects.responses](./modules/nexla_sdk.models.projects.responses.mdx) +- [nexla_sdk.models.quarantine_settings](./modules/nexla_sdk.models.quarantine_settings.mdx) +- [nexla_sdk.models.quarantine_settings.requests](./modules/nexla_sdk.models.quarantine_settings.requests.mdx) +- [nexla_sdk.models.quarantine_settings.responses](./modules/nexla_sdk.models.quarantine_settings.responses.mdx) +- [nexla_sdk.models.resource_parameters](./modules/nexla_sdk.models.resource_parameters.mdx) +- [nexla_sdk.models.resource_parameters.requests](./modules/nexla_sdk.models.resource_parameters.requests.mdx) +- [nexla_sdk.models.resource_parameters.responses](./modules/nexla_sdk.models.resource_parameters.responses.mdx) - [nexla_sdk.models.runtimes](./modules/nexla_sdk.models.runtimes.mdx) - [nexla_sdk.models.runtimes.requests](./modules/nexla_sdk.models.runtimes.requests.mdx) - [nexla_sdk.models.runtimes.responses](./modules/nexla_sdk.models.runtimes.responses.mdx) - [nexla_sdk.models.self_signup](./modules/nexla_sdk.models.self_signup.mdx) - [nexla_sdk.models.self_signup.responses](./modules/nexla_sdk.models.self_signup.responses.mdx) +- [nexla_sdk.models.service_keys](./modules/nexla_sdk.models.service_keys.mdx) +- [nexla_sdk.models.service_keys.requests](./modules/nexla_sdk.models.service_keys.requests.mdx) +- [nexla_sdk.models.service_keys.responses](./modules/nexla_sdk.models.service_keys.responses.mdx) - [nexla_sdk.models.sources](./modules/nexla_sdk.models.sources.mdx) - [nexla_sdk.models.sources.enums](./modules/nexla_sdk.models.sources.enums.mdx) - [nexla_sdk.models.sources.requests](./modules/nexla_sdk.models.sources.requests.mdx) @@ -88,37 +146,82 @@ slug: /api/python/modules - [nexla_sdk.models.transforms](./modules/nexla_sdk.models.transforms.mdx) - [nexla_sdk.models.transforms.requests](./modules/nexla_sdk.models.transforms.requests.mdx) - [nexla_sdk.models.transforms.responses](./modules/nexla_sdk.models.transforms.responses.mdx) +- [nexla_sdk.models.user_settings](./modules/nexla_sdk.models.user_settings.mdx) +- [nexla_sdk.models.user_settings.requests](./modules/nexla_sdk.models.user_settings.requests.mdx) +- [nexla_sdk.models.user_settings.responses](./modules/nexla_sdk.models.user_settings.responses.mdx) +- [nexla_sdk.models.user_tiers](./modules/nexla_sdk.models.user_tiers.mdx) +- [nexla_sdk.models.user_tiers.responses](./modules/nexla_sdk.models.user_tiers.responses.mdx) - [nexla_sdk.models.users](./modules/nexla_sdk.models.users.mdx) +- [nexla_sdk.models.users.credits](./modules/nexla_sdk.models.users.credits.mdx) - [nexla_sdk.models.users.requests](./modules/nexla_sdk.models.users.requests.mdx) - [nexla_sdk.models.users.responses](./modules/nexla_sdk.models.users.responses.mdx) +- [nexla_sdk.models.validators](./modules/nexla_sdk.models.validators.mdx) +- [nexla_sdk.models.validators.requests](./modules/nexla_sdk.models.validators.requests.mdx) +- [nexla_sdk.models.validators.responses](./modules/nexla_sdk.models.validators.responses.mdx) +- [nexla_sdk.models.vendor_endpoints](./modules/nexla_sdk.models.vendor_endpoints.mdx) +- [nexla_sdk.models.vendor_endpoints.requests](./modules/nexla_sdk.models.vendor_endpoints.requests.mdx) +- [nexla_sdk.models.vendor_endpoints.responses](./modules/nexla_sdk.models.vendor_endpoints.responses.mdx) +- [nexla_sdk.models.vendors](./modules/nexla_sdk.models.vendors.mdx) +- [nexla_sdk.models.vendors.requests](./modules/nexla_sdk.models.vendors.requests.mdx) +- [nexla_sdk.models.vendors.responses](./modules/nexla_sdk.models.vendors.responses.mdx) - [nexla_sdk.models.webhooks](./modules/nexla_sdk.models.webhooks.mdx) - [nexla_sdk.models.webhooks.requests](./modules/nexla_sdk.models.webhooks.requests.mdx) - [nexla_sdk.models.webhooks.responses](./modules/nexla_sdk.models.webhooks.responses.mdx) +- [nexla_sdk.raw_operations](./modules/nexla_sdk.raw_operations.mdx) - [nexla_sdk.resources](./modules/nexla_sdk.resources.mdx) +- [nexla_sdk.resources.api_keys](./modules/nexla_sdk.resources.api_keys.mdx) - [nexla_sdk.resources.approval_requests](./modules/nexla_sdk.resources.approval_requests.mdx) - [nexla_sdk.resources.async_tasks](./modules/nexla_sdk.resources.async_tasks.mdx) - [nexla_sdk.resources.attribute_transforms](./modules/nexla_sdk.resources.attribute_transforms.mdx) +- [nexla_sdk.resources.auth_parameters](./modules/nexla_sdk.resources.auth_parameters.mdx) +- [nexla_sdk.resources.auth_templates](./modules/nexla_sdk.resources.auth_templates.mdx) - [nexla_sdk.resources.base_resource](./modules/nexla_sdk.resources.base_resource.mdx) +- [nexla_sdk.resources.catalog_configs](./modules/nexla_sdk.resources.catalog_configs.mdx) +- [nexla_sdk.resources.cluster_endpoints](./modules/nexla_sdk.resources.cluster_endpoints.mdx) +- [nexla_sdk.resources.clusters](./modules/nexla_sdk.resources.clusters.mdx) - [nexla_sdk.resources.code_containers](./modules/nexla_sdk.resources.code_containers.mdx) +- [nexla_sdk.resources.connectors](./modules/nexla_sdk.resources.connectors.mdx) - [nexla_sdk.resources.credentials](./modules/nexla_sdk.resources.credentials.mdx) +- [nexla_sdk.resources.cubejs](./modules/nexla_sdk.resources.cubejs.mdx) +- [nexla_sdk.resources.custom_data_flows](./modules/nexla_sdk.resources.custom_data_flows.mdx) +- [nexla_sdk.resources.dashboard_transforms](./modules/nexla_sdk.resources.dashboard_transforms.mdx) +- [nexla_sdk.resources.data_credentials_groups](./modules/nexla_sdk.resources.data_credentials_groups.mdx) +- [nexla_sdk.resources.data_flows](./modules/nexla_sdk.resources.data_flows.mdx) - [nexla_sdk.resources.data_schemas](./modules/nexla_sdk.resources.data_schemas.mdx) - [nexla_sdk.resources.destinations](./modules/nexla_sdk.resources.destinations.mdx) - [nexla_sdk.resources.doc_containers](./modules/nexla_sdk.resources.doc_containers.mdx) +- [nexla_sdk.resources.flow_nodes](./modules/nexla_sdk.resources.flow_nodes.mdx) +- [nexla_sdk.resources.flow_triggers](./modules/nexla_sdk.resources.flow_triggers.mdx) - [nexla_sdk.resources.flows](./modules/nexla_sdk.resources.flows.mdx) - [nexla_sdk.resources.genai](./modules/nexla_sdk.resources.genai.mdx) - [nexla_sdk.resources.lookups](./modules/nexla_sdk.resources.lookups.mdx) - [nexla_sdk.resources.marketplace](./modules/nexla_sdk.resources.marketplace.mdx) - [nexla_sdk.resources.metrics](./modules/nexla_sdk.resources.metrics.mdx) - [nexla_sdk.resources.nexsets](./modules/nexla_sdk.resources.nexsets.mdx) +- [nexla_sdk.resources.notification_channel_settings](./modules/nexla_sdk.resources.notification_channel_settings.mdx) +- [nexla_sdk.resources.notification_settings](./modules/nexla_sdk.resources.notification_settings.mdx) +- [nexla_sdk.resources.notification_types](./modules/nexla_sdk.resources.notification_types.mdx) - [nexla_sdk.resources.notifications](./modules/nexla_sdk.resources.notifications.mdx) - [nexla_sdk.resources.org_auth_configs](./modules/nexla_sdk.resources.org_auth_configs.mdx) +- [nexla_sdk.resources.org_tiers](./modules/nexla_sdk.resources.org_tiers.mdx) - [nexla_sdk.resources.organizations](./modules/nexla_sdk.resources.organizations.mdx) - [nexla_sdk.resources.projects](./modules/nexla_sdk.resources.projects.mdx) +- [nexla_sdk.resources.quarantine_settings](./modules/nexla_sdk.resources.quarantine_settings.mdx) +- [nexla_sdk.resources.resource_parameters](./modules/nexla_sdk.resources.resource_parameters.mdx) - [nexla_sdk.resources.runtimes](./modules/nexla_sdk.resources.runtimes.mdx) +- [nexla_sdk.resources.search_health](./modules/nexla_sdk.resources.search_health.mdx) - [nexla_sdk.resources.self_signup](./modules/nexla_sdk.resources.self_signup.mdx) +- [nexla_sdk.resources.self_signup_blocked_domains](./modules/nexla_sdk.resources.self_signup_blocked_domains.mdx) +- [nexla_sdk.resources.service_keys](./modules/nexla_sdk.resources.service_keys.mdx) - [nexla_sdk.resources.sources](./modules/nexla_sdk.resources.sources.mdx) - [nexla_sdk.resources.teams](./modules/nexla_sdk.resources.teams.mdx) +- [nexla_sdk.resources.tokens](./modules/nexla_sdk.resources.tokens.mdx) - [nexla_sdk.resources.transforms](./modules/nexla_sdk.resources.transforms.mdx) +- [nexla_sdk.resources.user_settings](./modules/nexla_sdk.resources.user_settings.mdx) +- [nexla_sdk.resources.user_tiers](./modules/nexla_sdk.resources.user_tiers.mdx) - [nexla_sdk.resources.users](./modules/nexla_sdk.resources.users.mdx) +- [nexla_sdk.resources.validators](./modules/nexla_sdk.resources.validators.mdx) +- [nexla_sdk.resources.vendor_endpoints](./modules/nexla_sdk.resources.vendor_endpoints.mdx) +- [nexla_sdk.resources.vendors](./modules/nexla_sdk.resources.vendors.mdx) - [nexla_sdk.resources.webhooks](./modules/nexla_sdk.resources.webhooks.mdx) - [nexla_sdk.telemetry](./modules/nexla_sdk.telemetry.mdx) diff --git a/docs-site/docs/api/python/modules/nexla_sdk.client.mdx b/docs-site/docs/api/python/modules/nexla_sdk.client.mdx index f6059b8..bfb48b1 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.client.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.client.mdx @@ -12,7 +12,7 @@ Nexla API client ### NexlaClient -Defined in `nexla_sdk/client.py:52` +Defined in `nexla_sdk/client.py:82` Client for the Nexla API @@ -45,18 +45,18 @@ Note: Methods: - `create_webhook_client(self, api_key: str) -> nexla_sdk.resources.webhooks.WebhooksResource` - - Source: `nexla_sdk/client.py:243` + - Source: `nexla_sdk/client.py:311` - Create a webhook client for sending data to Nexla webhooks. - `get_access_token(self) -> str` - - Source: `nexla_sdk/client.py:193` + - Source: `nexla_sdk/client.py:261` - Get a valid access token. - `logout(self) -> None` - - Source: `nexla_sdk/client.py:235` + - Source: `nexla_sdk/client.py:303` - Logout current session and invalidate token. - `refresh_access_token(self) -> str` - - Source: `nexla_sdk/client.py:215` + - Source: `nexla_sdk/client.py:283` - Obtain a fresh token and return it. - `request(self, method: str, path: str, **kwargs) -> Optional[Dict[str, Any]]` - - Source: `nexla_sdk/client.py:316` + - Source: `nexla_sdk/client.py:384` - Send a request to the Nexla API diff --git a/docs-site/docs/api/python/modules/nexla_sdk.generated.mdx b/docs-site/docs/api/python/modules/nexla_sdk.generated.mdx new file mode 100644 index 0000000..27670e4 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.generated.mdx @@ -0,0 +1,54 @@ +--- +id: nexla_sdk.generated +title: nexla_sdk.generated +slug: /api/python/modules/nexla_sdk/generated +description: API for nexla_sdk.generated +keywords: [Nexla, SDK, Python, API] +--- + +Generated OpenAPI metadata for Nexla SDK. + +## Classes + +### OperationSpec + +Defined in `nexla_sdk/generated/operation_map.py:6` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + +### RawRequest + +Defined in `nexla_sdk/generated/schema.py:10` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + +### RawResponse + +Defined in `nexla_sdk/generated/schema.py:17` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.generated.operation_map.mdx b/docs-site/docs/api/python/modules/nexla_sdk.generated.operation_map.mdx new file mode 100644 index 0000000..6c0936c --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.generated.operation_map.mdx @@ -0,0 +1,26 @@ +--- +id: nexla_sdk.generated.operation_map +title: nexla_sdk.generated.operation_map +slug: /api/python/modules/nexla_sdk/generated/operation_map +description: API for nexla_sdk.generated.operation_map +keywords: [Nexla, SDK, Python, API] +--- + +Auto-generated operation map from OpenAPI. Do not edit manually. + +## Classes + +### OperationSpec + +Defined in `nexla_sdk/generated/operation_map.py:6` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.generated.schema.mdx b/docs-site/docs/api/python/modules/nexla_sdk.generated.schema.mdx new file mode 100644 index 0000000..3a259b4 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.generated.schema.mdx @@ -0,0 +1,40 @@ +--- +id: nexla_sdk.generated.schema +title: nexla_sdk.generated.schema +slug: /api/python/modules/nexla_sdk/generated/schema +description: API for nexla_sdk.generated.schema +keywords: [Nexla, SDK, Python, API] +--- + +Schema typing helpers for generated operation-level access. + +## Classes + +### RawRequest + +Defined in `nexla_sdk/generated/schema.py:10` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + +### RawResponse + +Defined in `nexla_sdk/generated/schema.py:17` + +dict() -> new empty dictionary +dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs +dict(iterable) -> new dictionary initialized as if via: + d = \{\} + for k, v in iterable: + d[k] = v +dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.mdx b/docs-site/docs/api/python/modules/nexla_sdk.mdx index 96ba83f..a2e8529 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.mdx @@ -35,10 +35,18 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `approve(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:25` + - Source: `nexla_sdk/resources/approval_requests.py:60` +- `cancel(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:71` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -49,24 +57,58 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` +- `get(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:50` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_access_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:35` +- `list_access_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:30` +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_assigned(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:20` +- `list_listings_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:45` +- `list_listings_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:40` - `list_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - Source: `nexla_sdk/resources/approval_requests.py:15` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - - Source: `nexla_sdk/resources/approval_requests.py:20` + - Source: `nexla_sdk/resources/approval_requests.py:25` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -74,10 +116,30 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `reject(self, request_id: int, reason: str = '') -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:30` + - Source: `nexla_sdk/resources/approval_requests.py:65` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `show_data_set(self, data_set_id: int) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:55` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. @@ -96,8 +158,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -108,7 +176,7 @@ Methods: - Source: `nexla_sdk/resources/async_tasks.py:50` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `download_link(self, task_id: int) -> Union[str, nexla_sdk.models.async_tasks.responses.DownloadLink]` - Source: `nexla_sdk/resources/async_tasks.py:63` @@ -117,32 +185,74 @@ Methods: - `get(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:45` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:16` - List asynchronous tasks. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_by_status(self, status: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:32` -- `list_of_type(self, task_type: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `list_of_type(self, task_type: str, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:27` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `rerun(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:54` - `result(self, task_id: int) -> Optional[Dict[str, Any]]` - Source: `nexla_sdk/resources/async_tasks.py:59` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `types(self) -> List[str]` - Source: `nexla_sdk/resources/async_tasks.py:37` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` @@ -161,11 +271,17 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` - - Copy resource. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, attribute_transform_id: int) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` + - Source: `nexla_sdk/resources/attribute_transforms.py:63` + - Copy an attribute transform. - `create(self, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformCreate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:43` - Create a new attribute transform. @@ -173,20 +289,41 @@ Methods: - Source: `nexla_sdk/resources/attribute_transforms.py:53` - Delete an attribute transform by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, attribute_transform_id: int, expand: bool = False) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:37` - Get an attribute transform by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` - Source: `nexla_sdk/resources/attribute_transforms.py:19` - List attribute transforms with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` - Source: `nexla_sdk/resources/attribute_transforms.py:57` - List publicly shared attribute transforms. @@ -196,9 +333,27 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:67` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:70` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, attribute_transform_id: int, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformUpdate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:47` - Update an attribute transform by ID. @@ -262,8 +417,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, code_container_id: int) -> nexla_sdk.models.code_containers.responses.CodeContainer` - Source: `nexla_sdk/resources/code_containers.py:67` - Copy a code container by ID. @@ -274,20 +435,43 @@ Methods: - Source: `nexla_sdk/resources/code_containers.py:63` - Delete a code container by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `error_functions(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:84` - `get(self, code_container_id: int, expand: bool = False) -> nexla_sdk.models.code_containers.responses.CodeContainer` - Source: `nexla_sdk/resources/code_containers.py:37` - Get a code container by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - Source: `nexla_sdk/resources/code_containers.py:19` - List code containers with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:77` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - Source: `nexla_sdk/resources/code_containers.py:71` - List publicly shared code containers. @@ -297,24 +481,44 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `repo(self, code_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:80` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:87` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:90` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, code_container_id: int, data: nexla_sdk.models.code_containers.requests.CodeContainerUpdate) -> nexla_sdk.models.code_containers.responses.CodeContainer` - Source: `nexla_sdk/resources/code_containers.py:53` - Update an existing code container. ### Connector -Defined in `nexla_sdk/models/common.py:34` +Defined in `nexla_sdk/models/common.py:38` Connector information. Fields: - `id`: `int` -- `type`: `str` -- `connection_type`: `str` +- `type`: `Union` +- `connection_type`: `Union` - `name`: `str` - `description`: `str` - `nexset_api_compatible`: `bool` @@ -368,32 +572,73 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.credentials.requests.CredentialCreate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:75` + - Source: `nexla_sdk/resources/credentials.py:103` - Create new credential. +- `credentials_schema(self, source_type: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:71` +- `db_data_types(self, source_type: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:77` - `delete(self, credential_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:105` + - Source: `nexla_sdk/resources/credentials.py:133` - Delete credential. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, credential_id: int, expand: bool = False) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:59` + - Source: `nexla_sdk/resources/credentials.py:87` - Get single credential by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `intent(self, credential_id: int, payload: Dict[str, Any], method: str = 'PUT') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:297` - `list(self, credentials_type: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.credentials.responses.Credential]` - Source: `nexla_sdk/resources/credentials.py:27` - List credentials with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:68` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:59` + - List all credentials (admin only). +- `list_public(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:64` + - List publicly available resources for this type. +- `migrate_iceberg(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:303` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -401,26 +646,66 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `probe(self, credential_id: int, async_mode: bool = False, request_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:117` + - Source: `nexla_sdk/resources/credentials.py:145` - Test credential validity. -- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` +- `probe_detect_schemas(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:209` +- `probe_file_download(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:221` +- `probe_list_buckets(self, credential_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/credentials.py:183` +- `probe_list_files(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:191` +- `probe_read_file(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:203` +- `probe_read_sample(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:215` +- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` + - Source: `nexla_sdk/resources/credentials.py:261` - Preview data content accessible by credential. +- `probe_search_path(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:227` +- `probe_summary(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:187` - `probe_tree(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeTreeRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeTreeResponse` - - Source: `nexla_sdk/resources/credentials.py:155` + - Source: `nexla_sdk/resources/credentials.py:233` - Preview storage structure accessible by credential. +- `probe_tree_request(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:197` +- `refresh(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:289` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:81` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:84` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, credential_id: int, data: nexla_sdk.models.credentials.requests.CredentialUpdate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:92` + - Source: `nexla_sdk/resources/credentials.py:120` - Update credential. +- `usage(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:293` ### DataSchemasResource -Defined in `nexla_sdk/resources/data_schemas.py:7` +Defined in `nexla_sdk/resources/data_schemas.py:8` -Resource for data schemas (accessors + audit log only). +Resource for data schemas. Methods: @@ -428,43 +713,95 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, schema_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:56` - Copy resource. -- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:229` +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:33` - Create new resource. -- `delete(self, resource_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/base_resource.py:274` +- `delete(self, schema_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:39` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` +- `get(self, schema_id: int, expand: bool = False) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:30` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, schema_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/data_schemas.py:15` + - Source: `nexla_sdk/resources/data_schemas.py:61` - Get audit log for resource. -- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - - Source: `nexla_sdk/resources/base_resource.py:130` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_metrics(self, schema_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:42` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:16` - List resources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:27` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:19` +- `list_public(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:23` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:252` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:50` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:53` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, schema_id: int, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:36` - Update resource. ### DestinationsResource @@ -476,53 +813,197 @@ Resource for managing destinations (data sinks). Methods: - `activate(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:94` + - Source: `nexla_sdk/resources/destinations.py:173` - Activate destination. +- `activate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:354` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, sink_id: int, options: Optional[nexla_sdk.models.destinations.requests.DestinationCopyOptions] = None) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:118` + - Source: `nexla_sdk/resources/destinations.py:197` - Copy a destination. - `create(self, data: nexla_sdk.models.destinations.requests.DestinationCreate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:54` + - Source: `nexla_sdk/resources/destinations.py:86` - Create new destination. +- `create_api_key(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:340` +- `create_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:273` +- `create_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:253` - `delete(self, sink_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/destinations.py:82` + - Source: `nexla_sdk/resources/destinations.py:114` - Delete destination. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:366` +- `delete_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:285` +- `delete_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:265` +- `edit_flow_triggers(self, sink_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:309` - `get(self, sink_id: int, expand: bool = False) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:38` + - Source: `nexla_sdk/resources/destinations.py:70` - Get single destination by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:336` - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:269` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:126` +- `get_flow_dashboard(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:129` +- `get_flow_logs(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:144` +- `get_flow_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:139` +- `get_flow_status_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:134` +- `get_metrics(self, sink_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:149` +- `get_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:165` +- `get_quarantine_aggregation(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:376` +- `get_quarantine_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:157` +- `get_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:249` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.destinations.responses.Destination]` - Source: `nexla_sdk/resources/destinations.py:20` - List destinations with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:60` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:44` +- `list_all_by_data_set(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:54` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:48` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/destinations.py:51` +- `list_api_keys(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:326` +- `list_flow_triggers(self, sink_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:305` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:106` + - Source: `nexla_sdk/resources/destinations.py:185` - Pause destination. +- `pause_all_api_keys(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:362` +- `pause_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:358` +- `probe_authenticate(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:221` +- `probe_detect_schemas(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:237` +- `probe_list_buckets(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:213` +- `probe_list_files(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:225` +- `probe_quarantine_sample(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:243` +- `probe_read_file(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:233` +- `probe_summary(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:217` +- `probe_tree(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:229` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `rotate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:350` +- `run_analysis(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:301` +- `run_status(self, sink_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:295` +- `script_sink_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:63` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:38` + - Search resources using filter criteria. +- `search_api_keys(self, sink_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:330` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:41` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:292` +- `trigger_quarantine_aggregation(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:370` - `update(self, sink_id: int, data: nexla_sdk.models.destinations.requests.DestinationUpdate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:69` + - Source: `nexla_sdk/resources/destinations.py:101` - Update destination. +- `update_api_key(self, sink_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:344` +- `update_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:279` +- `update_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:259` +- `update_runtime_status(self, sink_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:66` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:289` ### DocContainersResource -Defined in `nexla_sdk/resources/doc_containers.py:7` +Defined in `nexla_sdk/resources/doc_containers.py:8` -Resource for document containers accessors and audit logs. +Resource for document containers. Methods: @@ -530,43 +1011,91 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, doc_container_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:31` - Copy resource. -- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:229` +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:22` - Create new resource. -- `delete(self, resource_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/base_resource.py:274` +- `delete(self, doc_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/doc_containers.py:28` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` +- `get(self, doc_container_id: int, expand: bool = False) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:19` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, doc_container_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/doc_containers.py:15` + - Source: `nexla_sdk/resources/doc_containers.py:42` - Get audit log for resource. -- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - - Source: `nexla_sdk/resources/base_resource.py:130` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:16` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:252` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:36` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:39` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, doc_container_id: int, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:25` - Update resource. ### FlowError @@ -583,7 +1112,7 @@ Methods: ### FlowNode -Defined in `nexla_sdk/models/common.py:66` +Defined in `nexla_sdk/models/common.py:70` Flow node in a data pipeline. @@ -620,66 +1149,128 @@ Resource for managing data flows. Methods: +- `accessors_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:395` - `activate(self, flow_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:117` - Activate a flow. - `activate_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:314` - Activate flow by resource ID. +- `active_flows_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:527` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `bulk_assign_project(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:512` - `copy(self, flow_id: int, options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:171` - Copy a flow. - `copy_and_replace_credentials(self, flow_id: int, resource_credential_mapping: Dict[int, int], copy_options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None, target_project_id: Optional[int] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:186` - Copy a flow and replace credentials on specified resources. +- `copy_by_resource(self, resource_type: str, resource_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:385` - `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:229` - Create new resource. +- `create_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:453` +- `daily_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:521` - `delete(self, flow_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:282` - Delete flow. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_all_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:471` - `delete_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:294` - Delete flow by resource ID. +- `delete_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:465` +- `docs_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:407` - `docs_recommendation(self, flow_id: int) -> Union[nexla_sdk.models.flows.responses.DocsRecommendation, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:378` + - Source: `nexla_sdk/resources/flows.py:535` - Generate AI suggestion for flow documentation. +- `flow_logs(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:435` +- `flow_logs_v2(self, flow_id: int, payload: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:439` +- `flow_metrics(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:445` - `get(self, flow_id: int, flows_only: bool = False, include_run_metrics: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:67` - Get flow by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_active_flows_metrics(self, from_date: str = None, to_date: str = None, org_id: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:475` + - Source: `nexla_sdk/resources/flows.py:632` - Get metrics for currently active flows. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, flows_only: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:90` - Get flow by resource ID. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_logs(self, flow_id: int, from_date: str = None, to_date: str = None, severity: str = None, run_id: int = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:397` + - Source: `nexla_sdk/resources/flows.py:554` - Get execution logs for a specific flow. -- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:529` +- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:686` - Get flow execution logs for a specific run id of a flow. -- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:581` +- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:738` - Get flow metrics for a flow node keyed by resource id. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resources_access(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:532` - `get_run_status(self, flow_id: int, run_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:499` + - Source: `nexla_sdk/resources/flows.py:656` - Get status of a specific flow run. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `import_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:515` +- `insert_flow_node(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:475` - `list(self, flows_only: bool = False, include_run_metrics: bool = False, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.flows.responses.FlowResponse]` - Source: `nexla_sdk/resources/flows.py:29` - List flows with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:449` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -689,15 +1280,59 @@ Methods: - `pause_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:346` - Pause flow by resource ID. +- `publish_rag(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:489` +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:518` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_flow_node(self, flow_id: int, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:479` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `restore_archival(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:499` +- `run_now(self, flow_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:431` +- `run_profiles_activate(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:425` +- `run_status(self, flow_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:503` +- `run_status_by_resource(self, resource_type: str, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:419` +- `search(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:509` + - Search resources using filter criteria. - `search_flow_logs(self, flow_id: int, run_ids: str = None, severity: str = None, search_string: str = None, from_date: str = None, to_date: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:438` + - Source: `nexla_sdk/resources/flows.py:595` - Advanced search for flow execution logs. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `total_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:524` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. +- `update_archival_status(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:493` +- `update_by_resource(self, resource_type: str, resource_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:378` +- `update_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:459` +- `update_samples(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:485` ### GenAIResource @@ -711,8 +1346,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -727,52 +1368,98 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_config(self, gen_ai_config_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/genai.py:49` - `delete_org_setting(self, gen_ai_org_setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/genai.py:77` + - Source: `nexla_sdk/resources/genai.py:86` +- `delete_org_settings(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/genai.py:91` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_config(self, gen_ai_config_id: int) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:34` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_org_setting(self, gen_ai_org_setting_id: int) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` - Source: `nexla_sdk/resources/genai.py:71` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_configs(self) -> List[nexla_sdk.models.genai.responses.GenAiConfig]` - Source: `nexla_sdk/resources/genai.py:25` - `list_org_settings(self, org_id: int = None, all: bool = False) -> List[nexla_sdk.models.genai.responses.GenAiOrgSetting]` - Source: `nexla_sdk/resources/genai.py:55` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `show_active_config(self, gen_ai_usage: str) -> nexla_sdk.models.genai.responses.ActiveConfigView` - - Source: `nexla_sdk/resources/genai.py:82` + - Source: `nexla_sdk/resources/genai.py:94` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_config(self, gen_ai_config_id: int, payload: nexla_sdk.models.genai.requests.GenAiConfigPayload) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:40` +- `update_org_setting(self, gen_ai_org_setting_id: int, payload: nexla_sdk.models.genai.requests.GenAiOrgSettingPayload) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` + - Source: `nexla_sdk/resources/genai.py:77` ### LogEntry -Defined in `nexla_sdk/models/common.py:45` +Defined in `nexla_sdk/models/common.py:49` Audit log entry. @@ -816,53 +1503,111 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.lookups.requests.LookupCreate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:56` + - Source: `nexla_sdk/resources/lookups.py:63` - Create new lookup. - `delete(self, data_map_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:84` + - Source: `nexla_sdk/resources/lookups.py:91` - Delete lookup. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:137` + - Source: `nexla_sdk/resources/lookups.py:165` - Delete specific entries from a lookup. +- `delete_entries_by_body(self, data_map_id: int, entry_keys: List[str]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:186` +- `download_map(self, data_map_id: int) -> str` + - Source: `nexla_sdk/resources/lookups.py:113` - `get(self, data_map_id: int, expand: bool = False) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:40` + - Source: `nexla_sdk/resources/lookups.py:47` - Get single lookup by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:116` + - Source: `nexla_sdk/resources/lookups.py:138` - Get specific entries from a lookup. +- `get_entries_by_body(self, data_map_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/lookups.py:159` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.lookups.responses.Lookup]` - Source: `nexla_sdk/resources/lookups.py:22` - List lookups with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:44` + - List resources accessible to the current user (access_insights). +- `list_public(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:40` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `probe_sample(self, data_map_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:192` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:103` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:106` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, data_map_id: int, data: nexla_sdk.models.lookups.requests.LookupUpdate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:71` + - Source: `nexla_sdk/resources/lookups.py:78` - Update lookup. - `upsert_entries(self, data_map_id: int, entries: List[Dict[str, Any]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:96` + - Source: `nexla_sdk/resources/lookups.py:118` - Upsert entries in a lookup. +- `validate(self, data_map_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:109` ### MarketplaceResource @@ -876,10 +1621,16 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:91` + - Source: `nexla_sdk/resources/marketplace.py:136` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -889,57 +1640,115 @@ Methods: - `create_domain(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:53` - `create_domain_item(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainsItemCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:66` + - Source: `nexla_sdk/resources/marketplace.py:71` - `create_domains(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:29` - `delete(self, resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_domain(self, domain_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/marketplace.py:58` +- `delist_domain_item(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:94` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_domain(self, domain_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:40` +- `get_domain_audit_log(self, domain_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:61` +- `get_domain_item(self, domain_id: int, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:80` - `get_domains_for_org(self, org_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:34` +- `get_item(self, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:110` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_domain_custodians(self, domain_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:76` + - Source: `nexla_sdk/resources/marketplace.py:121` - `list_domain_items(self, domain_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:62` + - Source: `nexla_sdk/resources/marketplace.py:67` - `list_domains(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:25` +- `list_items(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:106` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/marketplace.py:100` + - Source: `nexla_sdk/resources/marketplace.py:145` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `request_item_access(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:99` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_domain_items(self, domain_id: int, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:86` +- `search_items(self, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:114` +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_domain(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:44` - `update_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:82` + - Source: `nexla_sdk/resources/marketplace.py:127` ### MetricsResource @@ -957,8 +1766,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -969,57 +1784,102 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:216` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:220` - Get flow logs for a flow run keyed by resource ID. -- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:162` +- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:166` - Get flow metrics for a flow node keyed by resource ID. - `get_flow_metrics_summary(self, period: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:148` + - Source: `nexla_sdk/resources/metrics.py:152` - Get flow metrics summary for a given period. - `get_rate_limits(self) -> Dict[str, Any]` - Source: `nexla_sdk/resources/metrics.py:111` - Get current rate limit and usage. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_daily_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None) -> nexla_sdk.models.metrics.responses.MetricsResponse` - Source: `nexla_sdk/resources/metrics.py:39` - Get daily metrics for a resource. - `get_resource_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, metric_type: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:121` + - Source: `nexla_sdk/resources/metrics.py:125` - Get flow metrics for a specific resource. - `get_resource_metrics_by_run(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, size: Optional[int] = None) -> nexla_sdk.models.metrics.responses.MetricsByRunResponse` - Source: `nexla_sdk/resources/metrics.py:70` - Get metrics by run for a resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/metrics.py:121` + - Publish raw metrics (super user only). +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. ### NexlaClient -Defined in `nexla_sdk/client.py:52` +Defined in `nexla_sdk/client.py:82` Client for the Nexla API @@ -1052,19 +1912,19 @@ Note: Methods: - `create_webhook_client(self, api_key: str) -> nexla_sdk.resources.webhooks.WebhooksResource` - - Source: `nexla_sdk/client.py:243` + - Source: `nexla_sdk/client.py:311` - Create a webhook client for sending data to Nexla webhooks. - `get_access_token(self) -> str` - - Source: `nexla_sdk/client.py:193` + - Source: `nexla_sdk/client.py:261` - Get a valid access token. - `logout(self) -> None` - - Source: `nexla_sdk/client.py:235` + - Source: `nexla_sdk/client.py:303` - Logout current session and invalidate token. - `refresh_access_token(self) -> str` - - Source: `nexla_sdk/client.py:215` + - Source: `nexla_sdk/client.py:283` - Obtain a fresh token and return it. - `request(self, method: str, path: str, **kwargs) -> Optional[Dict[str, Any]]` - - Source: `nexla_sdk/client.py:316` + - Source: `nexla_sdk/client.py:384` - Send a request to the Nexla API ### NexlaError @@ -1081,60 +1941,241 @@ Methods: ### NexsetsResource -Defined in `nexla_sdk/resources/nexsets.py:12` +Defined in `nexla_sdk/resources/nexsets.py:14` Resource for managing nexsets (data sets). Methods: - `activate(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:94` + - Source: `nexla_sdk/resources/nexsets.py:146` - Activate nexset. +- `activate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:430` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_samples(self, set_id: int, samples: Any) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:209` +- `add_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:321` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `bulk_update_catalog_refs(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:399` +- `catalog_add(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:261` - `copy(self, set_id: int, options: Optional[nexla_sdk.models.nexsets.requests.NexsetCopyOptions] = None) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:147` + - Source: `nexla_sdk/resources/nexsets.py:216` - Copy a nexset. +- `copy_docs(self, src_id: int, dst_id: int) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:536` + - Copy all documentation entries from one nexset to another. - `create(self, data: nexla_sdk.models.nexsets.requests.NexsetCreate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:54` + - Source: `nexla_sdk/resources/nexsets.py:106` - Create new nexset. +- `create_api_key(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:416` +- `create_catalog_ref(self, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:385` +- `create_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:297` +- `create_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:277` - `delete(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:82` + - Source: `nexla_sdk/resources/nexsets.py:134` - Delete nexset. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:442` +- `delete_catalog_ref(self, ref_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:395` +- `delete_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:309` +- `delete_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:289` - `docs_recommendation(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:161` + - Source: `nexla_sdk/resources/nexsets.py:456` - Generate AI suggestion for Nexset documentation. - `get(self, set_id: int, expand: bool = False) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:38` + - Source: `nexla_sdk/resources/nexsets.py:90` - Get single nexset by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:412` - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_catalog_ref(self, ref_id: int) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:380` +- `get_characteristics(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:353` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:293` +- `get_data_update_time(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:349` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:234` +- `get_flow_dashboard(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:237` +- `get_flow_logs(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:249` +- `get_flow_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:245` +- `get_flow_status_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:241` +- `get_metrics(self, set_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:253` +- `get_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:345` +- `get_quarantine_aggregation(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:452` +- `get_quarantine_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:341` +- `get_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:273` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_samples(self, set_id: int, count: int = 10, include_metadata: bool = False, live: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` - - Source: `nexla_sdk/resources/nexsets.py:118` + - Source: `nexla_sdk/resources/nexsets.py:170` - Get sample records from a nexset. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.nexsets.responses.Nexset]` - - Source: `nexla_sdk/resources/nexsets.py:20` + - Source: `nexla_sdk/resources/nexsets.py:22` - List nexsets with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:40` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:44` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/nexsets.py:47` +- `list_api_keys(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:402` +- `list_available(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:50` +- `list_catalog_refs(self, **params) -> List[nexla_sdk.models.catalog_refs.responses.CatalogRef]` + - Source: `nexla_sdk/resources/nexsets.py:375` +- `list_characteristics_search(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:72` +- `list_docs(self, set_id: int, expand: bool = True) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:461` + - List documentation entries attached to a nexset. +- `list_nexset_api_compatible(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:80` +- `list_public(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:63` + - List publicly available resources for this type. +- `list_shared(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:59` +- `list_sharers(self, set_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:313` +- `list_summary(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:77` +- `mark_shared(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:331` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:106` + - Source: `nexla_sdk/resources/nexsets.py:158` - Pause nexset. +- `pause_all_api_keys(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:438` +- `pause_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:434` +- `probe_quarantine_sample(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:335` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:325` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `rotate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:426` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:361` + - Search resources using filter criteria. +- `search_api_keys(self, set_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:406` +- `search_available(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:54` +- `search_public_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:67` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:364` + - Search resources by tags. +- `semantic_schemas(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:265` +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:317` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `summary(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:357` +- `sync_with_catalog(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:230` +- `transform(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:269` +- `trigger_quarantine_aggregation(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:446` +- `unvote(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:371` - `update(self, set_id: int, data: nexla_sdk.models.nexsets.requests.NexsetUpdate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:69` + - Source: `nexla_sdk/resources/nexsets.py:121` - Update nexset. +- `update_api_key(self, set_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:420` +- `update_catalog_ref(self, ref_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:390` +- `update_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:303` +- `update_docs(self, set_id: int, docs: List[Union[nexla_sdk.models.doc_containers.requests.DocContainerInput, Dict[str, Any]]]) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:491` + - Replace all documentation entries on a nexset. +- `update_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:283` +- `update_runtime_status(self, set_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:86` +- `update_samples(self, set_id: int, samples: Any, replace: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:199` +- `vote(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:367` ### NotFoundError @@ -1189,8 +2230,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -1198,88 +2245,136 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:229` - Create new resource. - `create_channel_setting(self, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:195` + - Source: `nexla_sdk/resources/notifications.py:221` - Create notification channel setting. - `create_setting(self, data: nexla_sdk.models.notifications.requests.NotificationSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:285` + - Source: `nexla_sdk/resources/notifications.py:311` - Create notification setting. - `delete(self, notification_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/notifications.py:40` - Delete notification. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `delete_all(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:90` +- `delete_all(self, payload: Optional[Dict[str, Any]] = None, async_mode: bool = False) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:96` - Delete all notifications. - `delete_channel_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:242` + - Source: `nexla_sdk/resources/notifications.py:268` - Delete notification channel setting. - `delete_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:330` + - Source: `nexla_sdk/resources/notifications.py:356` - Delete notification setting. - `get(self, notification_id: int, expand: bool = False) -> nexla_sdk.models.notifications.responses.Notification` - Source: `nexla_sdk/resources/notifications.py:27` - Get single notification by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_channel_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:211` + - Source: `nexla_sdk/resources/notifications.py:237` - Get notification channel setting. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. - `get_count(self, read: Optional[int] = None) -> nexla_sdk.models.notifications.responses.NotificationCount` - - Source: `nexla_sdk/resources/notifications.py:100` + - Source: `nexla_sdk/resources/notifications.py:111` - Get notification count. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_settings(self, resource_type: str, resource_id: int, expand: bool = False, filter_overridden: bool = False, notification_type_id: Optional[int] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:361` + - Source: `nexla_sdk/resources/notifications.py:387` - Get notification settings for a resource. - `get_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:299` + - Source: `nexla_sdk/resources/notifications.py:325` - Get notification setting. - `get_settings_by_type(self, notification_type_id: int, expand: bool = False) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:343` + - Source: `nexla_sdk/resources/notifications.py:369` - Get notification settings for a type. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. - `get_type(self, event_type: str, resource_type: str) -> nexla_sdk.models.notifications.responses.NotificationType` - - Source: `nexla_sdk/resources/notifications.py:167` + - Source: `nexla_sdk/resources/notifications.py:193` - Get specific notification type. - `get_types(self, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationType]` - - Source: `nexla_sdk/resources/notifications.py:152` + - Source: `nexla_sdk/resources/notifications.py:178` - Get all notification types. -- `list(self, read: Optional[int] = None, level: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, read: Optional[int] = None, level: Optional[str] = None, resource_id: Optional[int] = None, resource_type: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` - Source: `nexla_sdk/resources/notifications.py:52` - List notifications with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_channel_settings(self) -> List[nexla_sdk.models.notifications.responses.NotificationChannelSetting]` - - Source: `nexla_sdk/resources/notifications.py:184` + - Source: `nexla_sdk/resources/notifications.py:210` - List notification channel settings. +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_settings(self, event_type: Optional[str] = None, resource_type: Optional[str] = None, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:256` + - Source: `nexla_sdk/resources/notifications.py:282` - List notification settings. - `mark_read(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:115` + - Source: `nexla_sdk/resources/notifications.py:126` - Mark notifications as read. +- `mark_read_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:162` - `mark_unread(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:133` + - Source: `nexla_sdk/resources/notifications.py:144` - Mark notifications as unread. +- `mark_unread_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:168` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:174` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_channel_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:225` + - Source: `nexla_sdk/resources/notifications.py:251` - Update notification channel setting. - `update_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:313` + - Source: `nexla_sdk/resources/notifications.py:339` - Update notification setting. ### OrgAuthConfigsResource @@ -1294,46 +2389,103 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `client_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:30` + - Get client config for API auth. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:31` + - Source: `nexla_sdk/resources/org_auth_configs.py:43` - Create a new authentication configuration. - `delete(self, auth_config_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/org_auth_configs.py:45` + - Source: `nexla_sdk/resources/org_auth_configs.py:57` - Delete an authentication configuration by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, auth_config_id: int) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:26` + - Source: `nexla_sdk/resources/org_auth_configs.py:38` - Get a specific authentication configuration by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `info(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:34` + - Get API auth info. - `list(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - Source: `nexla_sdk/resources/org_auth_configs.py:16` - List authentication configurations for the current organization. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_all(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - Source: `nexla_sdk/resources/org_auth_configs.py:21` - List all authentication configurations (admin only). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_sign_on_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:26` + - List sign-on options (public). - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, auth_config_id: int, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:37` + - Source: `nexla_sdk/resources/org_auth_configs.py:49` - Update an existing authentication configuration. ### OrgMembershipStatus @@ -1349,7 +2501,7 @@ Members: ### Organization -Defined in `nexla_sdk/models/common.py:16` +Defined in `nexla_sdk/models/common.py:20` Organization details. @@ -1389,67 +2541,141 @@ Methods: - `activate(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. +- `activate_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:273` - `activate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:173` + - Source: `nexla_sdk/resources/organizations.py:190` - Activate members in an organization. +- `activate_org(self, org_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:245` +- `activate_rate_limited_sources(self, org_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:236` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:365` + - Source: `nexla_sdk/resources/organizations.py:501` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.organizations.requests.OrganizationCreate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:61` + - Source: `nexla_sdk/resources/organizations.py:65` - Create a new organization. Note: This is an admin-only operation. +- `create_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:335` +- `create_notification_settings(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:285` - `deactivate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:156` + - Source: `nexla_sdk/resources/organizations.py:173` - Deactivate members in an organization. - `delete(self, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:86` + - Source: `nexla_sdk/resources/organizations.py:90` - Delete organization. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:347` - `delete_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberDelete) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:142` + - Source: `nexla_sdk/resources/organizations.py:159` - Remove members from organization. +- `delete_notification_settings(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:297` +- `disable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:315` +- `enable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:311` - `get(self, org_id: int, expand: bool = False) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:48` + - Source: `nexla_sdk/resources/organizations.py:52` - Get single organization by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_account_rate_limited(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:232` - `get_account_summary(self, org_id: int) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:190` + - Source: `nexla_sdk/resources/organizations.py:207` - Get account summary statistics for an organization. - `get_audit_log(self, org_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:227` + - Source: `nexla_sdk/resources/organizations.py:363` - Get audit log for an organization. - `get_auth_settings(self, org_id: int) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/organizations.py:316` + - Source: `nexla_sdk/resources/organizations.py:452` - Get authentication settings for organization. +- `get_clusters(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:265` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. - `get_current_account_summary(self) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:204` + - Source: `nexla_sdk/resources/organizations.py:221` - Get account summary for the current organization based on auth token. - `get_custodians(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:348` + - Source: `nexla_sdk/resources/organizations.py:484` +- `get_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:331` +- `get_data_sets_catalog_config(self, config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:307` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_status_metrics(self, org_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:269` + - Source: `nexla_sdk/resources/organizations.py:405` - Get flow status metrics for an organization. +- `get_flows_account_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:359` +- `get_flows_dashboard(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:351` +- `get_flows_report(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:261` +- `get_flows_status_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:355` +- `get_login_history(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:102` - `get_members(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:98` + - Source: `nexla_sdk/resources/organizations.py:115` - Get all members in organization. +- `get_metrics(self, org_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:107` - `get_org_flow_account_metrics(self, org_id: int, from_date: str, to_date: str = None, aggregate: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:215` + - Source: `nexla_sdk/resources/organizations.py:319` - Get total account metrics for an organization (flows). +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_audit_log(self, org_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:294` + - Source: `nexla_sdk/resources/organizations.py:430` - Get audit log for a specific resource type within an organization. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.organizations.responses.Organization]` - Source: `nexla_sdk/resources/organizations.py:30` - List organizations with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.organizations.responses.Organization]` + - Source: `nexla_sdk/resources/organizations.py:48` +- `list_data_sets_catalog_configs(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:303` +- `list_notification_settings(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:281` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -1457,28 +2683,58 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `remove_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:375` + - Source: `nexla_sdk/resources/organizations.py:511` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:127` + - Source: `nexla_sdk/resources/organizations.py:144` - Replace all members in organization. +- `revert_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:277` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_rate_limits(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:253` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `throttle(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:257` - `update(self, org_id: int, data: nexla_sdk.models.organizations.requests.OrganizationUpdate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:73` + - Source: `nexla_sdk/resources/organizations.py:77` - Update organization. - `update_auth_setting(self, org_id: int, auth_setting_id: int, enabled: bool) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:329` + - Source: `nexla_sdk/resources/organizations.py:465` - Enable/disable authentication configuration. +- `update_cluster(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:269` - `update_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:355` + - Source: `nexla_sdk/resources/organizations.py:491` +- `update_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:341` - `update_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:112` + - Source: `nexla_sdk/resources/organizations.py:129` - Add or update members in organization. +- `update_notification_settings(self, org_id: int, notification_settings_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:291` ### Owner -Defined in `nexla_sdk/models/common.py:7` +Defined in `nexla_sdk/models/common.py:11` User who owns a resource. @@ -1510,16 +2766,25 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:170` + - Source: `nexla_sdk/resources/projects.py:184` - Backward-compatible alias for adding flows to a project. +- `add_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:215` + - Legacy add endpoint: '/projects/\{id\}/data_flows'. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:113` + - Source: `nexla_sdk/resources/projects.py:127` - Add flows to project. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, project_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.projects.responses.Project` + - Source: `nexla_sdk/resources/projects.py:99` - Copy resource. - `create(self, data: nexla_sdk.models.projects.requests.ProjectCreate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:59` @@ -1528,23 +2793,52 @@ Methods: - Source: `nexla_sdk/resources/projects.py:87` - Delete project. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, project_id: int, expand: bool = False) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:43` - Get single project by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_data_flows_legacy(self, project_id: int) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:194` + - Legacy project flow listing endpoint. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flows(self, project_id: int) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:99` + - Source: `nexla_sdk/resources/projects.py:113` - Get flows in project. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resources_access(self, project_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/projects.py:110` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.projects.responses.Project]` - Source: `nexla_sdk/resources/projects.py:21` - List projects with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -1552,23 +2846,47 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `remove_data_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:190` + - Source: `nexla_sdk/resources/projects.py:233` - Backward-compatible alias for removing flows from a project. +- `remove_data_flows_legacy(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:243` + - Legacy remove endpoint: '/projects/\{id\}/data_flows'. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:151` + - Source: `nexla_sdk/resources/projects.py:165` - Remove flows from project. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:180` + - Source: `nexla_sdk/resources/projects.py:205` - Backward-compatible alias for replacing all flows in a project. +- `replace_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:224` + - Legacy replace endpoint: '/projects/\{id\}/data_flows'. - `replace_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:132` + - Source: `nexla_sdk/resources/projects.py:146` - Replace all flows in project. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:104` + - Search resources using filter criteria. - `search_flows(self, project_id: int, filters: List[Dict[str, Any]]) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:200` + - Source: `nexla_sdk/resources/projects.py:252` - Search flows in a project using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:107` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, project_id: int, data: nexla_sdk.models.projects.requests.ProjectUpdate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:74` - Update project. @@ -1585,6 +2903,41 @@ Methods: - Source: `nexla_sdk/exceptions.py:56` - Get structured error information. +### RawOperationsClient + +Defined in `nexla_sdk/raw_operations.py:31` + +Low-level typed access to any OpenAPI operation. + +Methods: + +- `call(self, operation_id: 'Union[OperationId, str]', *, path_params: 'Optional[Mapping[str, Any]]' = None, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:63` + - Call an operation by operation id. +- `delete(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:155` +- `get(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:107` +- `get_operation(self, operation_id: 'Union[OperationId, str]') -> 'OperationDefinition'` + - Source: `nexla_sdk/raw_operations.py:41` + - Get metadata for a specific operation id. +- `head(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:189` +- `list_operations(self) -> 'List[str]'` + - Source: `nexla_sdk/raw_operations.py:37` + - Return sorted operation ids available in this SDK build. +- `options(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:203` +- `patch(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:172` +- `post(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:121` +- `put(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:138` +- `request(self, method: 'str', path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:88` + - Send an arbitrary request to support non-spec or backend-only endpoints. + ### ResourceConflictError Defined in `nexla_sdk/exceptions.py:114` @@ -1650,8 +3003,14 @@ Methods: - Source: `nexla_sdk/resources/runtimes.py:45` - Activate a custom runtime. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -1662,29 +3021,71 @@ Methods: - Source: `nexla_sdk/resources/runtimes.py:40` - Delete a custom runtime by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, runtime_id: int) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:27` - Get a custom runtime by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self) -> List[nexla_sdk.models.runtimes.responses.Runtime]` - Source: `nexla_sdk/resources/runtimes.py:16` - List custom runtimes. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, runtime_id: int) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:51` - Pause a custom runtime. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, runtime_id: int, data: nexla_sdk.models.runtimes.requests.RuntimeUpdate) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:33` - Update a custom runtime by ID. @@ -1701,10 +3102,16 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_blocked_domain(self, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:39` + - Source: `nexla_sdk/resources/self_signup.py:40` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `approve_request(self, request_id: str) -> nexla_sdk.models.self_signup.responses.SelfSignupRequest` - Source: `nexla_sdk/resources/self_signup.py:29` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` @@ -1717,24 +3124,48 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_blocked_domain(self, domain_id: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/self_signup.py:51` + - Source: `nexla_sdk/resources/self_signup.py:52` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_blocked_domains(self) -> List[nexla_sdk.models.self_signup.responses.BlockedDomain]` - - Source: `nexla_sdk/resources/self_signup.py:35` + - Source: `nexla_sdk/resources/self_signup.py:36` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_requests(self) -> List[nexla_sdk.models.self_signup.responses.SelfSignupRequest]` - Source: `nexla_sdk/resources/self_signup.py:25` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` @@ -1743,16 +3174,34 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `signup(self, payload: Dict[str, Any]) -> Dict[str, Any]` - Source: `nexla_sdk/resources/self_signup.py:16` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_blocked_domain(self, domain_id: str, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:45` + - Source: `nexla_sdk/resources/self_signup.py:46` - `verify_email(self, token: str) -> Dict[str, Any]` - Source: `nexla_sdk/resources/self_signup.py:19` @@ -1777,51 +3226,203 @@ Resource for managing data sources. Methods: - `activate(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:98` + - Source: `nexla_sdk/resources/sources.py:171` - Activate source. +- `activate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:374` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, source_id: int, options: Optional[nexla_sdk.models.sources.requests.SourceCopyOptions] = None) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:122` + - Source: `nexla_sdk/resources/sources.py:195` - Copy a source. - `create(self, data: nexla_sdk.models.sources.requests.SourceCreate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:58` + - Source: `nexla_sdk/resources/sources.py:84` - Create new source. +- `create_api_key(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:360` +- `create_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:287` +- `create_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:267` - `delete(self, source_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/sources.py:86` + - Source: `nexla_sdk/resources/sources.py:112` - Delete source. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:386` +- `delete_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:299` +- `delete_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:279` +- `edit_flow_triggers(self, source_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:329` - `get(self, source_id: int, expand: bool = False) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:42` + - Source: `nexla_sdk/resources/sources.py:68` - Get single source by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:356` - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:283` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:124` +- `get_flow_dashboard(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:127` +- `get_flow_logs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:142` +- `get_flow_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:137` +- `get_flow_status_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:132` +- `get_metrics(self, source_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:147` +- `get_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:163` +- `get_quarantine_aggregation(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:396` +- `get_quarantine_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:155` +- `get_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:263` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_reingested_files(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:255` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.sources.responses.Source]` - Source: `nexla_sdk/resources/sources.py:20` - List sources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:58` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:48` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:52` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/sources.py:55` +- `list_api_keys(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:346` +- `list_data_sinks(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:309` +- `list_flow_triggers(self, source_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:325` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_runs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:321` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:110` + - Source: `nexla_sdk/resources/sources.py:183` - Pause source. +- `pause_all_api_keys(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:382` +- `pause_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:378` +- `probe_authenticate(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:219` +- `probe_detect_schemas(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:239` +- `probe_list_buckets(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:211` +- `probe_list_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:223` +- `probe_quarantine_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:245` +- `probe_read_file(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:233` +- `probe_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:251` +- `probe_summary(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:215` +- `probe_tree(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:229` +- `ready(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:317` +- `reingest_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:259` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `rotate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:370` +- `run_now(self, source_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:313` +- `script_source_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:61` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:42` + - Search resources using filter criteria. +- `search_api_keys(self, source_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:350` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:45` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:306` +- `trigger_quarantine_aggregation(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:390` - `update(self, source_id: int, data: nexla_sdk.models.sources.requests.SourceUpdate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:73` + - Source: `nexla_sdk/resources/sources.py:99` - Update source. +- `update_api_key(self, source_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:364` +- `update_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:293` +- `update_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:273` +- `update_runtime_status(self, source_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:64` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:303` ### TeamsResource -Defined in `nexla_sdk/resources/teams.py:8` +Defined in `nexla_sdk/resources/teams.py:9` Resource for managing teams. @@ -1831,55 +3432,103 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:104` + - Source: `nexla_sdk/resources/teams.py:105` - Add members to team. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.teams.requests.TeamCreate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:50` + - Source: `nexla_sdk/resources/teams.py:51` - Create new team. - `delete(self, team_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/teams.py:78` + - Source: `nexla_sdk/resources/teams.py:79` - Delete team. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, team_id: int, expand: bool = False) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:34` + - Source: `nexla_sdk/resources/teams.py:35` - Get single team by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. -- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` +- `get_audit_log(self, team_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` + - Source: `nexla_sdk/resources/teams.py:155` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_members(self, team_id: int) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:90` + - Source: `nexla_sdk/resources/teams.py:91` - Get team members. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.teams.responses.Team]` - - Source: `nexla_sdk/resources/teams.py:16` + - Source: `nexla_sdk/resources/teams.py:17` - List teams with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_members(self, team_id: int, members: Optional[nexla_sdk.models.teams.requests.TeamMemberList] = None) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:136` + - Source: `nexla_sdk/resources/teams.py:137` - Remove members from team. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:119` + - Source: `nexla_sdk/resources/teams.py:120` - Replace all team members. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, team_id: int, data: nexla_sdk.models.teams.requests.TeamUpdate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:65` + - Source: `nexla_sdk/resources/teams.py:66` - Update team. ### TransformError @@ -1906,8 +3555,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, transform_id: int) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:50` - Copy a transform by ID. @@ -1918,20 +3573,41 @@ Methods: - Source: `nexla_sdk/resources/transforms.py:46` - Delete a transform by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, transform_id: int, expand: bool = False) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:34` - Get a transform by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.transforms.responses.Transform]` - Source: `nexla_sdk/resources/transforms.py:16` - List transforms with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.transforms.responses.Transform]` - Source: `nexla_sdk/resources/transforms.py:54` - List publicly shared transforms. @@ -1941,9 +3617,33 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:60` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:63` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `transform(self, transform_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:66` +- `transform_data(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:73` +- `transform_features(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:70` - `update(self, transform_id: int, data: nexla_sdk.models.transforms.requests.TransformUpdate) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:42` - Update an existing transform. @@ -1977,90 +3677,232 @@ Members: ### UsersResource -Defined in `nexla_sdk/resources/users.py:9` +Defined in `nexla_sdk/resources/users.py:10` Resource for managing users. Methods: -- `activate(self, resource_id: int) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:289` +- `activate(self, user_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:332` - Activate resource. +- `activate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:462` +- `activate_rate_limited_sources(self, user_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:345` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `change_password(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:132` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.users.requests.UserCreate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:65` + - Source: `nexla_sdk/resources/users.py:69` - Create new user. +- `create_api_key(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:448` +- `create_credit(self, user_id: int, payload: nexla_sdk.models.users.credits.UserCreditCreate) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:398` +- `create_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:302` - `create_quarantine_settings(self, user_id: int, data_credentials_id: int, config: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:134` + - Source: `nexla_sdk/resources/users.py:206` - Create quarantine data export settings. - `delete(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:93` + - Source: `nexla_sdk/resources/users.py:97` - Delete user. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:474` +- `delete_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:429` +- `delete_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:314` - `delete_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:168` + - Source: `nexla_sdk/resources/users.py:240` - Delete quarantine data export settings. +- `expire_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:425` - `get(self, user_id: int, expand: bool = False) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:43` + - Source: `nexla_sdk/resources/users.py:47` - Get user by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_account_metrics(self, user_id: int, from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None, aggregate: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:258` + - Source: `nexla_sdk/resources/users.py:479` - Get total account metrics for user. +- `get_account_rate_limited(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:354` +- `get_account_summary(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:110` + - Get current user's account summary. +- `get_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:444` +- `get_api_key_events(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:168` +- `get_audit_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:160` - `get_audit_log(self, user_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/users.py:181` + - Source: `nexla_sdk/resources/users.py:258` - Get audit log for a user. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_credit(self, user_id: int, credit_id: int) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:404` - `get_current(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:116` + - Source: `nexla_sdk/resources/users.py:154` - Get info on current user (includes org memberships and current org info). - `get_daily_metrics(self, user_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.UserMetricResourceType, str], from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:339` + - Source: `nexla_sdk/resources/users.py:560` - Get daily data processing metrics for a user. - `get_dashboard_metrics(self, user_id: int, access_role: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:319` + - Source: `nexla_sdk/resources/users.py:540` - Get 24 hour flow stats for user. +- `get_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:254` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_status_metrics(self, user_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:290` + - Source: `nexla_sdk/resources/users.py:511` - Get flow status metrics for a user. +- `get_flows_account_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:327` +- `get_flows_dashboard(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:319` +- `get_flows_status_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:323` +- `get_login_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:164` +- `get_metrics(self, user_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:180` +- `get_orgs(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:188` - `get_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:121` + - Source: `nexla_sdk/resources/users.py:193` - Get quarantine data export settings for user. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resource_audit_log(self, user_id: int, resource_type: str, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:172` - `get_settings(self) -> List[nexla_sdk.models.users.responses.UserSettings]` - - Source: `nexla_sdk/resources/users.py:105` + - Source: `nexla_sdk/resources/users.py:143` - Get current user's settings. +- `get_sso_options(self, email: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:136` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. - `get_transferable_resources(self, user_id: int, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:225` + - Source: `nexla_sdk/resources/users.py:359` - Get a list of resources owned by a user that can be transferred. +- `get_user_account_summary(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:114` + - Get account summary for a specific user. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.users.responses.User]` - - Source: `nexla_sdk/resources/users.py:17` + - Source: `nexla_sdk/resources/users.py:18` - List users with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_api_keys(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:434` +- `list_credits(self, user_id: int, **params) -> List[nexla_sdk.models.users.credits.UserCredit]` + - Source: `nexla_sdk/resources/users.py:393` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_sso_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:44` +- `lock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:337` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. +- `password_entropy(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:126` - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `pause_all_api_keys(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:470` +- `pause_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:466` +- `refresh_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:421` + - Alias for refresh_credits. +- `refresh_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:417` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `reset_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:120` +- `rotate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:458` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_api_keys(self, user_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:438` +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `send_invite(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:129` +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:123` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `transfer_resources(self, user_id: int, org_id: int, delegate_owner_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:240` + - Source: `nexla_sdk/resources/users.py:374` - Transfer a user's resources to another user within an organization. +- `unlock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:341` - `update(self, user_id: int, data: nexla_sdk.models.users.requests.UserUpdate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:80` + - Source: `nexla_sdk/resources/users.py:84` - Update user. +- `update_api_key(self, user_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:452` +- `update_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:308` - `update_quarantine_settings(self, user_id: int, data: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:152` + - Source: `nexla_sdk/resources/users.py:224` - Update quarantine data export settings. +- `use_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:413` + - Alias for use_credits. +- `use_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:409` ### ValidationError diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.mdx new file mode 100644 index 0000000..32283dd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.mdx @@ -0,0 +1,98 @@ +--- +id: nexla_sdk.models.api_keys +title: nexla_sdk.models.api_keys +slug: /api/python/modules/nexla_sdk/models/api_keys +description: API for nexla_sdk.models.api_keys +keywords: [Nexla, SDK, Python, API] +--- + +API Keys models. + +## Classes + +### ApiKey + +Defined in `nexla_sdk/models/api_keys/responses.py:9` + +API key response model. + +API keys are used for programmatic access to specific resources +like datasets, data sources, data sinks, and users. + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_set_id`: `Optional` +- `data_source_id`: `Optional` +- `data_sink_id`: `Optional` +- `user_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `scope`: `Optional` +- `api_key`: `Optional` +- `url`: `Optional` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ApiKeyCreate + +Defined in `nexla_sdk/models/api_keys/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + +### ApiKeyUpdate + +Defined in `nexla_sdk/models/api_keys/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + +### ApiKeysIndex + +Defined in `nexla_sdk/models/api_keys/responses.py:37` + +Response model for API keys index (grouped by type). + +Fields: + +- `data_sets`: `Optional` +- `data_sinks`: `Optional` +- `data_sources`: `Optional` +- `users`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.requests.mdx new file mode 100644 index 0000000..1f34b43 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.requests.mdx @@ -0,0 +1,52 @@ +--- +id: nexla_sdk.models.api_keys.requests +title: nexla_sdk.models.api_keys.requests +slug: /api/python/modules/nexla_sdk/models/api_keys/requests +description: API for nexla_sdk.models.api_keys.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### ApiKeyCreate + +Defined in `nexla_sdk/models/api_keys/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + +### ApiKeyUpdate + +Defined in `nexla_sdk/models/api_keys/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.responses.mdx new file mode 100644 index 0000000..b702bc5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.api_keys.responses.mdx @@ -0,0 +1,56 @@ +--- +id: nexla_sdk.models.api_keys.responses +title: nexla_sdk.models.api_keys.responses +slug: /api/python/modules/nexla_sdk/models/api_keys/responses +description: API for nexla_sdk.models.api_keys.responses +keywords: [Nexla, SDK, Python, API] +--- + +API Keys response models. + +## Classes + +### ApiKey + +Defined in `nexla_sdk/models/api_keys/responses.py:9` + +API key response model. + +API keys are used for programmatic access to specific resources +like datasets, data sources, data sinks, and users. + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_set_id`: `Optional` +- `data_source_id`: `Optional` +- `data_sink_id`: `Optional` +- `user_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `scope`: `Optional` +- `api_key`: `Optional` +- `url`: `Optional` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ApiKeysIndex + +Defined in `nexla_sdk/models/api_keys/responses.py:37` + +Response model for API keys index (grouped by type). + +Fields: + +- `data_sets`: `Optional` +- `data_sinks`: `Optional` +- `data_sources`: `Optional` +- `users`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.mdx new file mode 100644 index 0000000..157aae5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.mdx @@ -0,0 +1,97 @@ +--- +id: nexla_sdk.models.auth_parameters +title: nexla_sdk.models.auth_parameters +slug: /api/python/modules/nexla_sdk/models/auth_parameters +description: API for nexla_sdk.models.auth_parameters +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### AuthParameter + +Defined in `nexla_sdk/models/auth_parameters/responses.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `vendor`: `Optional` +- `auth_template`: `Optional` +- `allowed_values`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### AuthParameterCreate + +Defined in `nexla_sdk/models/auth_parameters/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` + +### AuthParameterUpdate + +Defined in `nexla_sdk/models/auth_parameters/requests.py:20` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.requests.mdx new file mode 100644 index 0000000..c96c2de --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.requests.mdx @@ -0,0 +1,66 @@ +--- +id: nexla_sdk.models.auth_parameters.requests +title: nexla_sdk.models.auth_parameters.requests +slug: /api/python/modules/nexla_sdk/models/auth_parameters/requests +description: API for nexla_sdk.models.auth_parameters.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### AuthParameterCreate + +Defined in `nexla_sdk/models/auth_parameters/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` + +### AuthParameterUpdate + +Defined in `nexla_sdk/models/auth_parameters/requests.py:20` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.responses.mdx new file mode 100644 index 0000000..aebce7e --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_parameters.responses.mdx @@ -0,0 +1,41 @@ +--- +id: nexla_sdk.models.auth_parameters.responses +title: nexla_sdk.models.auth_parameters.responses +slug: /api/python/modules/nexla_sdk/models/auth_parameters/responses +description: API for nexla_sdk.models.auth_parameters.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### AuthParameter + +Defined in `nexla_sdk/models/auth_parameters/responses.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `vendor`: `Optional` +- `auth_template`: `Optional` +- `allowed_values`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.mdx new file mode 100644 index 0000000..71e0333 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.mdx @@ -0,0 +1,118 @@ +--- +id: nexla_sdk.models.auth_templates +title: nexla_sdk.models.auth_templates +slug: /api/python/modules/nexla_sdk/models/auth_templates +description: API for nexla_sdk.models.auth_templates +keywords: [Nexla, SDK, Python, API] +--- + +Auth template models. + +## Classes + +### AuthParameter + +Defined in `nexla_sdk/models/auth_templates/responses.py:12` + +Auth parameter configuration for auth templates. + +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + +Fields: + +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + +### AuthParameterCreate + +Defined in `nexla_sdk/models/auth_templates/requests.py:8` + +Auth parameter for template creation. + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + +### AuthTemplate + +Defined in `nexla_sdk/models/auth_templates/responses.py:33` + +Auth template response model. + +Auth templates define authentication configurations for vendors. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `credentials_type`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `auth_parameters`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### AuthTemplateCreate + +Defined in `nexla_sdk/models/auth_templates/requests.py:20` + +Request model for creating an auth template (super user only). + +Fields: + +- `name`: `str` +- `vendor_id`: `int` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `auth_parameters`: `Optional` + +### AuthTemplateParameter + +Defined in `nexla_sdk/models/auth_templates/responses.py:12` + +Auth parameter configuration for auth templates. + +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + +Fields: + +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + +### AuthTemplateUpdate + +Defined in `nexla_sdk/models/auth_templates/requests.py:31` + +Request model for updating an auth template (super user only). + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.requests.mdx new file mode 100644 index 0000000..c308595 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.requests.mdx @@ -0,0 +1,56 @@ +--- +id: nexla_sdk.models.auth_templates.requests +title: nexla_sdk.models.auth_templates.requests +slug: /api/python/modules/nexla_sdk/models/auth_templates/requests +description: API for nexla_sdk.models.auth_templates.requests +keywords: [Nexla, SDK, Python, API] +--- + +Auth template request models. + +## Classes + +### AuthParameterCreate + +Defined in `nexla_sdk/models/auth_templates/requests.py:8` + +Auth parameter for template creation. + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + +### AuthTemplateCreate + +Defined in `nexla_sdk/models/auth_templates/requests.py:20` + +Request model for creating an auth template (super user only). + +Fields: + +- `name`: `str` +- `vendor_id`: `int` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `auth_parameters`: `Optional` + +### AuthTemplateUpdate + +Defined in `nexla_sdk/models/auth_templates/requests.py:31` + +Request model for updating an auth template (super user only). + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.responses.mdx new file mode 100644 index 0000000..d53224c --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.auth_templates.responses.mdx @@ -0,0 +1,74 @@ +--- +id: nexla_sdk.models.auth_templates.responses +title: nexla_sdk.models.auth_templates.responses +slug: /api/python/modules/nexla_sdk/models/auth_templates/responses +description: API for nexla_sdk.models.auth_templates.responses +keywords: [Nexla, SDK, Python, API] +--- + +Auth template response models. + +## Classes + +### AuthParameter + +Defined in `nexla_sdk/models/auth_templates/responses.py:12` + +Auth parameter configuration for auth templates. + +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + +Fields: + +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + +### AuthTemplate + +Defined in `nexla_sdk/models/auth_templates/responses.py:33` + +Auth template response model. + +Auth templates define authentication configurations for vendors. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `credentials_type`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `auth_parameters`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### AuthTemplateParameter + +Defined in `nexla_sdk/models/auth_templates/responses.py:12` + +Auth parameter configuration for auth templates. + +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + +Fields: + +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.mdx new file mode 100644 index 0000000..2850468 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.mdx @@ -0,0 +1,86 @@ +--- +id: nexla_sdk.models.catalog_configs +title: nexla_sdk.models.catalog_configs +slug: /api/python/modules/nexla_sdk/models/catalog_configs +description: API for nexla_sdk.models.catalog_configs +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogConfig + +Defined in `nexla_sdk/models/catalog_configs/responses.py:9` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `data_credentials`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` +- `job_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### CatalogConfigCreate + +Defined in `nexla_sdk/models/catalog_configs/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` + +### CatalogConfigUpdate + +Defined in `nexla_sdk/models/catalog_configs/requests.py:15` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.requests.mdx new file mode 100644 index 0000000..c5f30b4 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.requests.mdx @@ -0,0 +1,56 @@ +--- +id: nexla_sdk.models.catalog_configs.requests +title: nexla_sdk.models.catalog_configs.requests +slug: /api/python/modules/nexla_sdk/models/catalog_configs/requests +description: API for nexla_sdk.models.catalog_configs.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogConfigCreate + +Defined in `nexla_sdk/models/catalog_configs/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` + +### CatalogConfigUpdate + +Defined in `nexla_sdk/models/catalog_configs/requests.py:15` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.responses.mdx new file mode 100644 index 0000000..6aba978 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_configs.responses.mdx @@ -0,0 +1,40 @@ +--- +id: nexla_sdk.models.catalog_configs.responses +title: nexla_sdk.models.catalog_configs.responses +slug: /api/python/modules/nexla_sdk/models/catalog_configs/responses +description: API for nexla_sdk.models.catalog_configs.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogConfig + +Defined in `nexla_sdk/models/catalog_configs/responses.py:9` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `data_credentials`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` +- `job_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.mdx new file mode 100644 index 0000000..069154d --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.mdx @@ -0,0 +1,77 @@ +--- +id: nexla_sdk.models.catalog_refs +title: nexla_sdk.models.catalog_refs +slug: /api/python/modules/nexla_sdk/models/catalog_refs +description: API for nexla_sdk.models.catalog_refs +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogRef + +Defined in `nexla_sdk/models/catalog_refs/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `data_set_id`: `Optional` +- `status`: `Optional` +- `reference_id`: `Optional` +- `link`: `Optional` +- `error_msg`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` +- `catalog_config`: `Optional` + +### CatalogRefCreate + +Defined in `nexla_sdk/models/catalog_refs/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_set_id`: `int` +- `catalog_config_id`: `int` +- `reference_id`: `Optional` +- `link`: `Optional` + +### CatalogRefUpdate + +Defined in `nexla_sdk/models/catalog_refs/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `reference_id`: `Optional` +- `link`: `Optional` +- `status`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.requests.mdx new file mode 100644 index 0000000..c791b96 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.requests.mdx @@ -0,0 +1,51 @@ +--- +id: nexla_sdk.models.catalog_refs.requests +title: nexla_sdk.models.catalog_refs.requests +slug: /api/python/modules/nexla_sdk/models/catalog_refs/requests +description: API for nexla_sdk.models.catalog_refs.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogRefCreate + +Defined in `nexla_sdk/models/catalog_refs/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_set_id`: `int` +- `catalog_config_id`: `int` +- `reference_id`: `Optional` +- `link`: `Optional` + +### CatalogRefUpdate + +Defined in `nexla_sdk/models/catalog_refs/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `reference_id`: `Optional` +- `link`: `Optional` +- `status`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.responses.mdx new file mode 100644 index 0000000..8de51f0 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.catalog_refs.responses.mdx @@ -0,0 +1,36 @@ +--- +id: nexla_sdk.models.catalog_refs.responses +title: nexla_sdk.models.catalog_refs.responses +slug: /api/python/modules/nexla_sdk/models/catalog_refs/responses +description: API for nexla_sdk.models.catalog_refs.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogRef + +Defined in `nexla_sdk/models/catalog_refs/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `data_set_id`: `Optional` +- `status`: `Optional` +- `reference_id`: `Optional` +- `link`: `Optional` +- `error_msg`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` +- `catalog_config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.mdx new file mode 100644 index 0000000..6abb8d7 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.mdx @@ -0,0 +1,155 @@ +--- +id: nexla_sdk.models.clusters +title: nexla_sdk.models.clusters +slug: /api/python/modules/nexla_sdk/models/clusters +description: API for nexla_sdk.models.clusters +keywords: [Nexla, SDK, Python, API] +--- + +Cluster models. + +## Classes + +### Cluster + +Defined in `nexla_sdk/models/clusters/responses.py:24` + +Cluster response model. + +Clusters define infrastructure endpoints for processing data flows. +They contain multiple endpoints for different services. + +Fields: + +- `id`: `int` +- `org_id`: `Optional` +- `uid`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `region`: `Optional` +- `provider`: `Optional` +- `org`: `Optional` +- `endpoints`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ClusterCreate + +Defined in `nexla_sdk/models/clusters/requests.py:19` + +Request model for creating a cluster. + +Fields: + +- `org_id`: `int` +- `name`: `str` +- `region`: `str` +- `description`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` + +### ClusterEndpoint + +Defined in `nexla_sdk/models/clusters/responses.py:47` + +Cluster endpoint response model. + +Endpoints define individual service connections within a cluster. + +Fields: + +- `id`: `int` +- `cluster_id`: `Optional` +- `org_id`: `Optional` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ClusterEndpointCreate + +Defined in `nexla_sdk/models/clusters/requests.py:43` + +Request model for creating a cluster endpoint. + +Fields: + +- `cluster_id`: `int` +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterEndpointItem + +Defined in `nexla_sdk/models/clusters/requests.py:8` + +Endpoint configuration for cluster create/update. + +Fields: + +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterEndpointRef + +Defined in `nexla_sdk/models/clusters/responses.py:12` + +Cluster endpoint reference for cluster response. + +Fields: + +- `id`: `int` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterEndpointUpdate + +Defined in `nexla_sdk/models/clusters/requests.py:55` + +Request model for updating a cluster endpoint. + +Fields: + +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterUpdate + +Defined in `nexla_sdk/models/clusters/requests.py:32` + +Request model for updating a cluster. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.requests.mdx new file mode 100644 index 0000000..7011cb5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.requests.mdx @@ -0,0 +1,90 @@ +--- +id: nexla_sdk.models.clusters.requests +title: nexla_sdk.models.clusters.requests +slug: /api/python/modules/nexla_sdk/models/clusters/requests +description: API for nexla_sdk.models.clusters.requests +keywords: [Nexla, SDK, Python, API] +--- + +Cluster request models. + +## Classes + +### ClusterCreate + +Defined in `nexla_sdk/models/clusters/requests.py:19` + +Request model for creating a cluster. + +Fields: + +- `org_id`: `int` +- `name`: `str` +- `region`: `str` +- `description`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` + +### ClusterEndpointCreate + +Defined in `nexla_sdk/models/clusters/requests.py:43` + +Request model for creating a cluster endpoint. + +Fields: + +- `cluster_id`: `int` +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterEndpointItem + +Defined in `nexla_sdk/models/clusters/requests.py:8` + +Endpoint configuration for cluster create/update. + +Fields: + +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterEndpointUpdate + +Defined in `nexla_sdk/models/clusters/requests.py:55` + +Request model for updating a cluster endpoint. + +Fields: + +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + +### ClusterUpdate + +Defined in `nexla_sdk/models/clusters/requests.py:32` + +Request model for updating a cluster. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.responses.mdx new file mode 100644 index 0000000..473a071 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.clusters.responses.mdx @@ -0,0 +1,77 @@ +--- +id: nexla_sdk.models.clusters.responses +title: nexla_sdk.models.clusters.responses +slug: /api/python/modules/nexla_sdk/models/clusters/responses +description: API for nexla_sdk.models.clusters.responses +keywords: [Nexla, SDK, Python, API] +--- + +Cluster response models. + +## Classes + +### Cluster + +Defined in `nexla_sdk/models/clusters/responses.py:24` + +Cluster response model. + +Clusters define infrastructure endpoints for processing data flows. +They contain multiple endpoints for different services. + +Fields: + +- `id`: `int` +- `org_id`: `Optional` +- `uid`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `region`: `Optional` +- `provider`: `Optional` +- `org`: `Optional` +- `endpoints`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ClusterEndpoint + +Defined in `nexla_sdk/models/clusters/responses.py:47` + +Cluster endpoint response model. + +Endpoints define individual service connections within a cluster. + +Fields: + +- `id`: `int` +- `cluster_id`: `Optional` +- `org_id`: `Optional` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### ClusterEndpointRef + +Defined in `nexla_sdk/models/clusters/responses.py:12` + +Cluster endpoint reference for cluster response. + +Fields: + +- `id`: `int` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.common.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.common.mdx index ff2dbd6..da14e45 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.common.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.common.mdx @@ -10,22 +10,22 @@ keywords: [Nexla, SDK, Python, API] ### Connector -Defined in `nexla_sdk/models/common.py:34` +Defined in `nexla_sdk/models/common.py:38` Connector information. Fields: - `id`: `int` -- `type`: `str` -- `connection_type`: `str` +- `type`: `Union` +- `connection_type`: `Union` - `name`: `str` - `description`: `str` - `nexset_api_compatible`: `bool` ### FlowNode -Defined in `nexla_sdk/models/common.py:66` +Defined in `nexla_sdk/models/common.py:70` Flow node in a data pipeline. @@ -47,7 +47,7 @@ Fields: ### LogEntry -Defined in `nexla_sdk/models/common.py:45` +Defined in `nexla_sdk/models/common.py:49` Audit log entry. @@ -72,7 +72,7 @@ Fields: ### Organization -Defined in `nexla_sdk/models/common.py:16` +Defined in `nexla_sdk/models/common.py:20` Organization details. @@ -94,7 +94,7 @@ Fields: ### Owner -Defined in `nexla_sdk/models/common.py:7` +Defined in `nexla_sdk/models/common.py:11` User who owns a resource. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.enums.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.enums.mdx new file mode 100644 index 0000000..94fd4c9 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.enums.mdx @@ -0,0 +1,100 @@ +--- +id: nexla_sdk.models.connectors.enums +title: nexla_sdk.models.connectors.enums +slug: /api/python/modules/nexla_sdk/models/connectors/enums +description: API for nexla_sdk.models.connectors.enums +keywords: [Nexla, SDK, Python, API] +--- + +Connector enums for the /connectors endpoint. + +## Classes + +### ConnectionType + +Defined in `nexla_sdk/models/connectors/enums.py:93` + +Connection type categories for connectors. + +Maps to the `connection_type` field in Connector responses. + +Members: + +- `FILE` = `file` +- `DATABASE` = `database` +- `NOSQL` = `nosql` +- `STREAMING` = `streaming` +- `API` = `api` +- `VECTOR_DB` = `vector_db` +- `SPECIAL` = `special` +- `DATA_LAKE` = `data_lake` + +### ConnectorType + +Defined in `nexla_sdk/models/connectors/enums.py:6` + +All supported connector types. + +This is the comprehensive enum used by the /connectors endpoint. +It includes all source and destination connector types. + +Members: + +- `S3` = `s3` +- `GCS` = `gcs` +- `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` +- `FTP` = `ftp` +- `DROPBOX` = `dropbox` +- `BOX` = `box` +- `GDRIVE` = `gdrive` +- `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` +- `MYSQL` = `mysql` +- `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` +- `SQLSERVER` = `sqlserver` +- `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `AS400` = `as400` +- `DB2` = `db2` +- `SYBASE` = `sybase` +- `HANA_JDBC` = `hana_jdbc` +- `NETSUITE_JDBC` = `netsuite_jdbc` +- `REDSHIFT` = `redshift` +- `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` +- `BIGQUERY` = `bigquery` +- `DATABRICKS` = `databricks` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `FIREBOLT` = `firebolt` +- `TERADATA` = `teradata` +- `HIVE` = `hive` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` +- `MONGO` = `mongo` +- `DYNAMODB` = `dynamodb` +- `FIREBASE` = `firebase` +- `KAFKA` = `kafka` +- `CONFLUENT_KAFKA` = `confluent_kafka` +- `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` +- `REST` = `rest` +- `SOAP` = `soap` +- `NEXLA_REST` = `nexla_rest` +- `FILE_UPLOAD` = `file_upload` +- `EMAIL` = `email` +- `NEXLA_MONITOR` = `nexla_monitor` +- `DATA_MAP` = `data_map` +- `PINECONE` = `pinecone` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.mdx new file mode 100644 index 0000000..add843c --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.mdx @@ -0,0 +1,100 @@ +--- +id: nexla_sdk.models.connectors +title: nexla_sdk.models.connectors +slug: /api/python/modules/nexla_sdk/models/connectors +description: API for nexla_sdk.models.connectors +keywords: [Nexla, SDK, Python, API] +--- + +Connector models. + +## Classes + +### ConnectionType + +Defined in `nexla_sdk/models/connectors/enums.py:93` + +Connection type categories for connectors. + +Maps to the `connection_type` field in Connector responses. + +Members: + +- `FILE` = `file` +- `DATABASE` = `database` +- `NOSQL` = `nosql` +- `STREAMING` = `streaming` +- `API` = `api` +- `VECTOR_DB` = `vector_db` +- `SPECIAL` = `special` +- `DATA_LAKE` = `data_lake` + +### ConnectorType + +Defined in `nexla_sdk/models/connectors/enums.py:6` + +All supported connector types. + +This is the comprehensive enum used by the /connectors endpoint. +It includes all source and destination connector types. + +Members: + +- `S3` = `s3` +- `GCS` = `gcs` +- `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` +- `FTP` = `ftp` +- `DROPBOX` = `dropbox` +- `BOX` = `box` +- `GDRIVE` = `gdrive` +- `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` +- `MYSQL` = `mysql` +- `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` +- `SQLSERVER` = `sqlserver` +- `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `AS400` = `as400` +- `DB2` = `db2` +- `SYBASE` = `sybase` +- `HANA_JDBC` = `hana_jdbc` +- `NETSUITE_JDBC` = `netsuite_jdbc` +- `REDSHIFT` = `redshift` +- `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` +- `BIGQUERY` = `bigquery` +- `DATABRICKS` = `databricks` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `FIREBOLT` = `firebolt` +- `TERADATA` = `teradata` +- `HIVE` = `hive` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` +- `MONGO` = `mongo` +- `DYNAMODB` = `dynamodb` +- `FIREBASE` = `firebase` +- `KAFKA` = `kafka` +- `CONFLUENT_KAFKA` = `confluent_kafka` +- `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` +- `REST` = `rest` +- `SOAP` = `soap` +- `NEXLA_REST` = `nexla_rest` +- `FILE_UPLOAD` = `file_upload` +- `EMAIL` = `email` +- `NEXLA_MONITOR` = `nexla_monitor` +- `DATA_MAP` = `data_map` +- `PINECONE` = `pinecone` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.requests.mdx new file mode 100644 index 0000000..1ebd47b --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.requests.mdx @@ -0,0 +1,26 @@ +--- +id: nexla_sdk.models.connectors.requests +title: nexla_sdk.models.connectors.requests +slug: /api/python/modules/nexla_sdk/models/connectors/requests +description: API for nexla_sdk.models.connectors.requests +keywords: [Nexla, SDK, Python, API] +--- + +Connector request models. + +## Classes + +### ConnectorUpdate + +Defined in `nexla_sdk/models/connectors/requests.py:8` + +Request model for updating a connector (super user only). + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `nexset_api_compatible`: `Optional` +- `sync_api_compatible`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.responses.mdx new file mode 100644 index 0000000..1a3098a --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.connectors.responses.mdx @@ -0,0 +1,33 @@ +--- +id: nexla_sdk.models.connectors.responses +title: nexla_sdk.models.connectors.responses +slug: /api/python/modules/nexla_sdk/models/connectors/responses +description: API for nexla_sdk.models.connectors.responses +keywords: [Nexla, SDK, Python, API] +--- + +Connector response models. + +## Classes + +### Connector + +Defined in `nexla_sdk/models/connectors/responses.py:13` + +Connector response model. + +Connectors define connection types for data sources and destinations. + +Fields: + +- `id`: `int` +- `type`: `Optional` +- `connection_type`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `nexset_api_compatible`: `Optional` +- `sync_api_compatible`: `Optional` +- `config`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.mdx index 1e5eff1..71da53e 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.mdx @@ -8,53 +8,6 @@ keywords: [Nexla, SDK, Python, API] ## Classes -### Credential - -Defined in `nexla_sdk/models/credentials/responses.py:10` - -Data credential response model. - -Fields: - -- `id`: `int` -- `name`: `str` -- `credentials_type`: `str` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `verified_status`: `Optional` -- `connector`: `Optional` -- `description`: `Optional` -- `credentials_version`: `Optional` -- `api_keys`: `Optional` -- `credentials_non_secure_data`: `Optional` -- `verified_at`: `Optional` -- `copied_from_id`: `Optional` -- `template_config`: `Optional` -- `vendor`: `Optional` -- `auth_template`: `Optional` -- `referenced_resource_ids`: `Optional` -- `tags`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` -- `managed`: `bool` - -### CredentialCreate - -Defined in `nexla_sdk/models/credentials/requests.py:6` - -Request model for creating a credential. - -Fields: - -- `name`: `str` -- `credentials_type`: `str` -- `description`: `Optional` -- `auth_template_id`: `Optional` -- `vendor_id`: `Optional` -- `template_config`: `Optional` -- `credentials`: `Optional` - ### CredentialType Defined in `nexla_sdk/models/credentials/enums.py:4` @@ -116,67 +69,6 @@ Members: - `TIBCO` = `tibco` - `WEBDAV` = `webdav` -### CredentialUpdate - -Defined in `nexla_sdk/models/credentials/requests.py:22` - -Request model for updating a credential. - -Fields: - -- `name`: `Optional` -- `description`: `Optional` -- `credentials`: `Optional` - -### ProbeSampleRequest - -Defined in `nexla_sdk/models/credentials/requests.py:39` - -Request for previewing connector content. - -Fields: - -- `path`: `Optional` - -### ProbeSampleResponse - -Defined in `nexla_sdk/models/credentials/responses.py:65` - -Response from credential probe sample operation. - -Fields: - -- `status`: `str` -- `message`: `str` -- `connection_type`: `str` -- `output`: `Dict` - -### ProbeTreeRequest - -Defined in `nexla_sdk/models/credentials/requests.py:30` - -Request for probing storage structure. - -Fields: - -- `depth`: `int` -- `path`: `Optional` -- `database`: `Optional` -- `table`: `Optional` - -### ProbeTreeResponse - -Defined in `nexla_sdk/models/credentials/responses.py:56` - -Response from credential probe tree operation. - -Fields: - -- `status`: `str` -- `message`: `str` -- `connection_type`: `str` -- `object`: `Dict` - ### VerifiedStatus Defined in `nexla_sdk/models/credentials/enums.py:61` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.responses.mdx index 4a0f8b1..e5c6243 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.responses.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.credentials.responses.mdx @@ -10,7 +10,7 @@ keywords: [Nexla, SDK, Python, API] ### Credential -Defined in `nexla_sdk/models/credentials/responses.py:10` +Defined in `nexla_sdk/models/credentials/responses.py:11` Data credential response model. @@ -18,7 +18,7 @@ Fields: - `id`: `int` - `name`: `str` -- `credentials_type`: `str` +- `credentials_type`: `Union` - `owner`: `Optional` - `org`: `Optional` - `access_roles`: `Optional` @@ -41,7 +41,7 @@ Fields: ### ProbeSampleResponse -Defined in `nexla_sdk/models/credentials/responses.py:65` +Defined in `nexla_sdk/models/credentials/responses.py:66` Response from credential probe sample operation. @@ -54,7 +54,7 @@ Fields: ### ProbeTreeResponse -Defined in `nexla_sdk/models/credentials/responses.py:56` +Defined in `nexla_sdk/models/credentials/responses.py:57` Response from credential probe tree operation. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.mdx new file mode 100644 index 0000000..28c6894 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.mdx @@ -0,0 +1,93 @@ +--- +id: nexla_sdk.models.custom_data_flows +title: nexla_sdk.models.custom_data_flows +slug: /api/python/modules/nexla_sdk/models/custom_data_flows +description: API for nexla_sdk.models.custom_data_flows +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CustomDataFlow + +Defined in `nexla_sdk/models/custom_data_flows/responses.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_containers`: `Optional` +- `data_credentials`: `Optional` +- `access_roles`: `Optional` +- `tags`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### CustomDataFlowCreate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + +### CustomDataFlowUpdate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:17` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.requests.mdx new file mode 100644 index 0000000..73a4401 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.requests.mdx @@ -0,0 +1,60 @@ +--- +id: nexla_sdk.models.custom_data_flows.requests +title: nexla_sdk.models.custom_data_flows.requests +slug: /api/python/modules/nexla_sdk/models/custom_data_flows/requests +description: API for nexla_sdk.models.custom_data_flows.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CustomDataFlowCreate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + +### CustomDataFlowUpdate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:17` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.responses.mdx new file mode 100644 index 0000000..92ea992 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.custom_data_flows.responses.mdx @@ -0,0 +1,43 @@ +--- +id: nexla_sdk.models.custom_data_flows.responses +title: nexla_sdk.models.custom_data_flows.responses +slug: /api/python/modules/nexla_sdk/models/custom_data_flows/responses +description: API for nexla_sdk.models.custom_data_flows.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CustomDataFlow + +Defined in `nexla_sdk/models/custom_data_flows/responses.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_containers`: `Optional` +- `data_credentials`: `Optional` +- `access_roles`: `Optional` +- `tags`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.mdx new file mode 100644 index 0000000..59ca25e --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.mdx @@ -0,0 +1,69 @@ +--- +id: nexla_sdk.models.dashboard_transforms +title: nexla_sdk.models.dashboard_transforms +slug: /api/python/modules/nexla_sdk/models/dashboard_transforms +description: API for nexla_sdk.models.dashboard_transforms +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DashboardTransform + +Defined in `nexla_sdk/models/dashboard_transforms/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `error_transform`: `Optional` + +### DashboardTransformCreate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `int` + +### DashboardTransformUpdate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.requests.mdx new file mode 100644 index 0000000..0b5e4fd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.requests.mdx @@ -0,0 +1,46 @@ +--- +id: nexla_sdk.models.dashboard_transforms.requests +title: nexla_sdk.models.dashboard_transforms.requests +slug: /api/python/modules/nexla_sdk/models/dashboard_transforms/requests +description: API for nexla_sdk.models.dashboard_transforms.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DashboardTransformCreate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `int` + +### DashboardTransformUpdate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.responses.mdx new file mode 100644 index 0000000..b2f6fc1 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.dashboard_transforms.responses.mdx @@ -0,0 +1,33 @@ +--- +id: nexla_sdk.models.dashboard_transforms.responses +title: nexla_sdk.models.dashboard_transforms.responses +slug: /api/python/modules/nexla_sdk/models/dashboard_transforms/responses +description: API for nexla_sdk.models.dashboard_transforms.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DashboardTransform + +Defined in `nexla_sdk/models/dashboard_transforms/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `error_transform`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.mdx new file mode 100644 index 0000000..febe932 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.mdx @@ -0,0 +1,96 @@ +--- +id: nexla_sdk.models.data_credentials_groups +title: nexla_sdk.models.data_credentials_groups +slug: /api/python/modules/nexla_sdk/models/data_credentials_groups +description: API for nexla_sdk.models.data_credentials_groups +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DataCredentialsGroup + +Defined in `nexla_sdk/models/data_credentials_groups/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials_count`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### DataCredentialsGroupCreate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + +### DataCredentialsGroupRemoveCredentials + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:20` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials`: `List` + +### DataCredentialsGroupUpdate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.requests.mdx new file mode 100644 index 0000000..8e79c43 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.requests.mdx @@ -0,0 +1,70 @@ +--- +id: nexla_sdk.models.data_credentials_groups.requests +title: nexla_sdk.models.data_credentials_groups.requests +slug: /api/python/modules/nexla_sdk/models/data_credentials_groups/requests +description: API for nexla_sdk.models.data_credentials_groups.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DataCredentialsGroupCreate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + +### DataCredentialsGroupRemoveCredentials + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:20` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials`: `List` + +### DataCredentialsGroupUpdate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.responses.mdx new file mode 100644 index 0000000..cc8ebcd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.data_credentials_groups.responses.mdx @@ -0,0 +1,36 @@ +--- +id: nexla_sdk.models.data_credentials_groups.responses +title: nexla_sdk.models.data_credentials_groups.responses +slug: /api/python/modules/nexla_sdk/models/data_credentials_groups/responses +description: API for nexla_sdk.models.data_credentials_groups.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DataCredentialsGroup + +Defined in `nexla_sdk/models/data_credentials_groups/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials_count`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.mdx index be468e9..c260e0e 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.mdx @@ -8,109 +8,6 @@ keywords: [Nexla, SDK, Python, API] ## Classes -### DataMapInfo - -Defined in `nexla_sdk/models/destinations/responses.py:25` - -Basic data map information for destination. - -Fields: - -- `id`: `int` -- `owner_id`: `int` -- `org_id`: `int` -- `name`: `str` -- `description`: `Optional` -- `public`: `bool` -- `created_at`: `datetime` -- `updated_at`: `datetime` - -### DataSetInfo - -Defined in `nexla_sdk/models/destinations/responses.py:12` - -Basic dataset information for destination. - -Fields: - -- `id`: `int` -- `name`: `str` -- `description`: `Optional` -- `status`: `Optional` -- `output_schema`: `Optional` -- `version`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` - -### Destination - -Defined in `nexla_sdk/models/destinations/responses.py:38` - -Destination (data sink) response model. - -Fields: - -- `id`: `int` -- `name`: `str` -- `status`: `str` -- `sink_type`: `str` -- `connector_type`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `managed`: `Optional` -- `connector`: `Optional` -- `description`: `Optional` -- `data_set_id`: `Optional` -- `data_map_id`: `Optional` -- `data_source_id`: `Optional` -- `sink_format`: `Optional` -- `sink_config`: `Optional` -- `sink_schedule`: `Optional` -- `in_memory`: `bool` -- `data_set`: `Optional` -- `data_map`: `Optional` -- `data_credentials_id`: `Optional` -- `data_credentials`: `Optional` -- `copied_from_id`: `Optional` -- `flow_type`: `Optional` -- `has_template`: `Optional` -- `vendor_endpoint`: `Optional` -- `vendor`: `Optional` -- `tags`: `List` -- `created_at`: `Optional` -- `updated_at`: `Optional` - -### DestinationCopyOptions - -Defined in `nexla_sdk/models/destinations/requests.py:33` - -Options for copying a destination. - -Fields: - -- `reuse_data_credentials`: `bool` -- `copy_access_controls`: `bool` -- `owner_id`: `Optional` -- `org_id`: `Optional` - -### DestinationCreate - -Defined in `nexla_sdk/models/destinations/requests.py:6` - -Request model for creating a destination. - -Fields: - -- `name`: `str` -- `sink_type`: `str` -- `data_credentials_id`: `int` -- `data_set_id`: `int` -- `description`: `Optional` -- `sink_config`: `Optional` -- `vendor_endpoint_id`: `Optional` -- `template_config`: `Optional` - ### DestinationFormat Defined in `nexla_sdk/models/destinations/enums.py:89` @@ -205,17 +102,3 @@ Members: - `NEXLA_MONITOR` = `nexla_monitor` - `PINECONE` = `pinecone` -### DestinationUpdate - -Defined in `nexla_sdk/models/destinations/requests.py:23` - -Request model for updating a destination. - -Fields: - -- `name`: `Optional` -- `description`: `Optional` -- `sink_config`: `Optional` -- `data_credentials_id`: `Optional` -- `data_set_id`: `Optional` - diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.responses.mdx index 1e2c393..aedf610 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.responses.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.destinations.responses.mdx @@ -10,7 +10,7 @@ keywords: [Nexla, SDK, Python, API] ### DataMapInfo -Defined in `nexla_sdk/models/destinations/responses.py:25` +Defined in `nexla_sdk/models/destinations/responses.py:28` Basic data map information for destination. @@ -27,7 +27,7 @@ Fields: ### DataSetInfo -Defined in `nexla_sdk/models/destinations/responses.py:12` +Defined in `nexla_sdk/models/destinations/responses.py:15` Basic dataset information for destination. @@ -44,7 +44,7 @@ Fields: ### Destination -Defined in `nexla_sdk/models/destinations/responses.py:38` +Defined in `nexla_sdk/models/destinations/responses.py:41` Destination (data sink) response model. @@ -53,7 +53,7 @@ Fields: - `id`: `int` - `name`: `str` - `status`: `str` -- `sink_type`: `str` +- `sink_type`: `Union` - `connector_type`: `Optional` - `owner`: `Optional` - `org`: `Optional` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.mdx index 368014f..ece19a1 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.mdx @@ -10,20 +10,43 @@ keywords: [Nexla, SDK, Python, API] ### DocContainer -Defined in `nexla_sdk/models/doc_containers/responses.py:6` +Defined in `nexla_sdk/models/doc_containers/responses.py:10` -Base model class with Pydantic functionality and Nexla API compatibility. - -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Documentation container attached to a Nexla resource (e.g. a nexset). Fields: - `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` - `name`: `Optional` +- `description`: `Optional` +- `doc_type`: `Optional` +- `public`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `text`: `Optional` +- `access_roles`: `List` +- `tags`: `List` +- `copied_from_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### DocContainerInput + +Defined in `nexla_sdk/models/doc_containers/requests.py:10` + +Writable fields for creating or replacing a documentation entry. + +Server-owned and read-only fields (``id``, ``owner``, ``org``, +``public``, ``tags``, ``created_at`` etc.) are silently ignored on +construction so a full ``DocContainer`` response can be round-tripped +through this model to drop fields the API does not accept on input. + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `doc_type`: `str` +- `text`: `str` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.requests.mdx new file mode 100644 index 0000000..a9910fd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.requests.mdx @@ -0,0 +1,30 @@ +--- +id: nexla_sdk.models.doc_containers.requests +title: nexla_sdk.models.doc_containers.requests +slug: /api/python/modules/nexla_sdk/models/doc_containers/requests +description: API for nexla_sdk.models.doc_containers.requests +keywords: [Nexla, SDK, Python, API] +--- + +Request models for doc containers. + +## Classes + +### DocContainerInput + +Defined in `nexla_sdk/models/doc_containers/requests.py:10` + +Writable fields for creating or replacing a documentation entry. + +Server-owned and read-only fields (``id``, ``owner``, ``org``, +``public``, ``tags``, ``created_at`` etc.) are silently ignored on +construction so a full ``DocContainer`` response can be round-tripped +through this model to drop fields the API does not accept on input. + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `doc_type`: `str` +- `text`: `str` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.responses.mdx index 3d32f48..986fcef 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.responses.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.doc_containers.responses.mdx @@ -10,20 +10,25 @@ keywords: [Nexla, SDK, Python, API] ### DocContainer -Defined in `nexla_sdk/models/doc_containers/responses.py:6` +Defined in `nexla_sdk/models/doc_containers/responses.py:10` -Base model class with Pydantic functionality and Nexla API compatibility. - -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Documentation container attached to a Nexla resource (e.g. a nexset). Fields: - `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` - `name`: `Optional` +- `description`: `Optional` +- `doc_type`: `Optional` +- `public`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `text`: `Optional` +- `access_roles`: `List` +- `tags`: `List` +- `copied_from_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.flexible_enums.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.flexible_enums.mdx new file mode 100644 index 0000000..b038c1e --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.flexible_enums.mdx @@ -0,0 +1,47 @@ +--- +id: nexla_sdk.models.flexible_enums +title: nexla_sdk.models.flexible_enums +slug: /api/python/modules/nexla_sdk/models/flexible_enums +description: API for nexla_sdk.models.flexible_enums +keywords: [Nexla, SDK, Python, API] +--- + +Helper utilities for flexible enum handling in Pydantic models. + +These utilities allow enums to gracefully accept unknown values from API responses +without raising validation errors. Unknown values are preserved as strings. + +## Functions + +### `FlexibleEnum(enum_cls: Type[~E]) -> Type[Union[~E, str]]` + +Source: `nexla_sdk/models/flexible_enums.py:49` + +Create a flexible enum type annotation for Pydantic models. + +This creates an Annotated type that accepts either a valid enum value +or any string. Known values are returned as enum members; unknown values +are returned as raw strings. + +Usage: + sink_type: Optional[FlexibleEnum(DestinationType)] = None + +Args: + enum_cls: The enum class to create a flexible version of + +Returns: + An Annotated type suitable for Pydantic model fields + +### `flexible_enum_validator(enum_cls: Type[~E])` + +Source: `nexla_sdk/models/flexible_enums.py:22` + +Create a validator that accepts enum values or unknown strings. + +Args: + enum_cls: The enum class to validate against + +Returns: + A validator function that returns the enum member for known values, + or the raw string for unknown values. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.mdx new file mode 100644 index 0000000..8d34852 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.mdx @@ -0,0 +1,70 @@ +--- +id: nexla_sdk.models.flow_triggers +title: nexla_sdk.models.flow_triggers +slug: /api/python/modules/nexla_sdk/models/flow_triggers +description: API for nexla_sdk.models.flow_triggers +keywords: [Nexla, SDK, Python, API] +--- + +Flow triggers models. + +## Classes + +### FlowTrigger + +Defined in `nexla_sdk/models/flow_triggers/responses.py:10` + +Flow trigger response model. + +Flow triggers define orchestration events that trigger one flow +based on events from another flow. For example, triggering a +data source read when a data sink write completes. + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `status`: `str` +- `triggering_event_type`: `str` +- `triggering_origin_node_id`: `Optional` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggered_event_type`: `str` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `triggered_resource_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### FlowTriggerCreate + +Defined in `nexla_sdk/models/flow_triggers/requests.py:8` + +Request model for creating a flow trigger. + +Flow triggers define when one flow should trigger based on events +from another flow. The triggering and triggered resources must be +specified, along with the event types. + +Event Types: + - DATA_SINK_WRITE_DONE: Triggered when a data sink finishes writing + - DATA_SOURCE_READ_START: Triggered when a data source starts reading + - DATA_SOURCE_READ_DONE: Triggered when a data source finishes reading + +Fields: + +- `triggering_event_type`: `str` +- `triggered_event_type`: `str` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `data_sink_id`: `Optional` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `data_source_id`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.requests.mdx new file mode 100644 index 0000000..68d1c56 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.requests.mdx @@ -0,0 +1,42 @@ +--- +id: nexla_sdk.models.flow_triggers.requests +title: nexla_sdk.models.flow_triggers.requests +slug: /api/python/modules/nexla_sdk/models/flow_triggers/requests +description: API for nexla_sdk.models.flow_triggers.requests +keywords: [Nexla, SDK, Python, API] +--- + +Flow trigger request models. + +## Classes + +### FlowTriggerCreate + +Defined in `nexla_sdk/models/flow_triggers/requests.py:8` + +Request model for creating a flow trigger. + +Flow triggers define when one flow should trigger based on events +from another flow. The triggering and triggered resources must be +specified, along with the event types. + +Event Types: + - DATA_SINK_WRITE_DONE: Triggered when a data sink finishes writing + - DATA_SOURCE_READ_START: Triggered when a data source starts reading + - DATA_SOURCE_READ_DONE: Triggered when a data source finishes reading + +Fields: + +- `triggering_event_type`: `str` +- `triggered_event_type`: `str` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `data_sink_id`: `Optional` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `data_source_id`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.responses.mdx new file mode 100644 index 0000000..4ad66b6 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.flow_triggers.responses.mdx @@ -0,0 +1,40 @@ +--- +id: nexla_sdk.models.flow_triggers.responses +title: nexla_sdk.models.flow_triggers.responses +slug: /api/python/modules/nexla_sdk/models/flow_triggers/responses +description: API for nexla_sdk.models.flow_triggers.responses +keywords: [Nexla, SDK, Python, API] +--- + +Flow trigger response models. + +## Classes + +### FlowTrigger + +Defined in `nexla_sdk/models/flow_triggers/responses.py:10` + +Flow trigger response model. + +Flow triggers define orchestration events that trigger one flow +based on events from another flow. For example, triggering a +data source read when a data sink write completes. + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `status`: `str` +- `triggering_event_type`: `str` +- `triggering_origin_node_id`: `Optional` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggered_event_type`: `str` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `triggered_resource_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.mdx index afe43bb..bb2fdb4 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.mdx @@ -115,6 +115,128 @@ Fields: Methods: +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### ApiKey + +Defined in `nexla_sdk/models/api_keys/responses.py:9` + +API key response model. + +API keys are used for programmatic access to specific resources +like datasets, data sources, data sinks, and users. + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_set_id`: `Optional` +- `data_source_id`: `Optional` +- `data_sink_id`: `Optional` +- `user_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `scope`: `Optional` +- `api_key`: `Optional` +- `url`: `Optional` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### ApiKeyCreate + +Defined in `nexla_sdk/models/api_keys/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### ApiKeyUpdate + +Defined in `nexla_sdk/models/api_keys/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `scope`: `Optional` +- `expires_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### ApiKeysIndex + +Defined in `nexla_sdk/models/api_keys/responses.py:37` + +Response model for API keys index (grouped by type). + +Fields: + +- `data_sets`: `Optional` +- `data_sinks`: `Optional` +- `data_sources`: `Optional` +- `users`: `Optional` + +Methods: + - `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` - Source: `nexla_sdk/models/base.py:42` - Convert model to dictionary. @@ -500,19 +622,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### BaseModel +### AuthParameter -Defined in `nexla_sdk/models/base.py:10` +Defined in `nexla_sdk/models/auth_templates/responses.py:12` -Base model class with Pydantic functionality and Nexla API compatibility. +Auth parameter configuration for auth templates. -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + +Fields: + +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` Methods: @@ -523,24 +651,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### BlockedDomain - -Defined in `nexla_sdk/models/self_signup/responses.py:17` +### AuthParameterCreate -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/auth_templates/requests.py:8` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Auth parameter for template creation. Fields: -- `id`: `int` -- `domain`: `str` +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` Methods: @@ -551,38 +676,36 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CodeContainer +### AuthParameterResource -Defined in `nexla_sdk/models/code_containers/responses.py:12` +Defined in `nexla_sdk/models/auth_parameters/responses.py:13` -Pydantic model for Code Container responses. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: - `id`: `int` -- `name`: `str` -- `resource_type`: `Optional` -- `ai_function_type`: `Optional` -- `reusable`: `Optional` -- `public`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `data_credentials`: `Optional` -- `runtime_data_credentials`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` - `description`: `Optional` -- `code_type`: `Optional` -- `output_type`: `Optional` -- `code_config`: `Optional` -- `custom_config`: `Optional` -- `code_encoding`: `Optional` -- `code`: `Optional` -- `managed`: `Optional` -- `data_sets`: `Optional` -- `copied_from_id`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `vendor`: `Optional` +- `auth_template`: `Optional` +- `allowed_values`: `Optional` - `updated_at`: `Optional` - `created_at`: `Optional` -- `tags`: `Optional` Methods: @@ -593,9 +716,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CodeContainerCreate +### AuthParameterResourceCreate -Defined in `nexla_sdk/models/code_containers/requests.py:8` +Defined in `nexla_sdk/models/auth_parameters/requests.py:6` Base model class with Pydantic functionality and Nexla API compatibility. @@ -610,18 +733,16 @@ Features: Fields: - `name`: `str` -- `output_type`: `str` -- `reusable`: `bool` -- `code_type`: `str` -- `code_encoding`: `str` -- `code`: `List` +- `display_name`: `Optional` - `description`: `Optional` -- `public`: `Optional` -- `code_config`: `Optional` -- `custom_config`: `Optional` -- `data_credentials_id`: `Optional` -- `runtime_data_credentials_id`: `Optional` -- `ai_function_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` Methods: @@ -632,9 +753,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CodeContainerUpdate +### AuthParameterResourceUpdate -Defined in `nexla_sdk/models/code_containers/requests.py:26` +Defined in `nexla_sdk/models/auth_parameters/requests.py:20` Base model class with Pydantic functionality and Nexla API compatibility. @@ -649,18 +770,16 @@ Features: Fields: - `name`: `Optional` -- `output_type`: `Optional` -- `reusable`: `Optional` -- `code_type`: `Optional` -- `code_encoding`: `Optional` -- `code`: `Optional` +- `display_name`: `Optional` - `description`: `Optional` -- `public`: `Optional` -- `code_config`: `Optional` -- `custom_config`: `Optional` -- `data_credentials_id`: `Optional` -- `runtime_data_credentials_id`: `Optional` -- `ai_function_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `secured`: `Optional` +- `global_param`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `allowed_values`: `Optional` Methods: @@ -671,20 +790,27 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Connector +### AuthTemplate -Defined in `nexla_sdk/models/common.py:34` +Defined in `nexla_sdk/models/auth_templates/responses.py:33` -Connector information. +Auth template response model. + +Auth templates define authentication configurations for vendors. Fields: - `id`: `int` -- `type`: `str` -- `connection_type`: `str` -- `name`: `str` -- `description`: `str` -- `nexset_api_compatible`: `bool` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `credentials_type`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `auth_parameters`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -695,52 +821,49 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ConnectorCategory +### AuthTemplateCreate -Defined in `nexla_sdk/models/enums.py:93` +Defined in `nexla_sdk/models/auth_templates/requests.py:20` -Connector categories. +Request model for creating an auth template (super user only). -Members: +Fields: -- `FILE` = `file` -- `DATABASE` = `database` -- `NOSQL` = `nosql` -- `STREAMING` = `streaming` -- `API` = `api` -- `VECTOR_DB` = `vector_db` -- `SPECIAL` = `special` +- `name`: `str` +- `vendor_id`: `int` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `auth_parameters`: `Optional` -### Credential +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. -Defined in `nexla_sdk/models/credentials/responses.py:10` +### AuthTemplateParameter -Data credential response model. +Defined in `nexla_sdk/models/auth_templates/responses.py:12` + +Auth parameter configuration for auth templates. + +This is a lightweight nested model used within AuthTemplate responses. +For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. Fields: -- `id`: `int` -- `name`: `str` -- `credentials_type`: `str` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `verified_status`: `Optional` -- `connector`: `Optional` +- `id`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` - `description`: `Optional` -- `credentials_version`: `Optional` -- `api_keys`: `Optional` -- `credentials_non_secure_data`: `Optional` -- `verified_at`: `Optional` -- `copied_from_id`: `Optional` -- `template_config`: `Optional` -- `vendor`: `Optional` -- `auth_template`: `Optional` -- `referenced_resource_ids`: `Optional` -- `tags`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` -- `managed`: `bool` +- `param_type`: `Optional` +- `required`: `Optional` +- `default_value`: `Optional` +- `config`: `Optional` Methods: @@ -751,21 +874,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CredentialCreate +### AuthTemplateUpdate -Defined in `nexla_sdk/models/credentials/requests.py:6` +Defined in `nexla_sdk/models/auth_templates/requests.py:31` -Request model for creating a credential. +Request model for updating an auth template (super user only). Fields: -- `name`: `str` -- `credentials_type`: `str` +- `name`: `Optional` +- `display_name`: `Optional` - `description`: `Optional` -- `auth_template_id`: `Optional` -- `vendor_id`: `Optional` -- `template_config`: `Optional` -- `credentials`: `Optional` +- `config`: `Optional` Methods: @@ -776,78 +896,47 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CredentialType +### BaseModel -Defined in `nexla_sdk/models/credentials/enums.py:4` +Defined in `nexla_sdk/models/base.py:10` -Supported credential types. +Base model class with Pydantic functionality and Nexla API compatibility. -Members: +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support -- `AS400` = `as400` -- `AWS_ATHENA` = `aws_athena` -- `AZURE_BLB` = `azure_blb` -- `AZURE_DATA_LAKE` = `azure_data_lake` -- `AZURE_SYNAPSE` = `azure_synapse` -- `BIGQUERY` = `bigquery` -- `BOX` = `box` -- `CLOUDSQL_MYSQL` = `cloudsql_mysql` -- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` -- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` -- `CONFLUENT_KAFKA` = `confluent_kafka` -- `DATABRICKS` = `databricks` -- `DB2` = `db2` -- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` -- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` -- `DELTA_LAKE_S3` = `delta_lake_s3` -- `DROPBOX` = `dropbox` -- `DYNAMODB` = `dynamodb` -- `FIREBASE` = `firebase` -- `FIREBOLT` = `firebolt` -- `FTP` = `ftp` -- `GCP_ALLOYDB` = `gcp_alloydb` -- `GCP_SPANNER` = `gcp_spanner` -- `GCS` = `gcs` -- `GDRIVE` = `gdrive` -- `GOOGLE_PUBSUB` = `google_pubsub` -- `HANA_JDBC` = `hana_jdbc` -- `HIVE` = `hive` -- `JMS` = `jms` -- `KAFKA` = `kafka` -- `MIN_IO_S3` = `min_io_s3` -- `MONGO` = `mongo` -- `MYSQL` = `mysql` -- `NETSUITE_JDBC` = `netsuite_jdbc` -- `NEXLA_MONITOR` = `nexla_monitor` -- `ORACLE` = `oracle` -- `ORACLE_AUTONOMOUS` = `oracle_autonomous` -- `PINECONE` = `pinecone` -- `POSTGRES` = `postgres` -- `REDSHIFT` = `redshift` -- `REST` = `rest` -- `S3` = `s3` -- `S3_ICEBERG` = `s3_iceberg` -- `SHAREPOINT` = `sharepoint` -- `SNOWFLAKE` = `snowflake` -- `SNOWFLAKE_DCR` = `snowflake_dcr` -- `SOAP` = `soap` -- `SQLSERVER` = `sqlserver` -- `SYBASE` = `sybase` -- `TERADATA` = `teradata` -- `TIBCO` = `tibco` -- `WEBDAV` = `webdav` +Methods: -### CredentialUpdate +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. -Defined in `nexla_sdk/models/credentials/requests.py:22` +### BlockedDomain -Request model for updating a credential. +Defined in `nexla_sdk/models/self_signup/responses.py:17` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `name`: `Optional` -- `description`: `Optional` -- `credentials`: `Optional` +- `id`: `int` +- `domain`: `str` Methods: @@ -858,17 +947,35 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CustodianUser +### CatalogConfig -Defined in `nexla_sdk/models/organizations/responses.py:74` +Defined in `nexla_sdk/models/catalog_configs/responses.py:9` -Simplified user view for organization custodians endpoints. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: - `id`: `int` -- `email`: `Optional` -- `full_name`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `data_credentials`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` +- `job_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` Methods: @@ -879,9 +986,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### CustodiansPayload +### CatalogConfigCreate -Defined in `nexla_sdk/models/marketplace/requests.py:13` +Defined in `nexla_sdk/models/catalog_configs/requests.py:6` Base model class with Pydantic functionality and Nexla API compatibility. @@ -895,7 +1002,12 @@ Features: Fields: -- `custodians`: `List` +- `name`: `str` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` Methods: @@ -906,16 +1018,28 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DashboardMetrics +### CatalogConfigUpdate -Defined in `nexla_sdk/models/metrics/responses.py:23` +Defined in `nexla_sdk/models/catalog_configs/requests.py:15` -24-hour dashboard metrics. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `status`: `int` -- `metrics`: `Dict` +- `name`: `Optional` +- `description`: `Optional` +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `templates`: `Optional` +- `mode`: `Optional` Methods: @@ -926,22 +1050,31 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DataMapInfo +### CatalogRef -Defined in `nexla_sdk/models/destinations/responses.py:25` +Defined in `nexla_sdk/models/catalog_refs/responses.py:8` -Basic data map information for destination. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: - `id`: `int` -- `owner_id`: `int` -- `org_id`: `int` -- `name`: `str` -- `description`: `Optional` -- `public`: `bool` -- `created_at`: `datetime` -- `updated_at`: `datetime` +- `data_set_id`: `Optional` +- `status`: `Optional` +- `reference_id`: `Optional` +- `link`: `Optional` +- `error_msg`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` +- `catalog_config`: `Optional` Methods: @@ -952,9 +1085,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DataSchema +### CatalogRefCreate -Defined in `nexla_sdk/models/data_schemas/responses.py:6` +Defined in `nexla_sdk/models/catalog_refs/requests.py:6` Base model class with Pydantic functionality and Nexla API compatibility. @@ -968,8 +1101,10 @@ Features: Fields: -- `id`: `int` -- `name`: `Optional` +- `data_set_id`: `int` +- `catalog_config_id`: `int` +- `reference_id`: `Optional` +- `link`: `Optional` Methods: @@ -980,22 +1115,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DataSetBrief +### CatalogRefUpdate -Defined in `nexla_sdk/models/sources/responses.py:11` +Defined in `nexla_sdk/models/catalog_refs/requests.py:13` -Brief dataset information. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `id`: `int` -- `owner_id`: `int` -- `org_id`: `int` -- `name`: `Optional` -- `description`: `Optional` -- `version`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `reference_id`: `Optional` +- `link`: `Optional` +- `status`: `Optional` Methods: @@ -1006,20 +1144,29 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DataSetInfo +### Cluster -Defined in `nexla_sdk/models/destinations/responses.py:12` +Defined in `nexla_sdk/models/clusters/responses.py:24` -Basic dataset information for destination. +Cluster response model. + +Clusters define infrastructure endpoints for processing data flows. +They contain multiple endpoints for different services. Fields: - `id`: `int` -- `name`: `str` +- `org_id`: `Optional` +- `uid`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `name`: `Optional` - `description`: `Optional` - `status`: `Optional` -- `output_schema`: `Optional` -- `version`: `Optional` +- `region`: `Optional` +- `provider`: `Optional` +- `org`: `Optional` +- `endpoints`: `Optional` - `created_at`: `Optional` - `updated_at`: `Optional` @@ -1032,20 +1179,22 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DataSinkSimplified +### ClusterCreate -Defined in `nexla_sdk/models/nexsets/responses.py:12` +Defined in `nexla_sdk/models/clusters/requests.py:19` -Simplified data sink information. +Request model for creating a cluster. Fields: -- `id`: `int` -- `owner_id`: `Optional` -- `org_id`: `Optional` +- `org_id`: `int` - `name`: `str` -- `status`: `Optional` -- `sink_type`: `Optional` +- `region`: `str` +- `description`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` Methods: @@ -1056,16 +1205,28 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DefaultOrg +### ClusterEndpoint -Defined in `nexla_sdk/models/users/responses.py:9` +Defined in `nexla_sdk/models/clusters/responses.py:47` -User's default organization. +Cluster endpoint response model. + +Endpoints define individual service connections within a cluster. Fields: - `id`: `int` -- `name`: `str` +- `cluster_id`: `Optional` +- `org_id`: `Optional` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -1076,44 +1237,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Destination +### ClusterEndpointCreate -Defined in `nexla_sdk/models/destinations/responses.py:38` +Defined in `nexla_sdk/models/clusters/requests.py:43` -Destination (data sink) response model. +Request model for creating a cluster endpoint. Fields: -- `id`: `int` -- `name`: `str` -- `status`: `str` -- `sink_type`: `str` -- `connector_type`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `managed`: `Optional` -- `connector`: `Optional` -- `description`: `Optional` -- `data_set_id`: `Optional` -- `data_map_id`: `Optional` -- `data_source_id`: `Optional` -- `sink_format`: `Optional` -- `sink_config`: `Optional` -- `sink_schedule`: `Optional` -- `in_memory`: `bool` -- `data_set`: `Optional` -- `data_map`: `Optional` -- `data_credentials_id`: `Optional` -- `data_credentials`: `Optional` -- `copied_from_id`: `Optional` -- `flow_type`: `Optional` -- `has_template`: `Optional` -- `vendor_endpoint`: `Optional` -- `vendor`: `Optional` -- `tags`: `List` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `cluster_id`: `int` +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` Methods: @@ -1124,18 +1262,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DestinationCopyOptions +### ClusterEndpointItem -Defined in `nexla_sdk/models/destinations/requests.py:33` +Defined in `nexla_sdk/models/clusters/requests.py:8` -Options for copying a destination. +Endpoint configuration for cluster create/update. Fields: -- `reuse_data_credentials`: `bool` -- `copy_access_controls`: `bool` -- `owner_id`: `Optional` -- `org_id`: `Optional` +- `service`: `str` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` Methods: @@ -1146,22 +1286,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DestinationCreate +### ClusterEndpointRef -Defined in `nexla_sdk/models/destinations/requests.py:6` +Defined in `nexla_sdk/models/clusters/responses.py:12` -Request model for creating a destination. +Cluster endpoint reference for cluster response. Fields: -- `name`: `str` -- `sink_type`: `str` -- `data_credentials_id`: `int` -- `data_set_id`: `int` -- `description`: `Optional` -- `sink_config`: `Optional` -- `vendor_endpoint_id`: `Optional` -- `template_config`: `Optional` +- `id`: `int` +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` Methods: @@ -1172,113 +1311,44 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DestinationFormat - -Defined in `nexla_sdk/models/destinations/enums.py:89` - -Output format for destinations. - -Members: - -- `JSON` = `json` -- `CSV` = `csv` -- `PARQUET` = `parquet` -- `AVRO` = `avro` -- `XML` = `xml` -- `DELIMITED` = `delimited` -- `FIXED_WIDTH` = `fixed_width` - -### DestinationStatus - -Defined in `nexla_sdk/models/destinations/enums.py:4` - -Destination status values. - -Members: +### ClusterEndpointUpdate -- `ACTIVE` = `ACTIVE` -- `PAUSED` = `PAUSED` -- `DRAFT` = `DRAFT` -- `DELETED` = `DELETED` -- `ERROR` = `ERROR` +Defined in `nexla_sdk/models/clusters/requests.py:55` -### DestinationType +Request model for updating a cluster endpoint. -Defined in `nexla_sdk/models/destinations/enums.py:14` +Fields: -Supported sink types. +- `service`: `Optional` +- `protocol`: `Optional` +- `host`: `Optional` +- `port`: `Optional` +- `context`: `Optional` +- `header_host`: `Optional` -Members: +Methods: -- `S3` = `s3` -- `GCS` = `gcs` -- `AZURE_BLB` = `azure_blb` -- `AZURE_DATA_LAKE` = `azure_data_lake` -- `FTP` = `ftp` -- `DROPBOX` = `dropbox` -- `BOX` = `box` -- `GDRIVE` = `gdrive` -- `SHAREPOINT` = `sharepoint` -- `MIN_IO_S3` = `min_io_s3` -- `WEBDAV` = `webdav` -- `MYSQL` = `mysql` -- `POSTGRES` = `postgres` -- `SUPABASE` = `supabase` -- `SQLSERVER` = `sqlserver` -- `ORACLE` = `oracle` -- `ORACLE_AUTONOMOUS` = `oracle_autonomous` -- `REDSHIFT` = `redshift` -- `SNOWFLAKE` = `snowflake` -- `SNOWFLAKE_DCR` = `snowflake_dcr` -- `BIGQUERY` = `bigquery` -- `DATABRICKS` = `databricks` -- `AS400` = `as400` -- `AWS_ATHENA` = `aws_athena` -- `AZURE_SYNAPSE` = `azure_synapse` -- `CLOUDSQL_MYSQL` = `cloudsql_mysql` -- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` -- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` -- `DB2` = `db2` -- `FIREBOLT` = `firebolt` -- `GCP_ALLOYDB` = `gcp_alloydb` -- `GCP_SPANNER` = `gcp_spanner` -- `HANA_JDBC` = `hana_jdbc` -- `HIVE` = `hive` -- `NETSUITE_JDBC` = `netsuite_jdbc` -- `SYBASE` = `sybase` -- `TERADATA` = `teradata` -- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` -- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` -- `DELTA_LAKE_S3` = `delta_lake_s3` -- `S3_ICEBERG` = `s3_iceberg` -- `MONGO` = `mongo` -- `DYNAMODB` = `dynamodb` -- `FIREBASE` = `firebase` -- `KAFKA` = `kafka` -- `CONFLUENT_KAFKA` = `confluent_kafka` -- `GOOGLE_PUBSUB` = `google_pubsub` -- `JMS` = `jms` -- `TIBCO` = `tibco` -- `REST` = `rest` -- `SOAP` = `soap` -- `EMAIL` = `email` -- `DATA_MAP` = `data_map` -- `NEXLA_MONITOR` = `nexla_monitor` -- `PINECONE` = `pinecone` +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. -### DestinationUpdate +### ClusterUpdate -Defined in `nexla_sdk/models/destinations/requests.py:23` +Defined in `nexla_sdk/models/clusters/requests.py:32` -Request model for updating a destination. +Request model for updating a cluster. Fields: - `name`: `Optional` - `description`: `Optional` -- `sink_config`: `Optional` -- `data_credentials_id`: `Optional` -- `data_set_id`: `Optional` +- `provider`: `Optional` +- `is_default`: `Optional` +- `is_private`: `Optional` +- `endpoints`: `Optional` Methods: @@ -1289,24 +1359,38 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DocContainer - -Defined in `nexla_sdk/models/doc_containers/responses.py:6` +### CodeContainer -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/code_containers/responses.py:12` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Pydantic model for Code Container responses. Fields: - `id`: `int` -- `name`: `Optional` +- `name`: `str` +- `resource_type`: `Optional` +- `ai_function_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `data_credentials`: `Optional` +- `runtime_data_credentials`: `Optional` +- `description`: `Optional` +- `code_type`: `Optional` +- `output_type`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `code_encoding`: `Optional` +- `code`: `Optional` +- `managed`: `Optional` +- `data_sets`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` +- `tags`: `Optional` Methods: @@ -1317,20 +1401,35 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DocsRecommendation +### CodeContainerCreate -Defined in `nexla_sdk/models/flows/responses.py:152` +Defined in `nexla_sdk/models/code_containers/requests.py:8` -Response from docs_recommendation() with AI-generated documentation. +Base model class with Pydantic functionality and Nexla API compatibility. -Attributes: - recommendation: The AI-generated documentation suggestion. - status: Status of the recommendation request. +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `recommendation`: `Optional` -- `status`: `Optional` +- `name`: `str` +- `output_type`: `str` +- `reusable`: `bool` +- `code_type`: `str` +- `code_encoding`: `str` +- `code`: `List` +- `description`: `Optional` +- `public`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `ai_function_type`: `Optional` Methods: @@ -1341,9 +1440,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### DownloadLink +### CodeContainerUpdate -Defined in `nexla_sdk/models/async_tasks/responses.py:24` +Defined in `nexla_sdk/models/code_containers/requests.py:26` Base model class with Pydantic functionality and Nexla API compatibility. @@ -1357,8 +1456,19 @@ Features: Fields: -- `url`: `str` -- `expires_at`: `Optional` +- `name`: `Optional` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `code_type`: `Optional` +- `code_encoding`: `Optional` +- `code`: `Optional` +- `description`: `Optional` +- `public`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `ai_function_type`: `Optional` Methods: @@ -1369,19 +1479,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowCopyOptions +### Connector -Defined in `nexla_sdk/models/flows/requests.py:6` +Defined in `nexla_sdk/models/common.py:38` -Options for copying a flow. +Connector information. Fields: -- `reuse_data_credentials`: `bool` -- `copy_access_controls`: `bool` -- `copy_dependent_data_flows`: `bool` -- `owner_id`: `Optional` -- `org_id`: `Optional` +- `id`: `int` +- `type`: `Union` +- `connection_type`: `Union` +- `name`: `str` +- `description`: `str` +- `nexset_api_compatible`: `bool` Methods: @@ -1392,15 +1503,1115 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowElements +### ConnectorCategory -Defined in `nexla_sdk/models/flows/responses.py:164` +Defined in `nexla_sdk/models/enums.py:93` -Flow elements containing all resources. +Connector categories. -Fields: +Members: -- `code_containers`: `List` +- `FILE` = `file` +- `DATABASE` = `database` +- `NOSQL` = `nosql` +- `STREAMING` = `streaming` +- `API` = `api` +- `VECTOR_DB` = `vector_db` +- `SPECIAL` = `special` + +### ConnectorDefinition + +Defined in `nexla_sdk/models/connectors/responses.py:13` + +Connector response model. + +Connectors define connection types for data sources and destinations. + +Fields: + +- `id`: `int` +- `type`: `Optional` +- `connection_type`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `nexset_api_compatible`: `Optional` +- `sync_api_compatible`: `Optional` +- `config`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### ConnectorUpdate + +Defined in `nexla_sdk/models/connectors/requests.py:8` + +Request model for updating a connector (super user only). + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `nexset_api_compatible`: `Optional` +- `sync_api_compatible`: `Optional` +- `config`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Credential + +Defined in `nexla_sdk/models/credentials/responses.py:11` + +Data credential response model. + +Fields: + +- `id`: `int` +- `name`: `str` +- `credentials_type`: `Union` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `verified_status`: `Optional` +- `connector`: `Optional` +- `description`: `Optional` +- `credentials_version`: `Optional` +- `api_keys`: `Optional` +- `credentials_non_secure_data`: `Optional` +- `verified_at`: `Optional` +- `copied_from_id`: `Optional` +- `template_config`: `Optional` +- `vendor`: `Optional` +- `auth_template`: `Optional` +- `referenced_resource_ids`: `Optional` +- `tags`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` +- `managed`: `bool` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CredentialCreate + +Defined in `nexla_sdk/models/credentials/requests.py:6` + +Request model for creating a credential. + +Fields: + +- `name`: `str` +- `credentials_type`: `str` +- `description`: `Optional` +- `auth_template_id`: `Optional` +- `vendor_id`: `Optional` +- `template_config`: `Optional` +- `credentials`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CredentialType + +Defined in `nexla_sdk/models/credentials/enums.py:4` + +Supported credential types. + +Members: + +- `AS400` = `as400` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` +- `AZURE_SYNAPSE` = `azure_synapse` +- `BIGQUERY` = `bigquery` +- `BOX` = `box` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `CONFLUENT_KAFKA` = `confluent_kafka` +- `DATABRICKS` = `databricks` +- `DB2` = `db2` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `DROPBOX` = `dropbox` +- `DYNAMODB` = `dynamodb` +- `FIREBASE` = `firebase` +- `FIREBOLT` = `firebolt` +- `FTP` = `ftp` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `GCS` = `gcs` +- `GDRIVE` = `gdrive` +- `GOOGLE_PUBSUB` = `google_pubsub` +- `HANA_JDBC` = `hana_jdbc` +- `HIVE` = `hive` +- `JMS` = `jms` +- `KAFKA` = `kafka` +- `MIN_IO_S3` = `min_io_s3` +- `MONGO` = `mongo` +- `MYSQL` = `mysql` +- `NETSUITE_JDBC` = `netsuite_jdbc` +- `NEXLA_MONITOR` = `nexla_monitor` +- `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `PINECONE` = `pinecone` +- `POSTGRES` = `postgres` +- `REDSHIFT` = `redshift` +- `REST` = `rest` +- `S3` = `s3` +- `S3_ICEBERG` = `s3_iceberg` +- `SHAREPOINT` = `sharepoint` +- `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` +- `SOAP` = `soap` +- `SQLSERVER` = `sqlserver` +- `SYBASE` = `sybase` +- `TERADATA` = `teradata` +- `TIBCO` = `tibco` +- `WEBDAV` = `webdav` + +### CredentialUpdate + +Defined in `nexla_sdk/models/credentials/requests.py:22` + +Request model for updating a credential. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `credentials`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CustodianUser + +Defined in `nexla_sdk/models/organizations/responses.py:74` + +Simplified user view for organization custodians endpoints. + +Fields: + +- `id`: `int` +- `email`: `Optional` +- `full_name`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CustodiansPayload + +Defined in `nexla_sdk/models/marketplace/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `custodians`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CustomDataFlow + +Defined in `nexla_sdk/models/custom_data_flows/responses.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_containers`: `Optional` +- `data_credentials`: `Optional` +- `access_roles`: `Optional` +- `tags`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CustomDataFlowCreate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### CustomDataFlowUpdate + +Defined in `nexla_sdk/models/custom_data_flows/requests.py:17` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `flow_type`: `Optional` +- `status`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `code_container_ids`: `Optional` +- `data_credentials_ids`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DashboardMetrics + +Defined in `nexla_sdk/models/metrics/responses.py:23` + +24-hour dashboard metrics. + +Fields: + +- `status`: `int` +- `metrics`: `Dict` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DashboardTransform + +Defined in `nexla_sdk/models/dashboard_transforms/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `error_transform`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DashboardTransformCreate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `int` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DashboardTransformUpdate + +Defined in `nexla_sdk/models/dashboard_transforms/requests.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `code_container_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataCredentialsGroup + +Defined in `nexla_sdk/models/data_credentials_groups/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials_count`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataCredentialsGroupCreate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataCredentialsGroupRemoveCredentials + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:20` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataCredentialsGroupUpdate + +Defined in `nexla_sdk/models/data_credentials_groups/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataMapInfo + +Defined in `nexla_sdk/models/destinations/responses.py:28` + +Basic data map information for destination. + +Fields: + +- `id`: `int` +- `owner_id`: `int` +- `org_id`: `int` +- `name`: `str` +- `description`: `Optional` +- `public`: `bool` +- `created_at`: `datetime` +- `updated_at`: `datetime` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataSchema + +Defined in `nexla_sdk/models/data_schemas/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataSetBrief + +Defined in `nexla_sdk/models/sources/responses.py:12` + +Brief dataset information. + +Fields: + +- `id`: `int` +- `owner_id`: `int` +- `org_id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `version`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataSetInfo + +Defined in `nexla_sdk/models/destinations/responses.py:15` + +Basic dataset information for destination. + +Fields: + +- `id`: `int` +- `name`: `str` +- `description`: `Optional` +- `status`: `Optional` +- `output_schema`: `Optional` +- `version`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DataSinkSimplified + +Defined in `nexla_sdk/models/nexsets/responses.py:12` + +Simplified data sink information. + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `name`: `str` +- `status`: `Optional` +- `sink_type`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DefaultOrg + +Defined in `nexla_sdk/models/users/responses.py:9` + +User's default organization. + +Fields: + +- `id`: `int` +- `name`: `str` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Destination + +Defined in `nexla_sdk/models/destinations/responses.py:41` + +Destination (data sink) response model. + +Fields: + +- `id`: `int` +- `name`: `str` +- `status`: `str` +- `sink_type`: `Union` +- `connector_type`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `managed`: `Optional` +- `connector`: `Optional` +- `description`: `Optional` +- `data_set_id`: `Optional` +- `data_map_id`: `Optional` +- `data_source_id`: `Optional` +- `sink_format`: `Optional` +- `sink_config`: `Optional` +- `sink_schedule`: `Optional` +- `in_memory`: `bool` +- `data_set`: `Optional` +- `data_map`: `Optional` +- `data_credentials_id`: `Optional` +- `data_credentials`: `Optional` +- `copied_from_id`: `Optional` +- `flow_type`: `Optional` +- `has_template`: `Optional` +- `vendor_endpoint`: `Optional` +- `vendor`: `Optional` +- `tags`: `List` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DestinationCopyOptions + +Defined in `nexla_sdk/models/destinations/requests.py:33` + +Options for copying a destination. + +Fields: + +- `reuse_data_credentials`: `bool` +- `copy_access_controls`: `bool` +- `owner_id`: `Optional` +- `org_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DestinationCreate + +Defined in `nexla_sdk/models/destinations/requests.py:6` + +Request model for creating a destination. + +Fields: + +- `name`: `str` +- `sink_type`: `str` +- `data_credentials_id`: `int` +- `data_set_id`: `int` +- `description`: `Optional` +- `sink_config`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `template_config`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DestinationFormat + +Defined in `nexla_sdk/models/destinations/enums.py:89` + +Output format for destinations. + +Members: + +- `JSON` = `json` +- `CSV` = `csv` +- `PARQUET` = `parquet` +- `AVRO` = `avro` +- `XML` = `xml` +- `DELIMITED` = `delimited` +- `FIXED_WIDTH` = `fixed_width` + +### DestinationStatus + +Defined in `nexla_sdk/models/destinations/enums.py:4` + +Destination status values. + +Members: + +- `ACTIVE` = `ACTIVE` +- `PAUSED` = `PAUSED` +- `DRAFT` = `DRAFT` +- `DELETED` = `DELETED` +- `ERROR` = `ERROR` + +### DestinationType + +Defined in `nexla_sdk/models/destinations/enums.py:14` + +Supported sink types. + +Members: + +- `S3` = `s3` +- `GCS` = `gcs` +- `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` +- `FTP` = `ftp` +- `DROPBOX` = `dropbox` +- `BOX` = `box` +- `GDRIVE` = `gdrive` +- `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` +- `MYSQL` = `mysql` +- `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` +- `SQLSERVER` = `sqlserver` +- `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `REDSHIFT` = `redshift` +- `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` +- `BIGQUERY` = `bigquery` +- `DATABRICKS` = `databricks` +- `AS400` = `as400` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `DB2` = `db2` +- `FIREBOLT` = `firebolt` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `HANA_JDBC` = `hana_jdbc` +- `HIVE` = `hive` +- `NETSUITE_JDBC` = `netsuite_jdbc` +- `SYBASE` = `sybase` +- `TERADATA` = `teradata` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` +- `MONGO` = `mongo` +- `DYNAMODB` = `dynamodb` +- `FIREBASE` = `firebase` +- `KAFKA` = `kafka` +- `CONFLUENT_KAFKA` = `confluent_kafka` +- `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` +- `REST` = `rest` +- `SOAP` = `soap` +- `EMAIL` = `email` +- `DATA_MAP` = `data_map` +- `NEXLA_MONITOR` = `nexla_monitor` +- `PINECONE` = `pinecone` + +### DestinationUpdate + +Defined in `nexla_sdk/models/destinations/requests.py:23` + +Request model for updating a destination. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `sink_config`: `Optional` +- `data_credentials_id`: `Optional` +- `data_set_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DocContainer + +Defined in `nexla_sdk/models/doc_containers/responses.py:10` + +Documentation container attached to a Nexla resource (e.g. a nexset). + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `doc_type`: `Optional` +- `public`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `text`: `Optional` +- `access_roles`: `List` +- `tags`: `List` +- `copied_from_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DocContainerInput + +Defined in `nexla_sdk/models/doc_containers/requests.py:10` + +Writable fields for creating or replacing a documentation entry. + +Server-owned and read-only fields (``id``, ``owner``, ``org``, +``public``, ``tags``, ``created_at`` etc.) are silently ignored on +construction so a full ``DocContainer`` response can be round-tripped +through this model to drop fields the API does not accept on input. + +Fields: + +- `name`: `str` +- `description`: `Optional` +- `doc_type`: `str` +- `text`: `str` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DocsRecommendation + +Defined in `nexla_sdk/models/flows/responses.py:152` + +Response from docs_recommendation() with AI-generated documentation. + +Attributes: + recommendation: The AI-generated documentation suggestion. + status: Status of the recommendation request. + +Fields: + +- `recommendation`: `Optional` +- `status`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### DownloadLink + +Defined in `nexla_sdk/models/async_tasks/responses.py:24` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `url`: `str` +- `expires_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowCopyOptions + +Defined in `nexla_sdk/models/flows/requests.py:6` + +Options for copying a flow. + +Fields: + +- `reuse_data_credentials`: `bool` +- `copy_access_controls`: `bool` +- `copy_dependent_data_flows`: `bool` +- `owner_id`: `Optional` +- `org_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowElements + +Defined in `nexla_sdk/models/flows/responses.py:164` + +Flow elements containing all resources. + +Fields: + +- `code_containers`: `List` - `data_sources`: `List` - `data_sets`: `List` - `data_sinks`: `List` @@ -1419,22 +2630,747 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowLogEntry +### FlowLogEntry + +Defined in `nexla_sdk/models/flows/responses.py:25` + +A single flow execution log entry. + +Fields: + +- `timestamp`: `Optional` +- `level`: `Optional` +- `message`: `Optional` +- `log_type`: `Optional` +- `resource_id`: `Optional` +- `resource_type`: `Optional` +- `run_id`: `Optional` +- `details`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowLogsMeta + +Defined in `nexla_sdk/models/flows/responses.py:53` + +Metadata for flow logs pagination. + +The live API also returns run context fields (org_id, run_id) in logs.meta. + +Fields: + +- `current_page`: `Optional` +- `page_count`: `Optional` +- `total_count`: `Optional` +- `org_id`: `Optional` +- `run_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowLogsResponse + +Defined in `nexla_sdk/models/flows/responses.py:82` + +Response from get_logs() containing flow execution logs. + +Attributes: + status: Status code of the response (200 for success). + message: Status message ("Ok" for success). + logs: List of log entries. + meta: Pagination metadata. + +Fields: + +- `status`: `Optional` +- `message`: `Optional` +- `logs`: `List` +- `meta`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowMetricData + +Defined in `nexla_sdk/models/flows/responses.py:113` + +Flow metric data for a resource. + +Fields: + +- `records`: `Optional` +- `size`: `Optional` +- `errors`: `Optional` +- `run_id`: `Optional` +- `reporting_date`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowMetrics + +Defined in `nexla_sdk/models/flows/responses.py:14` + +Flow metrics information. + +Fields: + +- `origin_node_id`: `int` +- `records`: `int` +- `size`: `int` +- `errors`: `int` +- `reporting_date`: `datetime` +- `run_id`: `int` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowMetricsApiResponse + +Defined in `nexla_sdk/models/flows/responses.py:138` + +Response from get_metrics() containing flow metrics. + +Attributes: + status: Status code of the response (200 for success). + message: Status message ("Ok" for success). + metrics: Metrics data including resource-keyed data and pagination. + +Fields: + +- `status`: `Optional` +- `message`: `Optional` +- `metrics`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowMetricsData + +Defined in `nexla_sdk/models/flows/responses.py:131` + +Flow metrics data container. + +Fields: + +- `data`: `Optional` +- `meta`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowMetricsMeta + +Defined in `nexla_sdk/models/flows/responses.py:123` + +Metadata for flow metrics pagination. + +Fields: + +- `current_page`: `Optional` +- `page_count`: `Optional` +- `total_count`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowNode + +Defined in `nexla_sdk/models/common.py:70` + +Flow node in a data pipeline. + +Fields: + +- `id`: `int` +- `origin_node_id`: `int` +- `parent_node_id`: `Optional` +- `data_source_id`: `Optional` +- `data_set_id`: `Optional` +- `data_sink_id`: `Optional` +- `status`: `Optional` +- `project_id`: `Optional` +- `flow_type`: `Optional` +- `ingestion_mode`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `children`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowResponse + +Defined in `nexla_sdk/models/flows/responses.py:178` + +Flow response model. + +Fields: + +- `flows`: `List` +- `code_containers`: `Optional` +- `data_sources`: `Optional` +- `data_sets`: `Optional` +- `data_sinks`: `Optional` +- `data_credentials`: `Optional` +- `shared_data_sets`: `Optional` +- `orgs`: `Optional` +- `users`: `Optional` +- `projects`: `Optional` +- `metrics`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowTrigger + +Defined in `nexla_sdk/models/flow_triggers/responses.py:10` + +Flow trigger response model. + +Flow triggers define orchestration events that trigger one flow +based on events from another flow. For example, triggering a +data source read when a data sink write completes. + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `status`: `str` +- `triggering_event_type`: `str` +- `triggering_origin_node_id`: `Optional` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggered_event_type`: `str` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `triggered_resource_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowTriggerCreate + +Defined in `nexla_sdk/models/flow_triggers/requests.py:8` + +Request model for creating a flow trigger. + +Flow triggers define when one flow should trigger based on events +from another flow. The triggering and triggered resources must be +specified, along with the event types. + +Event Types: + - DATA_SINK_WRITE_DONE: Triggered when a data sink finishes writing + - DATA_SOURCE_READ_START: Triggered when a data source starts reading + - DATA_SOURCE_READ_DONE: Triggered when a data source finishes reading + +Fields: + +- `triggering_event_type`: `str` +- `triggered_event_type`: `str` +- `triggering_flow_node_id`: `Optional` +- `triggering_resource_id`: `Optional` +- `triggering_resource_type`: `Optional` +- `data_sink_id`: `Optional` +- `triggered_origin_node_id`: `Optional` +- `triggered_resource_id`: `Optional` +- `triggered_resource_type`: `Optional` +- `data_source_id`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### FlowType + +Defined in `nexla_sdk/models/sources/enums.py:108` + +Flow processing types. + +Members: + +- `BATCH` = `batch` +- `STREAMING` = `streaming` +- `REAL_TIME` = `real_time` + +### GenAiConfig + +Defined in `nexla_sdk/models/genai/responses.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `provider`: `Optional` +- `config`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### GenAiConfigCreatePayload + +Defined in `nexla_sdk/models/genai/requests.py:16` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `type`: `str` +- `config`: `Dict` +- `data_credentials_id`: `int` +- `description`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### GenAiConfigPayload + +Defined in `nexla_sdk/models/genai/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `config`: `Optional` +- `type`: `Optional` +- `data_credentials_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### GenAiOrgSetting + +Defined in `nexla_sdk/models/genai/responses.py:16` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `org_id`: `Optional` +- `gen_ai_usage`: `Optional` +- `active_config`: `Optional` +- `configs`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### GenAiOrgSettingPayload + +Defined in `nexla_sdk/models/genai/requests.py:24` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `org_id`: `Optional` +- `gen_ai_config_id`: `int` +- `gen_ai_usage`: `str` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### IngestMethod + +Defined in `nexla_sdk/models/sources/enums.py:98` + +Data ingestion methods. + +Members: + +- `BATCH` = `BATCH` +- `STREAMING` = `STREAMING` +- `REAL_TIME` = `REAL_TIME` +- `SCHEDULED` = `SCHEDULED` +- `POLL` = `POLL` + +### LogEntry + +Defined in `nexla_sdk/models/common.py:49` + +Audit log entry. + +Fields: + +- `id`: `int` +- `item_type`: `str` +- `item_id`: `int` +- `event`: `str` +- `change_summary`: `List` +- `object_changes`: `Dict` +- `request_ip`: `str` +- `request_user_agent`: `str` +- `request_url`: `str` +- `user`: `Dict` +- `org_id`: `int` +- `owner_id`: `int` +- `owner_email`: `str` +- `created_at`: `datetime` +- `association_resource`: `Optional` +- `impersonator_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Lookup + +Defined in `nexla_sdk/models/lookups/responses.py:10` + +Lookup (data map) response model. + +Fields: + +- `id`: `int` +- `name`: `str` +- `description`: `str` +- `map_primary_key`: `str` +- `owner`: `Owner` +- `org`: `Organization` +- `access_roles`: `List` +- `public`: `bool` +- `managed`: `bool` +- `data_type`: `str` +- `emit_data_default`: `bool` +- `use_versioning`: `bool` +- `data_format`: `Optional` +- `data_sink_id`: `Optional` +- `data_defaults`: `Dict` +- `data_set_id`: `Optional` +- `map_entry_count`: `Optional` +- `map_entry_schema`: `Optional` +- `tags`: `List` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### LookupCreate + +Defined in `nexla_sdk/models/lookups/requests.py:8` + +Request model for creating a lookup. + +Fields: + +- `name`: `str` +- `data_type`: `str` +- `map_primary_key`: `str` +- `description`: `Optional` +- `data_defaults`: `Dict` +- `emit_data_default`: `bool` +- `data_map`: `Optional` +- `tags`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### LookupEntriesUpsert + +Defined in `nexla_sdk/models/lookups/requests.py:32` + +Request model for upserting lookup entries. + +Fields: + +- `entries`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### LookupUpdate + +Defined in `nexla_sdk/models/lookups/requests.py:21` + +Request model for updating a lookup. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `map_primary_key`: `Optional` +- `data_defaults`: `Optional` +- `emit_data_default`: `Optional` +- `tags`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### MarketplaceDomain + +Defined in `nexla_sdk/models/marketplace/responses.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `str` +- `slug`: `Optional` +- `description`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### MarketplaceDomainCreate + +Defined in `nexla_sdk/models/marketplace/requests.py:17` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `org_id`: `Optional` +- `owner_id`: `Optional` +- `name`: `str` +- `description`: `Optional` +- `parent_id`: `Optional` +- `custodians`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### MarketplaceDomainsItem -Defined in `nexla_sdk/models/flows/responses.py:25` +Defined in `nexla_sdk/models/marketplace/responses.py:17` -A single flow execution log entry. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `timestamp`: `Optional` -- `level`: `Optional` -- `message`: `Optional` -- `log_type`: `Optional` -- `resource_id`: `Optional` +- `id`: `int` +- `domain_id`: `Optional` - `resource_type`: `Optional` -- `run_id`: `Optional` -- `details`: `Optional` +- `resource_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -1445,21 +3381,122 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowLogsMeta +### MarketplaceDomainsItemCreate -Defined in `nexla_sdk/models/flows/responses.py:53` +Defined in `nexla_sdk/models/marketplace/requests.py:26` -Metadata for flow logs pagination. +Base model class with Pydantic functionality and Nexla API compatibility. -The live API also returns run context fields (org_id, run_id) in logs.meta. +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `current_page`: `Optional` -- `page_count`: `Optional` -- `total_count`: `Optional` +- `name`: `str` +- `description`: `Optional` +- `data_set_id`: `int` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### MetricsByRunResponse + +Defined in `nexla_sdk/models/metrics/responses.py:57` + +Metrics by run response with pagination. + +Fields: + +- `status`: `int` +- `metrics`: `Dict` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### MetricsResponse + +Defined in `nexla_sdk/models/metrics/responses.py:50` + +Generic metrics response. + +Fields: + +- `status`: `int` +- `metrics`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Nexset + +Defined in `nexla_sdk/models/nexsets/responses.py:23` + +Nexset (data set) response model. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `flow_type`: `Optional` +- `data_source_id`: `Optional` +- `data_source`: `Optional` +- `parent_data_sets`: `List` +- `data_sinks`: `List` +- `transform_id`: `Optional` +- `output_schema`: `Optional` +- `copied_from_id`: `Optional` +- `tags`: `List` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### NexsetCopyOptions + +Defined in `nexla_sdk/models/nexsets/requests.py:46` + +Options for copying a nexset. + +Fields: + +- `copy_access_controls`: `bool` +- `owner_id`: `Optional` - `org_id`: `Optional` -- `run_id`: `Optional` Methods: @@ -1470,24 +3507,120 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowLogsResponse - -Defined in `nexla_sdk/models/flows/responses.py:82` +### NexsetCreate + +Defined in `nexla_sdk/models/nexsets/requests.py:10` + +Request model for creating a nexset. + +Fields: + +- `name`: `str` +- `parent_data_set_id`: `int` +- `has_custom_transform`: `bool` +- `transform`: `Optional` +- `transform_id`: `Optional` +- `description`: `Optional` +- `output_schema_annotations`: `Optional` +- `output_schema_validation_enabled`: `bool` +- `output_validation_schema`: `Optional` +- `data_sinks`: `List` +- `custom_config`: `Optional` +- `tags`: `List` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### NexsetSample + +Defined in `nexla_sdk/models/nexsets/responses.py:47` + +Nexset sample record. + +Fields: + +- `raw_message`: `Dict` +- `nexla_metadata`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### NexsetStatus + +Defined in `nexla_sdk/models/nexsets/enums.py:4` + +Nexset status values. + +Members: + +- `ACTIVE` = `ACTIVE` +- `PAUSED` = `PAUSED` +- `DRAFT` = `DRAFT` +- `DELETED` = `DELETED` +- `ERROR` = `ERROR` +- `PROCESSING` = `PROCESSING` + +### NexsetUpdate + +Defined in `nexla_sdk/models/nexsets/requests.py:30` + +Request model for updating a nexset. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `has_custom_transform`: `Optional` +- `transform`: `Optional` +- `transform_id`: `Optional` +- `output_schema_annotations`: `Optional` +- `output_schema_validation_enabled`: `Optional` +- `output_validation_schema`: `Optional` +- `data_sinks`: `Optional` +- `custom_config`: `Optional` +- `tags`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Notification -Response from get_logs() containing flow execution logs. +Defined in `nexla_sdk/models/notifications/responses.py:10` -Attributes: - status: Status code of the response (200 for success). - message: Status message ("Ok" for success). - logs: List of log entries. - meta: Pagination metadata. +Notification response model. Fields: -- `status`: `Optional` -- `message`: `Optional` -- `logs`: `List` -- `meta`: `Optional` +- `id`: `int` +- `owner`: `Owner` +- `org`: `Organization` +- `access_roles`: `List` +- `level`: `str` +- `resource_id`: `Optional` +- `resource_type`: `str` +- `message_id`: `int` +- `message`: `str` +- `read_at`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -1498,19 +3631,33 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowMetricData +### NotificationChannel -Defined in `nexla_sdk/models/flows/responses.py:113` +Defined in `nexla_sdk/models/enums.py:57` -Flow metric data for a resource. +Notification delivery channels. + +Members: + +- `APP` = `APP` +- `EMAIL` = `EMAIL` +- `SMS` = `SMS` +- `SLACK` = `SLACK` +- `WEBHOOKS` = `WEBHOOKS` + +### NotificationChannelSetting + +Defined in `nexla_sdk/models/notifications/responses.py:41` + +Notification channel configuration. Fields: -- `records`: `Optional` -- `size`: `Optional` -- `errors`: `Optional` -- `run_id`: `Optional` -- `reporting_date`: `Optional` +- `id`: `int` +- `owner_id`: `int` +- `org_id`: `int` +- `channel`: `str` +- `config`: `Dict` Methods: @@ -1521,20 +3668,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowMetrics +### NotificationChannelSettingCreate -Defined in `nexla_sdk/models/flows/responses.py:14` +Defined in `nexla_sdk/models/notifications/requests.py:8` -Flow metrics information. +Request model for creating notification channel setting. Fields: -- `origin_node_id`: `int` -- `records`: `int` -- `size`: `int` -- `errors`: `int` -- `reporting_date`: `datetime` -- `run_id`: `int` +- `channel`: `str` +- `config`: `Dict` Methods: @@ -1545,22 +3688,29 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowMetricsApiResponse +### NotificationChannelSettingResource -Defined in `nexla_sdk/models/flows/responses.py:138` +Defined in `nexla_sdk/models/notification_channel_settings/responses.py:7` -Response from get_metrics() containing flow metrics. +Base model class with Pydantic functionality and Nexla API compatibility. -Attributes: - status: Status code of the response (200 for success). - message: Status message ("Ok" for success). - metrics: Metrics data including resource-keyed data and pagination. +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `status`: `Optional` -- `message`: `Optional` -- `metrics`: `Optional` +- `id`: `int` +- `channel`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -1571,16 +3721,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowMetricsData +### NotificationChannelSettingResourceCreate -Defined in `nexla_sdk/models/flows/responses.py:131` +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:6` -Flow metrics data container. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `data`: `Optional` -- `meta`: `Optional` +- `channel`: `str` +- `config`: `Optional` +- `org_id`: `Optional` Methods: @@ -1591,17 +3750,24 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowMetricsMeta +### NotificationChannelSettingResourceUpdate -Defined in `nexla_sdk/models/flows/responses.py:123` +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:12` -Metadata for flow metrics pagination. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `current_page`: `Optional` -- `page_count`: `Optional` -- `total_count`: `Optional` +- `channel`: `Optional` +- `config`: `Optional` Methods: @@ -1612,27 +3778,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowNode +### NotificationChannelSettingUpdate -Defined in `nexla_sdk/models/common.py:66` +Defined in `nexla_sdk/models/notifications/requests.py:15` -Flow node in a data pipeline. +Request model for updating notification channel setting. Fields: -- `id`: `int` -- `origin_node_id`: `int` -- `parent_node_id`: `Optional` -- `data_source_id`: `Optional` -- `data_set_id`: `Optional` -- `data_sink_id`: `Optional` -- `status`: `Optional` -- `project_id`: `Optional` -- `flow_type`: `Optional` -- `ingestion_mode`: `Optional` -- `name`: `Optional` -- `description`: `Optional` -- `children`: `Optional` +- `channel`: `Optional` +- `config`: `Optional` Methods: @@ -1643,25 +3798,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowResponse +### NotificationCount -Defined in `nexla_sdk/models/flows/responses.py:178` +Defined in `nexla_sdk/models/notifications/responses.py:73` -Flow response model. +Notification count response. Fields: -- `flows`: `List` -- `code_containers`: `Optional` -- `data_sources`: `Optional` -- `data_sets`: `Optional` -- `data_sinks`: `Optional` -- `data_credentials`: `Optional` -- `shared_data_sets`: `Optional` -- `orgs`: `Optional` -- `users`: `Optional` -- `projects`: `Optional` -- `metrics`: `Optional` +- `count`: `int` Methods: @@ -1672,40 +3817,45 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### FlowType +### NotificationLevel -Defined in `nexla_sdk/models/sources/enums.py:72` +Defined in `nexla_sdk/models/enums.py:46` -Flow processing types. +Notification levels. Members: -- `BATCH` = `batch` -- `STREAMING` = `streaming` -- `REAL_TIME` = `real_time` - -### GenAiConfig +- `DEBUG` = `DEBUG` +- `INFO` = `INFO` +- `WARN` = `WARN` +- `ERROR` = `ERROR` +- `RECOVERED` = `RECOVERED` +- `RESOLVED` = `RESOLVED` -Defined in `nexla_sdk/models/genai/responses.py:7` +### NotificationSetting -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/notifications/responses.py:51` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Notification setting configuration. Fields: - `id`: `int` -- `name`: `Optional` -- `provider`: `Optional` -- `config`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `org_id`: `int` +- `owner_id`: `int` +- `channel`: `str` +- `notification_resource_type`: `str` +- `resource_id`: `Optional` +- `status`: `str` +- `notification_type_id`: `int` +- `name`: `str` +- `description`: `str` +- `code`: `int` +- `category`: `str` +- `event_type`: `str` +- `resource_type`: `str` +- `config`: `Dict` +- `priority`: `Optional` Methods: @@ -1716,27 +3866,46 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### GenAiConfigCreatePayload +### NotificationSettingBrief -Defined in `nexla_sdk/models/genai/requests.py:16` +Defined in `nexla_sdk/models/notifications/responses.py:79` -Base model class with Pydantic functionality and Nexla API compatibility. +Brief Notification Setting response model for list views. -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `resource_type`: `Optional` +- `resource_id`: `Optional` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### NotificationSettingCreate + +Defined in `nexla_sdk/models/notifications/requests.py:22` + +Request model for creating notification setting. Fields: -- `name`: `str` -- `type`: `str` +- `channel`: `str` +- `notification_type_id`: `int` +- `status`: `Optional` - `config`: `Dict` -- `data_credentials_id`: `int` -- `description`: `Optional` +- `notification_resource_type`: `Optional` +- `resource_id`: `Optional` +- `notification_channel_setting_id`: `Optional` Methods: @@ -1747,28 +3916,22 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### GenAiConfigPayload - -Defined in `nexla_sdk/models/genai/requests.py:6` +### NotificationSettingUpdate -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/notifications/requests.py:34` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Request model for updating notification setting. Fields: -- `name`: `Optional` -- `description`: `Optional` +- `channel`: `Optional` - `status`: `Optional` - `config`: `Optional` -- `type`: `Optional` -- `data_credentials_id`: `Optional` +- `notification_resource_type`: `Optional` +- `resource_id`: `Optional` +- `checked`: `Optional` +- `notification_channel_setting_id`: `Optional` +- `notification_type_id`: `Optional` Methods: @@ -1779,29 +3942,22 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### GenAiOrgSetting - -Defined in `nexla_sdk/models/genai/responses.py:16` +### NotificationType -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/notifications/responses.py:28` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Notification type information. Fields: - `id`: `int` -- `org_id`: `Optional` -- `gen_ai_usage`: `Optional` -- `active_config`: `Optional` -- `configs`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `name`: `str` +- `description`: `str` +- `category`: `str` +- `default`: `bool` +- `status`: `bool` +- `event_type`: `str` +- `resource_type`: `str` Methods: @@ -1812,9 +3968,9 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### GenAiOrgSettingPayload +### NotificationTypeResource -Defined in `nexla_sdk/models/genai/requests.py:24` +Defined in `nexla_sdk/models/notification_types/responses.py:6` Base model class with Pydantic functionality and Nexla API compatibility. @@ -1828,9 +3984,14 @@ Features: Fields: -- `org_id`: `Optional` -- `gen_ai_config_id`: `int` -- `gen_ai_usage`: `str` +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `category`: `Optional` +- `default`: `Optional` +- `status`: `Optional` +- `event_type`: `Optional` +- `resource_type`: `Optional` Methods: @@ -1841,44 +4002,19 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### IngestMethod - -Defined in `nexla_sdk/models/sources/enums.py:62` - -Data ingestion methods. - -Members: - -- `BATCH` = `BATCH` -- `STREAMING` = `STREAMING` -- `REAL_TIME` = `REAL_TIME` -- `SCHEDULED` = `SCHEDULED` -- `POLL` = `POLL` - -### LogEntry +### OrgAccessorRequest -Defined in `nexla_sdk/models/common.py:45` +Defined in `nexla_sdk/models/access/requests.py:31` -Audit log entry. +Request model for ORG type accessor. Fields: -- `id`: `int` -- `item_type`: `str` -- `item_id`: `int` -- `event`: `str` -- `change_summary`: `List` -- `object_changes`: `Dict` -- `request_ip`: `str` -- `request_user_agent`: `str` -- `request_url`: `str` -- `user`: `Dict` -- `org_id`: `int` -- `owner_id`: `int` -- `owner_email`: `str` -- `created_at`: `datetime` -- `association_resource`: `Optional` -- `impersonator_id`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the organization +- `client_identifier`: `Optional` — Client identifier for the organization +- `email_domain`: `Optional` — Email domain for the organization +- `access_roles`: `List` — List of access roles Methods: @@ -1889,35 +4025,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Lookup +### OrgAccessorResponse -Defined in `nexla_sdk/models/lookups/responses.py:10` +Defined in `nexla_sdk/models/access/responses.py:36` -Lookup (data map) response model. +Response model for ORG type accessor. Fields: -- `id`: `int` -- `name`: `str` -- `description`: `str` -- `map_primary_key`: `str` -- `owner`: `Owner` -- `org`: `Organization` -- `access_roles`: `List` -- `public`: `bool` -- `managed`: `bool` -- `data_type`: `str` -- `emit_data_default`: `bool` -- `use_versioning`: `bool` -- `data_format`: `Optional` -- `data_sink_id`: `Optional` -- `data_defaults`: `Dict` -- `data_set_id`: `Optional` -- `map_entry_count`: `Optional` -- `map_entry_schema`: `Optional` -- `tags`: `List` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the organization +- `client_identifier`: `Optional` — Client identifier for the organization +- `email_domain`: `Optional` — Email domain for the organization +- `access_roles`: `List` — List of access roles +- `created_at`: `Optional` — Creation timestamp +- `updated_at`: `Optional` — Last update timestamp Methods: @@ -1928,22 +4050,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### LookupCreate +### OrgCustodianRef -Defined in `nexla_sdk/models/lookups/requests.py:8` +Defined in `nexla_sdk/models/organizations/custodians.py:6` -Request model for creating a lookup. +Reference to a user for organization custodians (by id or email). Fields: -- `name`: `str` -- `data_type`: `str` -- `map_primary_key`: `str` -- `description`: `Optional` -- `data_defaults`: `Dict` -- `emit_data_default`: `bool` -- `data_map`: `Optional` -- `tags`: `List` +- `id`: `Optional` +- `email`: `Optional` Methods: @@ -1954,15 +4070,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### LookupEntriesUpsert +### OrgCustodiansPayload -Defined in `nexla_sdk/models/lookups/requests.py:32` +Defined in `nexla_sdk/models/organizations/custodians.py:13` -Request model for upserting lookup entries. +Payload for organization custodians endpoints. Fields: -- `entries`: `List` +- `custodians`: `List` Methods: @@ -1973,20 +4089,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### LookupUpdate +### OrgMember -Defined in `nexla_sdk/models/lookups/requests.py:21` +Defined in `nexla_sdk/models/organizations/responses.py:53` -Request model for updating a lookup. +Organization member information. Fields: -- `name`: `Optional` -- `description`: `Optional` -- `map_primary_key`: `Optional` -- `data_defaults`: `Optional` -- `emit_data_default`: `Optional` -- `tags`: `Optional` +- `id`: `int` +- `full_name`: `str` +- `email`: `str` +- `is_admin`: `bool` +- `access_role`: `Optional` +- `org_membership_status`: `str` +- `user_status`: `str` Methods: @@ -1997,29 +4114,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MarketplaceDomain - -Defined in `nexla_sdk/models/marketplace/responses.py:7` +### OrgMemberDelete -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/organizations/requests.py:73` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Request model for deleting org members. Fields: -- `id`: `int` -- `name`: `str` -- `slug`: `Optional` -- `description`: `Optional` -- `org_id`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `members`: `List` Methods: @@ -2030,28 +4133,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MarketplaceDomainCreate - -Defined in `nexla_sdk/models/marketplace/requests.py:17` +### OrgMemberList -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/organizations/requests.py:59` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Request model for updating org members. Fields: -- `org_id`: `Optional` -- `owner_id`: `Optional` -- `name`: `str` -- `description`: `Optional` -- `parent_id`: `Optional` -- `custodians`: `Optional` +- `members`: `List` Methods: @@ -2062,28 +4152,19 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MarketplaceDomainsItem - -Defined in `nexla_sdk/models/marketplace/responses.py:17` - -Base model class with Pydantic functionality and Nexla API compatibility. - -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +### OrgMemberUpdate -Fields: +Defined in `nexla_sdk/models/organizations/requests.py:49` -- `id`: `int` -- `domain_id`: `Optional` -- `resource_type`: `Optional` -- `resource_id`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +Request model for updating org member. + +Fields: + +- `id`: `Optional` +- `email`: `Optional` +- `full_name`: `Optional` +- `admin`: `Optional` +- `access_role`: `Optional` Methods: @@ -2094,25 +4175,19 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MarketplaceDomainsItemCreate - -Defined in `nexla_sdk/models/marketplace/requests.py:26` +### OrgMembership -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/users/responses.py:16` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Organization membership details. Fields: +- `id`: `int` - `name`: `str` -- `description`: `Optional` -- `data_set_id`: `int` +- `is_admin`: `Optional` +- `org_membership_status`: `str` +- `api_key`: `Optional` Methods: @@ -2123,16 +4198,32 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MetricsByRunResponse +### OrgMembershipStatus -Defined in `nexla_sdk/models/metrics/responses.py:57` +Defined in `nexla_sdk/models/enums.py:86` -Metrics by run response with pagination. +Organization membership status. + +Members: + +- `ACTIVE` = `ACTIVE` +- `DEACTIVATED` = `DEACTIVATED` + +### OrgTier + +Defined in `nexla_sdk/models/organizations/responses.py:10` + +Organization tier information. Fields: -- `status`: `int` -- `metrics`: `Dict` +- `id`: `int` +- `name`: `str` +- `display_name`: `str` +- `record_count_limit`: `int` +- `record_count_limit_time`: `str` +- `data_source_count_limit`: `int` +- `trial_period_days`: `Optional` Methods: @@ -2143,16 +4234,29 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### MetricsResponse +### OrgTierInfo -Defined in `nexla_sdk/models/metrics/responses.py:50` +Defined in `nexla_sdk/models/org_tiers/responses.py:6` -Generic metrics response. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `status`: `int` -- `metrics`: `List` +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` Methods: @@ -2163,32 +4267,27 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Nexset +### Organization -Defined in `nexla_sdk/models/nexsets/responses.py:23` +Defined in `nexla_sdk/models/common.py:20` -Nexset (data set) response model. +Organization details. Fields: - `id`: `int` -- `name`: `Optional` -- `description`: `Optional` +- `name`: `str` +- `email_domain`: `Optional` +- `email`: `Optional` +- `client_identifier`: `Optional` +- `org_webhook_host`: `Optional` +- `cluster_id`: `Optional` +- `new_cluster_id`: `Optional` +- `cluster_status`: `Optional` - `status`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `flow_type`: `Optional` -- `data_source_id`: `Optional` -- `data_source`: `Optional` -- `parent_data_sets`: `List` -- `data_sinks`: `List` -- `transform_id`: `Optional` -- `output_schema`: `Optional` -- `copied_from_id`: `Optional` -- `tags`: `List` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `self_signup`: `Optional` +- `features_enabled`: `Optional` +- `org_tier`: `Optional` Methods: @@ -2199,17 +4298,22 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NexsetCopyOptions +### OrganizationUpdate -Defined in `nexla_sdk/models/nexsets/requests.py:46` +Defined in `nexla_sdk/models/organizations/requests.py:36` -Options for copying a nexset. +Request model for updating an organization. Fields: -- `copy_access_controls`: `bool` +- `name`: `Optional` +- `description`: `Optional` +- `owner`: `Optional` - `owner_id`: `Optional` -- `org_id`: `Optional` +- `billing_owner`: `Optional` +- `billing_owner_id`: `Optional` +- `email`: `Optional` +- `members`: `Optional` Methods: @@ -2220,26 +4324,30 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NexsetCreate +### OutputType -Defined in `nexla_sdk/models/nexsets/requests.py:10` +Defined in `nexla_sdk/models/nexsets/enums.py:25` -Request model for creating a nexset. +Transform output types. + +Members: + +- `RECORD` = `record` +- `ATTRIBUTE` = `attribute` +- `CUSTOM` = `custom` + +### Owner + +Defined in `nexla_sdk/models/common.py:11` + +User who owns a resource. Fields: -- `name`: `str` -- `parent_data_set_id`: `int` -- `has_custom_transform`: `bool` -- `transform`: `Optional` -- `transform_id`: `Optional` -- `description`: `Optional` -- `output_schema_annotations`: `Optional` -- `output_schema_validation_enabled`: `bool` -- `output_validation_schema`: `Optional` -- `data_sinks`: `List` -- `custom_config`: `Optional` -- `tags`: `List` +- `id`: `int` +- `full_name`: `str` +- `email`: `str` +- `email_verified_at`: `Optional` Methods: @@ -2250,16 +4358,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NexsetSample +### ProbeSampleRequest -Defined in `nexla_sdk/models/nexsets/responses.py:47` +Defined in `nexla_sdk/models/credentials/requests.py:39` -Nexset sample record. +Request for previewing connector content. Fields: -- `raw_message`: `Dict` -- `nexla_metadata`: `Optional` +- `path`: `Optional` Methods: @@ -2270,40 +4377,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NexsetStatus - -Defined in `nexla_sdk/models/nexsets/enums.py:4` - -Nexset status values. - -Members: - -- `ACTIVE` = `ACTIVE` -- `PAUSED` = `PAUSED` -- `DRAFT` = `DRAFT` -- `DELETED` = `DELETED` -- `ERROR` = `ERROR` -- `PROCESSING` = `PROCESSING` - -### NexsetUpdate +### ProbeSampleResponse -Defined in `nexla_sdk/models/nexsets/requests.py:30` +Defined in `nexla_sdk/models/credentials/responses.py:66` -Request model for updating a nexset. +Response from credential probe sample operation. Fields: -- `name`: `Optional` -- `description`: `Optional` -- `has_custom_transform`: `Optional` -- `transform`: `Optional` -- `transform_id`: `Optional` -- `output_schema_annotations`: `Optional` -- `output_schema_validation_enabled`: `Optional` -- `output_validation_schema`: `Optional` -- `data_sinks`: `Optional` -- `custom_config`: `Optional` -- `tags`: `Optional` +- `status`: `str` +- `message`: `str` +- `connection_type`: `str` +- `output`: `Dict` Methods: @@ -2314,26 +4399,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Notification +### ProbeTreeRequest -Defined in `nexla_sdk/models/notifications/responses.py:10` +Defined in `nexla_sdk/models/credentials/requests.py:30` -Notification response model. +Request for probing storage structure. Fields: -- `id`: `int` -- `owner`: `Owner` -- `org`: `Organization` -- `access_roles`: `List` -- `level`: `str` -- `resource_id`: `Optional` -- `resource_type`: `str` -- `message_id`: `int` -- `message`: `str` -- `read_at`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `depth`: `int` +- `path`: `Optional` +- `database`: `Optional` +- `table`: `Optional` Methods: @@ -2344,33 +4421,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationChannel - -Defined in `nexla_sdk/models/enums.py:57` - -Notification delivery channels. - -Members: - -- `APP` = `APP` -- `EMAIL` = `EMAIL` -- `SMS` = `SMS` -- `SLACK` = `SLACK` -- `WEBHOOKS` = `WEBHOOKS` - -### NotificationChannelSetting +### ProbeTreeResponse -Defined in `nexla_sdk/models/notifications/responses.py:41` +Defined in `nexla_sdk/models/credentials/responses.py:57` -Notification channel configuration. +Response from credential probe tree operation. Fields: -- `id`: `int` -- `owner_id`: `int` -- `org_id`: `int` -- `channel`: `str` -- `config`: `Dict` +- `status`: `str` +- `message`: `str` +- `connection_type`: `str` +- `object`: `Dict` Methods: @@ -2381,16 +4443,29 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationChannelSettingCreate +### Project -Defined in `nexla_sdk/models/notifications/requests.py:8` +Defined in `nexla_sdk/models/projects/responses.py:24` -Request model for creating notification channel setting. +Project response model. Fields: -- `channel`: `str` -- `config`: `Dict` +- `id`: `int` +- `owner`: `Owner` +- `org`: `Organization` +- `name`: `str` +- `description`: `str` +- `access_roles`: `List` +- `data_flows`: `List` +- `flows`: `List` +- `client_identifier`: `Optional` +- `client_url`: `Optional` +- `flows_count`: `Optional` +- `tags`: `List` +- `copied_from_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -2401,16 +4476,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationChannelSettingUpdate +### ProjectCreate -Defined in `nexla_sdk/models/notifications/requests.py:15` +Defined in `nexla_sdk/models/projects/requests.py:15` -Request model for updating notification channel setting. +Request model for creating a project. Fields: -- `channel`: `Optional` -- `config`: `Optional` +- `name`: `str` +- `description`: `Optional` +- `data_flows`: `List` Methods: @@ -2421,15 +4497,23 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationCount +### ProjectDataFlow -Defined in `nexla_sdk/models/notifications/responses.py:73` +Defined in `nexla_sdk/models/projects/responses.py:10` -Notification count response. +Project data flow information. Fields: -- `count`: `int` +- `id`: `int` +- `project_id`: `int` +- `data_source_id`: `Optional` +- `data_set_id`: `Optional` +- `data_sink_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -2440,45 +4524,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationLevel - -Defined in `nexla_sdk/models/enums.py:46` - -Notification levels. - -Members: - -- `DEBUG` = `DEBUG` -- `INFO` = `INFO` -- `WARN` = `WARN` -- `ERROR` = `ERROR` -- `RECOVERED` = `RECOVERED` -- `RESOLVED` = `RESOLVED` - -### NotificationSetting +### ProjectFlowIdentifier -Defined in `nexla_sdk/models/notifications/responses.py:51` +Defined in `nexla_sdk/models/projects/requests.py:8` -Notification setting configuration. +Flow identifier for project. Fields: -- `id`: `int` -- `org_id`: `int` -- `owner_id`: `int` -- `channel`: `str` -- `notification_resource_type`: `str` -- `resource_id`: `Optional` -- `status`: `str` -- `notification_type_id`: `int` -- `name`: `str` -- `description`: `str` -- `code`: `int` -- `category`: `str` -- `event_type`: `str` -- `resource_type`: `str` -- `config`: `Dict` -- `priority`: `Optional` +- `data_source_id`: `Optional` +- `data_set_id`: `Optional` Methods: @@ -2489,21 +4544,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationSettingCreate +### ProjectFlowList -Defined in `nexla_sdk/models/notifications/requests.py:22` +Defined in `nexla_sdk/models/projects/requests.py:31` -Request model for creating notification setting. +Request model for managing project flows. Fields: -- `channel`: `str` -- `notification_type_id`: `int` -- `status`: `Optional` -- `config`: `Dict` -- `notification_resource_type`: `Optional` -- `resource_id`: `Optional` -- `notification_channel_setting_id`: `Optional` +- `data_flows`: `Optional` +- `flows`: `Optional` Methods: @@ -2514,22 +4564,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationSettingUpdate +### ProjectUpdate -Defined in `nexla_sdk/models/notifications/requests.py:34` +Defined in `nexla_sdk/models/projects/requests.py:23` -Request model for updating notification setting. +Request model for updating a project. Fields: -- `channel`: `Optional` -- `status`: `Optional` -- `config`: `Optional` -- `notification_resource_type`: `Optional` -- `resource_id`: `Optional` -- `checked`: `Optional` -- `notification_channel_setting_id`: `Optional` -- `notification_type_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `data_flows`: `Optional` Methods: @@ -2540,22 +4585,33 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### NotificationType +### QuarantineSetting -Defined in `nexla_sdk/models/notifications/responses.py:28` +Defined in `nexla_sdk/models/quarantine_settings/responses.py:9` -Notification type information. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: - `id`: `int` -- `name`: `str` -- `description`: `str` -- `category`: `str` -- `default`: `bool` -- `status`: `bool` -- `event_type`: `str` -- `resource_type`: `str` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `config`: `Optional` +- `data_credentials_id`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -2566,19 +4622,26 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgAccessorRequest +### QuarantineSettingCreate -Defined in `nexla_sdk/models/access/requests.py:31` +Defined in `nexla_sdk/models/quarantine_settings/requests.py:6` -Request model for ORG type accessor. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the organization -- `client_identifier`: `Optional` — Client identifier for the organization -- `email_domain`: `Optional` — Email domain for the organization -- `access_roles`: `List` — List of access roles +- `data_credentials_id`: `int` +- `config`: `Dict` +- `owner_id`: `Optional` +- `org_id`: `Optional` Methods: @@ -2589,21 +4652,26 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgAccessorResponse +### QuarantineSettingUpdate -Defined in `nexla_sdk/models/access/responses.py:36` +Defined in `nexla_sdk/models/quarantine_settings/requests.py:13` -Response model for ORG type accessor. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the organization -- `client_identifier`: `Optional` — Client identifier for the organization -- `email_domain`: `Optional` — Email domain for the organization -- `access_roles`: `List` — List of access roles -- `created_at`: `Optional` — Creation timestamp -- `updated_at`: `Optional` — Last update timestamp +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` Methods: @@ -2614,16 +4682,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgCustodianRef +### ResourceFlowLogsResponse -Defined in `nexla_sdk/models/organizations/custodians.py:6` +Defined in `nexla_sdk/models/metrics/responses.py:68` -Reference to a user for organization custodians (by id or email). +Flow logs response returned by MetricsResource.get_flow_logs(). Fields: -- `id`: `Optional` -- `email`: `Optional` +- `status`: `Optional` +- `message`: `Optional` +- `logs`: `List` +- `meta`: `Optional` Methods: @@ -2634,15 +4704,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgCustodiansPayload +### ResourceFlowMetricsResponse -Defined in `nexla_sdk/models/organizations/custodians.py:13` +Defined in `nexla_sdk/models/metrics/responses.py:64` -Payload for organization custodians endpoints. +Flow metrics response returned by MetricsResource.get_flow_metrics(). Fields: -- `custodians`: `List` +- `status`: `Optional` +- `message`: `Optional` +- `metrics`: `Optional` Methods: @@ -2653,21 +4725,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMember +### ResourceMetricDaily -Defined in `nexla_sdk/models/organizations/responses.py:53` +Defined in `nexla_sdk/models/metrics/responses.py:30` -Organization member information. +Daily resource metrics. Fields: -- `id`: `int` -- `full_name`: `str` -- `email`: `str` -- `is_admin`: `bool` -- `access_role`: `Optional` -- `org_membership_status`: `str` -- `user_status`: `str` +- `time`: `str` +- `records`: `int` +- `size`: `int` +- `errors`: `int` Methods: @@ -2678,15 +4747,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMemberDelete +### ResourceMetricsByRun -Defined in `nexla_sdk/models/organizations/requests.py:73` +Defined in `nexla_sdk/models/metrics/responses.py:39` -Request model for deleting org members. +Resource metrics grouped by run. Fields: -- `members`: `List` +- `runId`: `Optional` +- `lastWritten`: `Optional` +- `dataSetId`: `int` +- `records`: `int` +- `size`: `int` +- `errors`: `int` Methods: @@ -2697,15 +4771,35 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMemberList +### ResourceParameter -Defined in `nexla_sdk/models/organizations/requests.py:59` +Defined in `nexla_sdk/models/resource_parameters/responses.py:10` -Request model for updating org members. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `members`: `List` +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint`: `Optional` +- `allowed_values`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` Methods: @@ -2716,19 +4810,32 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMemberUpdate +### ResourceParameterCreate -Defined in `nexla_sdk/models/organizations/requests.py:49` +Defined in `nexla_sdk/models/resource_parameters/requests.py:6` -Request model for updating org member. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `id`: `Optional` -- `email`: `Optional` -- `full_name`: `Optional` -- `admin`: `Optional` -- `access_role`: `Optional` +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` Methods: @@ -2739,19 +4846,32 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMembership +### ResourceParameterUpdate -Defined in `nexla_sdk/models/users/responses.py:16` +Defined in `nexla_sdk/models/resource_parameters/requests.py:19` -Organization membership details. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `id`: `int` -- `name`: `str` -- `is_admin`: `Optional` -- `org_membership_status`: `str` -- `api_key`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` Methods: @@ -2762,32 +4882,57 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrgMembershipStatus +### ResourceStatus -Defined in `nexla_sdk/models/enums.py:86` +Defined in `nexla_sdk/models/enums.py:13` -Organization membership status. +Common resource status values. Members: - `ACTIVE` = `ACTIVE` -- `DEACTIVATED` = `DEACTIVATED` +- `PAUSED` = `PAUSED` +- `DRAFT` = `DRAFT` +- `DELETED` = `DELETED` +- `ERROR` = `ERROR` +- `INIT` = `INIT` +- `PROCESSING` = `PROCESSING` -### OrgTier +### ResourceType -Defined in `nexla_sdk/models/organizations/responses.py:10` +Defined in `nexla_sdk/models/enums.py:25` -Organization tier information. +Resource types in Nexla. + +Members: + +- `ORG` = `ORG` +- `USER` = `USER` +- `TEAM` = `TEAM` +- `DATA_FLOW` = `DATA_FLOW` +- `CUSTOM_DATA_FLOW` = `CUSTOM_DATA_FLOW` +- `SOURCE` = `SOURCE` +- `DATASET` = `DATASET` +- `SINK` = `SINK` +- `DATA_MAP` = `DATA_MAP` +- `DATA_SCHEMA` = `DATA_SCHEMA` +- `DATA_CREDENTIAL` = `DATA_CREDENTIAL` +- `PROJECT` = `PROJECT` +- `CODE_CONTAINER` = `CODE_CONTAINER` +- `TRANSFORM` = `TRANSFORM` +- `FLOW` = `FLOW` +- `PIPELINE` = `PIPELINE` + +### RunInfo + +Defined in `nexla_sdk/models/sources/responses.py:25` + +Run information. Fields: - `id`: `int` -- `name`: `str` -- `display_name`: `str` -- `record_count_limit`: `int` -- `record_count_limit_time`: `str` -- `data_source_count_limit`: `int` -- `trial_period_days`: `Optional` +- `created_at`: `datetime` Methods: @@ -2798,27 +4943,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Organization +### Runtime -Defined in `nexla_sdk/models/common.py:16` +Defined in `nexla_sdk/models/runtimes/responses.py:7` -Organization details. +Response model for Custom Runtime aligned with OpenAPI Runtime schema. Fields: - `id`: `int` - `name`: `str` -- `email_domain`: `Optional` -- `email`: `Optional` -- `client_identifier`: `Optional` -- `org_webhook_host`: `Optional` -- `cluster_id`: `Optional` -- `new_cluster_id`: `Optional` -- `cluster_status`: `Optional` -- `status`: `Optional` -- `self_signup`: `Optional` -- `features_enabled`: `Optional` -- `org_tier`: `Optional` +- `description`: `Optional` +- `active`: `Optional` +- `dockerpath`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -2829,22 +4972,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OrganizationUpdate +### RuntimeCreate -Defined in `nexla_sdk/models/organizations/requests.py:36` +Defined in `nexla_sdk/models/runtimes/requests.py:6` -Request model for updating an organization. +Create payload for Custom Runtime matching OpenAPI RuntimePayload. Fields: -- `name`: `Optional` +- `name`: `str` - `description`: `Optional` -- `owner`: `Optional` -- `owner_id`: `Optional` -- `billing_owner`: `Optional` -- `billing_owner_id`: `Optional` -- `email`: `Optional` -- `members`: `Optional` +- `active`: `Optional` +- `dockerpath`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` Methods: @@ -2855,30 +4996,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### OutputType - -Defined in `nexla_sdk/models/nexsets/enums.py:25` - -Transform output types. - -Members: - -- `RECORD` = `record` -- `ATTRIBUTE` = `attribute` -- `CUSTOM` = `custom` - -### Owner +### RuntimeUpdate -Defined in `nexla_sdk/models/common.py:7` +Defined in `nexla_sdk/models/runtimes/requests.py:17` -User who owns a resource. +Update payload for Custom Runtime matching OpenAPI RuntimePayload. Fields: -- `id`: `int` -- `full_name`: `str` -- `email`: `str` -- `email_verified_at`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `active`: `Optional` +- `dockerpath`: `Optional` +- `managed`: `Optional` +- `config`: `Optional` Methods: @@ -2889,15 +5020,29 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProbeSampleRequest +### SelfSignupRequest -Defined in `nexla_sdk/models/credentials/requests.py:39` +Defined in `nexla_sdk/models/self_signup/responses.py:7` -Request for previewing connector content. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `path`: `Optional` +- `id`: `int` +- `status`: `Optional` +- `email`: `Optional` +- `full_name`: `Optional` +- `invite_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -2908,18 +5053,31 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProbeSampleResponse +### ServiceKey -Defined in `nexla_sdk/models/credentials/responses.py:65` +Defined in `nexla_sdk/models/service_keys/responses.py:9` -Response from credential probe sample operation. +Service key response model. + +Service keys are long-lived credentials used for programmatic API access. +They can be rotated and have lifecycle management (activate/pause). Fields: +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` - `status`: `str` -- `message`: `str` -- `connection_type`: `str` -- `output`: `Dict` +- `api_key`: `str` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `data_source_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` Methods: @@ -2930,18 +5088,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProbeTreeRequest +### ServiceKeyCreate -Defined in `nexla_sdk/models/credentials/requests.py:30` +Defined in `nexla_sdk/models/service_keys/requests.py:8` -Request for probing storage structure. +Request model for creating a service key. Fields: -- `depth`: `int` -- `path`: `Optional` -- `database`: `Optional` -- `table`: `Optional` +- `name`: `str` +- `description`: `str` +- `data_source_id`: `Optional` Methods: @@ -2952,18 +5109,16 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProbeTreeResponse +### ServiceKeyUpdate -Defined in `nexla_sdk/models/credentials/responses.py:56` +Defined in `nexla_sdk/models/service_keys/requests.py:16` -Response from credential probe tree operation. +Request model for updating a service key. Fields: -- `status`: `str` -- `message`: `str` -- `connection_type`: `str` -- `object`: `Dict` +- `name`: `Optional` +- `description`: `Optional` Methods: @@ -2974,27 +5129,42 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Project +### Source -Defined in `nexla_sdk/models/projects/responses.py:24` +Defined in `nexla_sdk/models/sources/responses.py:32` -Project response model. +Data source response model. Fields: - `id`: `int` -- `owner`: `Owner` -- `org`: `Organization` - `name`: `str` -- `description`: `str` -- `access_roles`: `List` -- `data_flows`: `List` -- `flows`: `List` -- `client_identifier`: `Optional` -- `client_url`: `Optional` -- `flows_count`: `Optional` +- `status`: `str` +- `source_type`: `Union` +- `connector_type`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `managed`: `Optional` +- `auto_generated`: `Optional` +- `connector`: `Optional` +- `description`: `Optional` +- `ingest_method`: `Optional` +- `source_format`: `Optional` +- `source_config`: `Optional` +- `poll_schedule`: `Optional` +- `code_container_id`: `Optional` +- `data_credentials_id`: `Optional` +- `data_credentials`: `Optional` +- `data_sets`: `List` +- `api_keys`: `List` +- `run_ids`: `List` +- `copied_from_id`: `Optional` +- `flow_type`: `Optional` +- `has_template`: `Optional` +- `vendor_endpoint`: `Optional` +- `vendor`: `Optional` - `tags`: `List` -- `copied_from_id`: `Optional` - `created_at`: `Optional` - `updated_at`: `Optional` @@ -3007,17 +5177,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProjectCreate +### SourceCopyOptions -Defined in `nexla_sdk/models/projects/requests.py:15` +Defined in `nexla_sdk/models/sources/requests.py:34` -Request model for creating a project. +Options for copying a source. Fields: -- `name`: `str` -- `description`: `Optional` -- `data_flows`: `List` +- `reuse_data_credentials`: `bool` +- `copy_access_controls`: `bool` +- `owner_id`: `Optional` +- `org_id`: `Optional` Methods: @@ -3028,23 +5199,22 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProjectDataFlow +### SourceCreate -Defined in `nexla_sdk/models/projects/responses.py:10` +Defined in `nexla_sdk/models/sources/requests.py:8` -Project data flow information. +Request model for creating a source. Fields: -- `id`: `int` -- `project_id`: `int` -- `data_source_id`: `Optional` -- `data_set_id`: `Optional` -- `data_sink_id`: `Optional` -- `name`: `Optional` +- `name`: `str` +- `source_type`: `str` +- `data_credentials_id`: `Optional` - `description`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `source_config`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `ingest_method`: `Optional` +- `template_config`: `Optional` Methods: @@ -3055,16 +5225,97 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProjectFlowIdentifier +### SourceStatus -Defined in `nexla_sdk/models/projects/requests.py:8` +Defined in `nexla_sdk/models/sources/enums.py:6` -Flow identifier for project. +Source status values. + +Members: + +- `ACTIVE` = `ACTIVE` +- `PAUSED` = `PAUSED` +- `DRAFT` = `DRAFT` +- `DELETED` = `DELETED` +- `ERROR` = `ERROR` + +### SourceType + +Defined in `nexla_sdk/models/sources/enums.py:16` + +Supported source types. + +Members: + +- `S3` = `s3` +- `GCS` = `gcs` +- `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` +- `FTP` = `ftp` +- `DROPBOX` = `dropbox` +- `BOX` = `box` +- `GDRIVE` = `gdrive` +- `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` +- `MYSQL` = `mysql` +- `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` +- `SQLSERVER` = `sqlserver` +- `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `AS400` = `as400` +- `DB2` = `db2` +- `SYBASE` = `sybase` +- `HANA_JDBC` = `hana_jdbc` +- `NETSUITE_JDBC` = `netsuite_jdbc` +- `REDSHIFT` = `redshift` +- `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` +- `BIGQUERY` = `bigquery` +- `DATABRICKS` = `databricks` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `FIREBOLT` = `firebolt` +- `TERADATA` = `teradata` +- `HIVE` = `hive` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` +- `MONGO` = `mongo` +- `DYNAMODB` = `dynamodb` +- `FIREBASE` = `firebase` +- `KAFKA` = `kafka` +- `CONFLUENT_KAFKA` = `confluent_kafka` +- `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` +- `REST` = `rest` +- `SOAP` = `soap` +- `NEXLA_REST` = `nexla_rest` +- `FILE_UPLOAD` = `file_upload` +- `EMAIL` = `email` +- `NEXLA_MONITOR` = `nexla_monitor` +- `PINECONE` = `pinecone` + +### SourceUpdate + +Defined in `nexla_sdk/models/sources/requests.py:25` + +Request model for updating a source. Fields: -- `data_source_id`: `Optional` -- `data_set_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `source_config`: `Optional` +- `data_credentials_id`: `Optional` Methods: @@ -3075,16 +5326,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProjectFlowList +### Team -Defined in `nexla_sdk/models/projects/requests.py:31` +Defined in `nexla_sdk/models/teams/responses.py:18` -Request model for managing project flows. +Team response model. Fields: -- `data_flows`: `Optional` -- `flows`: `Optional` +- `id`: `int` +- `name`: `str` +- `description`: `str` +- `owner`: `Owner` +- `org`: `Organization` +- `member`: `bool` +- `members`: `List` +- `access_roles`: `List` +- `tags`: `List` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -3095,17 +5355,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ProjectUpdate +### TeamAccessorRequest -Defined in `nexla_sdk/models/projects/requests.py:23` +Defined in `nexla_sdk/models/access/requests.py:22` -Request model for updating a project. +Request model for TEAM type accessor. Fields: -- `name`: `Optional` -- `description`: `Optional` -- `data_flows`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the team +- `name`: `Optional` — Name of the team +- `access_roles`: `List` — List of access roles Methods: @@ -3116,18 +5377,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ResourceFlowLogsResponse +### TeamAccessorResponse -Defined in `nexla_sdk/models/metrics/responses.py:68` +Defined in `nexla_sdk/models/access/responses.py:25` -Flow logs response returned by MetricsResource.get_flow_logs(). +Response model for TEAM type accessor. Fields: -- `status`: `Optional` -- `message`: `Optional` -- `logs`: `List` -- `meta`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the team +- `name`: `Optional` — Name of the team +- `access_roles`: `List` — List of access roles +- `created_at`: `Optional` — Creation timestamp +- `updated_at`: `Optional` — Last update timestamp Methods: @@ -3138,17 +5401,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ResourceFlowMetricsResponse +### TeamCreate -Defined in `nexla_sdk/models/metrics/responses.py:64` +Defined in `nexla_sdk/models/teams/requests.py:17` -Flow metrics response returned by MetricsResource.get_flow_metrics(). +Request model for creating a team. Fields: -- `status`: `Optional` -- `message`: `Optional` -- `metrics`: `Optional` +- `name`: `str` +- `description`: `Optional` +- `members`: `List` Methods: @@ -3159,18 +5422,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ResourceMetricDaily +### TeamMember -Defined in `nexla_sdk/models/metrics/responses.py:30` +Defined in `nexla_sdk/models/teams/responses.py:10` -Daily resource metrics. +Team member information. Fields: -- `time`: `str` -- `records`: `int` -- `size`: `int` -- `errors`: `int` +- `id`: `int` +- `email`: `str` +- `admin`: `bool` Methods: @@ -3181,20 +5443,15 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ResourceMetricsByRun +### TeamMemberList -Defined in `nexla_sdk/models/metrics/responses.py:39` +Defined in `nexla_sdk/models/teams/requests.py:33` -Resource metrics grouped by run. +Request model for team member operations. Fields: -- `runId`: `Optional` -- `lastWritten`: `Optional` -- `dataSetId`: `int` -- `records`: `int` -- `size`: `int` -- `errors`: `int` +- `members`: `List` Methods: @@ -3205,57 +5462,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### ResourceStatus - -Defined in `nexla_sdk/models/enums.py:13` - -Common resource status values. - -Members: - -- `ACTIVE` = `ACTIVE` -- `PAUSED` = `PAUSED` -- `DRAFT` = `DRAFT` -- `DELETED` = `DELETED` -- `ERROR` = `ERROR` -- `INIT` = `INIT` -- `PROCESSING` = `PROCESSING` - -### ResourceType - -Defined in `nexla_sdk/models/enums.py:25` - -Resource types in Nexla. - -Members: - -- `ORG` = `ORG` -- `USER` = `USER` -- `TEAM` = `TEAM` -- `DATA_FLOW` = `DATA_FLOW` -- `CUSTOM_DATA_FLOW` = `CUSTOM_DATA_FLOW` -- `SOURCE` = `SOURCE` -- `DATASET` = `DATASET` -- `SINK` = `SINK` -- `DATA_MAP` = `DATA_MAP` -- `DATA_SCHEMA` = `DATA_SCHEMA` -- `DATA_CREDENTIAL` = `DATA_CREDENTIAL` -- `PROJECT` = `PROJECT` -- `CODE_CONTAINER` = `CODE_CONTAINER` -- `TRANSFORM` = `TRANSFORM` -- `FLOW` = `FLOW` -- `PIPELINE` = `PIPELINE` - -### RunInfo +### TeamMemberRequest -Defined in `nexla_sdk/models/sources/responses.py:24` +Defined in `nexla_sdk/models/teams/requests.py:8` -Run information. +Request model for team member. Fields: -- `id`: `int` -- `created_at`: `datetime` +- `id`: `Optional` +- `email`: `Optional` +- `admin`: `bool` Methods: @@ -3266,25 +5483,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Runtime +### TeamUpdate -Defined in `nexla_sdk/models/runtimes/responses.py:7` +Defined in `nexla_sdk/models/teams/requests.py:25` -Response model for Custom Runtime aligned with OpenAPI Runtime schema. +Request model for updating a team. Fields: -- `id`: `int` -- `name`: `str` +- `name`: `Optional` - `description`: `Optional` -- `active`: `Optional` -- `dockerpath`: `Optional` -- `managed`: `Optional` -- `config`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `members`: `Optional` Methods: @@ -3295,20 +5504,44 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### RuntimeCreate +### Transform -Defined in `nexla_sdk/models/runtimes/requests.py:6` +Defined in `nexla_sdk/models/transforms/responses.py:12` -Create payload for Custom Runtime matching OpenAPI RuntimePayload. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: +- `id`: `int` - `name`: `str` +- `resource_type`: `Optional` +- `reusable`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `data_credentials`: `Optional` +- `runtime_data_credentials`: `Optional` - `description`: `Optional` -- `active`: `Optional` -- `dockerpath`: `Optional` +- `code_type`: `Optional` +- `output_type`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `code_encoding`: `Optional` +- `code`: `Optional` - `managed`: `Optional` -- `config`: `Optional` +- `data_sets`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` +- `tags`: `Optional` Methods: @@ -3319,20 +5552,33 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### RuntimeUpdate +### TransformCreate -Defined in `nexla_sdk/models/runtimes/requests.py:17` +Defined in `nexla_sdk/models/transforms/requests.py:8` -Update payload for Custom Runtime matching OpenAPI RuntimePayload. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `name`: `Optional` +- `name`: `str` +- `output_type`: `str` +- `reusable`: `bool` +- `code_type`: `str` +- `code_encoding`: `str` +- `code`: `List` - `description`: `Optional` -- `active`: `Optional` -- `dockerpath`: `Optional` -- `managed`: `Optional` -- `config`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` Methods: @@ -3343,9 +5589,23 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### SelfSignupRequest +### TransformType -Defined in `nexla_sdk/models/self_signup/responses.py:7` +Defined in `nexla_sdk/models/nexsets/enums.py:15` + +Transform types. + +Members: + +- `JOLT_STANDARD` = `jolt_standard` +- `JOLT_CUSTOM` = `jolt_custom` +- `PYTHON` = `python` +- `JAVASCRIPT` = `javascript` +- `SQL` = `sql` + +### TransformUpdate + +Defined in `nexla_sdk/models/transforms/requests.py:23` Base model class with Pydantic functionality and Nexla API compatibility. @@ -3359,13 +5619,17 @@ Features: Fields: -- `id`: `int` -- `status`: `Optional` -- `email`: `Optional` -- `full_name`: `Optional` -- `invite_id`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` +- `name`: `Optional` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `code_type`: `Optional` +- `code_encoding`: `Optional` +- `code`: `Optional` +- `description`: `Optional` +- `code_config`: `Optional` +- `custom_config`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` Methods: @@ -3376,42 +5640,27 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Source +### User -Defined in `nexla_sdk/models/sources/responses.py:31` +Defined in `nexla_sdk/models/users/responses.py:26` -Data source response model. +User response model. Fields: - `id`: `int` -- `name`: `str` +- `email`: `str` +- `full_name`: `str` +- `super_user`: `Optional` +- `impersonated`: `bool` +- `default_org`: `DefaultOrg` +- `user_tier`: `Optional` - `status`: `str` -- `source_type`: `str` -- `connector_type`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `managed`: `Optional` -- `auto_generated`: `Optional` -- `connector`: `Optional` -- `description`: `Optional` -- `ingest_method`: `Optional` -- `source_format`: `Optional` -- `source_config`: `Optional` -- `poll_schedule`: `Optional` -- `code_container_id`: `Optional` -- `data_credentials_id`: `Optional` -- `data_credentials`: `Optional` -- `data_sets`: `List` -- `api_keys`: `List` -- `run_ids`: `List` -- `copied_from_id`: `Optional` -- `flow_type`: `Optional` -- `has_template`: `Optional` -- `vendor_endpoint`: `Optional` -- `vendor`: `Optional` -- `tags`: `List` +- `account_locked`: `bool` +- `org_memberships`: `List` +- `api_key`: `Optional` +- `email_verified_at`: `Optional` +- `tos_signed_at`: `Optional` - `created_at`: `Optional` - `updated_at`: `Optional` @@ -3424,18 +5673,19 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### SourceCopyOptions +### UserAccessorRequest -Defined in `nexla_sdk/models/sources/requests.py:34` +Defined in `nexla_sdk/models/access/requests.py:10` -Options for copying a source. +Request model for USER type accessor. Fields: -- `reuse_data_credentials`: `bool` -- `copy_access_controls`: `bool` -- `owner_id`: `Optional` -- `org_id`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the user +- `email`: `Optional` — Email of the user +- `org_id`: `Optional` — Organization ID for cross-org access +- `access_roles`: `List` — List of access roles Methods: @@ -3446,22 +5696,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### SourceCreate +### UserAccessorResponse -Defined in `nexla_sdk/models/sources/requests.py:8` +Defined in `nexla_sdk/models/access/responses.py:11` -Request model for creating a source. +Response model for USER type accessor. Fields: -- `name`: `str` -- `source_type`: `str` -- `data_credentials_id`: `Optional` -- `description`: `Optional` -- `source_config`: `Optional` -- `vendor_endpoint_id`: `Optional` -- `ingest_method`: `Optional` -- `template_config`: `Optional` +- `type`: `Literal` +- `id`: `Optional` — Unique ID of the user +- `email`: `Optional` — Email of the user +- `org_id`: `Optional` — Organization ID for cross-org access +- `access_roles`: `List` — List of access roles +- `created_at`: `Optional` — Creation timestamp +- `updated_at`: `Optional` — Last update timestamp Methods: @@ -3472,69 +5721,23 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### SourceStatus - -Defined in `nexla_sdk/models/sources/enums.py:6` - -Source status values. - -Members: - -- `ACTIVE` = `ACTIVE` -- `PAUSED` = `PAUSED` -- `DRAFT` = `DRAFT` -- `DELETED` = `DELETED` -- `ERROR` = `ERROR` - -### SourceType - -Defined in `nexla_sdk/models/sources/enums.py:16` - -Supported source types. - -Members: - -- `S3` = `s3` -- `GCS` = `gcs` -- `AZURE_BLB` = `azure_blb` -- `FTP` = `ftp` -- `DROPBOX` = `dropbox` -- `BOX` = `box` -- `GDRIVE` = `gdrive` -- `SHAREPOINT` = `sharepoint` -- `MYSQL` = `mysql` -- `POSTGRES` = `postgres` -- `SQLSERVER` = `sqlserver` -- `ORACLE` = `oracle` -- `REDSHIFT` = `redshift` -- `SNOWFLAKE` = `snowflake` -- `BIGQUERY` = `bigquery` -- `DATABRICKS` = `databricks` -- `MONGO` = `mongo` -- `DYNAMODB` = `dynamodb` -- `FIREBASE` = `firebase` -- `KAFKA` = `kafka` -- `CONFLUENT_KAFKA` = `confluent_kafka` -- `GOOGLE_PUBSUB` = `google_pubsub` -- `REST` = `rest` -- `SOAP` = `soap` -- `NEXLA_REST` = `nexla_rest` -- `FILE_UPLOAD` = `file_upload` -- `EMAIL` = `email` -- `NEXLA_MONITOR` = `nexla_monitor` - -### SourceUpdate +### UserCreate -Defined in `nexla_sdk/models/sources/requests.py:25` +Defined in `nexla_sdk/models/users/requests.py:7` -Request model for updating a source. +Request model for creating a user. Fields: -- `name`: `Optional` -- `description`: `Optional` -- `source_config`: `Optional` -- `data_credentials_id`: `Optional` +- `full_name`: `str` +- `email`: `str` +- `default_org_id`: `Optional` +- `status`: `Optional` +- `user_tier_id`: `Optional` +- `user_tier`: `Optional` +- `password`: `Optional` +- `tos_signed_at`: `Optional` +- `admin`: `Union` Methods: @@ -3545,25 +5748,36 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Team +### UserCredit -Defined in `nexla_sdk/models/teams/responses.py:18` +Defined in `nexla_sdk/models/users/credits.py:7` -Team response model. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: - `id`: `int` -- `name`: `str` -- `description`: `str` -- `owner`: `Owner` -- `org`: `Organization` -- `member`: `bool` -- `members`: `List` -- `access_roles`: `List` -- `tags`: `List` -- `created_at`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `grant_type`: `Optional` +- `credits_available`: `Optional` +- `credits`: `Optional` +- `credits_used`: `Optional` +- `credits_monthly`: `Optional` +- `credits_used_in_month`: `Optional` +- `granted_at`: `Optional` +- `refreshed_at`: `Optional` +- `expires_at`: `Optional` - `updated_at`: `Optional` +- `created_at`: `Optional` Methods: @@ -3574,18 +5788,26 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamAccessorRequest +### UserCreditCreate -Defined in `nexla_sdk/models/access/requests.py:22` +Defined in `nexla_sdk/models/users/credits.py:24` -Request model for TEAM type accessor. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the team -- `name`: `Optional` — Name of the team -- `access_roles`: `List` — List of access roles +- `grant_type`: `Optional` +- `credits`: `Optional` +- `credits_monthly`: `Optional` +- `expires_at`: `Optional` Methods: @@ -3596,20 +5818,30 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamAccessorResponse +### UserExpanded -Defined in `nexla_sdk/models/access/responses.py:25` +Defined in `nexla_sdk/models/users/responses.py:56` -Response model for TEAM type accessor. +User with expanded account summary. Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the team -- `name`: `Optional` — Name of the team -- `access_roles`: `List` — List of access roles -- `created_at`: `Optional` — Creation timestamp -- `updated_at`: `Optional` — Last update timestamp +- `id`: `int` +- `email`: `str` +- `full_name`: `str` +- `super_user`: `Optional` +- `impersonated`: `bool` +- `default_org`: `DefaultOrg` +- `user_tier`: `Optional` +- `status`: `str` +- `account_locked`: `bool` +- `org_memberships`: `List` +- `api_key`: `Optional` +- `email_verified_at`: `Optional` +- `tos_signed_at`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` +- `account_summary`: `Optional` Methods: @@ -3620,17 +5852,32 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamCreate +### UserSetting -Defined in `nexla_sdk/models/teams/requests.py:17` +Defined in `nexla_sdk/models/user_settings/responses.py:8` -Request model for creating a team. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `name`: `str` +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `user_settings_type`: `Optional` +- `primary_key_value`: `Optional` - `description`: `Optional` -- `members`: `List` +- `settings`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` Methods: @@ -3641,17 +5888,27 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamMember +### UserSettingCreate -Defined in `nexla_sdk/models/teams/responses.py:10` +Defined in `nexla_sdk/models/user_settings/requests.py:6` -Team member information. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `id`: `int` -- `email`: `str` -- `admin`: `bool` +- `user_settings_type`: `str` +- `primary_key_value`: `str` +- `description`: `Optional` +- `settings`: `Optional` +- `copied_from_id`: `Optional` Methods: @@ -3662,15 +5919,24 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamMemberList +### UserSettingUpdate -Defined in `nexla_sdk/models/teams/requests.py:33` +Defined in `nexla_sdk/models/user_settings/requests.py:14` -Request model for team member operations. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `members`: `List` +- `description`: `Optional` +- `settings`: `Optional` Methods: @@ -3681,17 +5947,19 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamMemberRequest +### UserSettings -Defined in `nexla_sdk/models/teams/requests.py:8` +Defined in `nexla_sdk/models/users/responses.py:62` -Request model for team member. +User settings. Fields: -- `id`: `Optional` -- `email`: `Optional` -- `admin`: `bool` +- `id`: `str` +- `owner`: `Dict` +- `org`: `Dict` +- `user_settings_type`: `str` +- `settings`: `Dict` Methods: @@ -3702,17 +5970,56 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TeamUpdate +### UserStatus -Defined in `nexla_sdk/models/teams/requests.py:25` +Defined in `nexla_sdk/models/enums.py:76` -Request model for updating a team. +User account status. + +Members: + +- `ACTIVE` = `ACTIVE` +- `DEACTIVATED` = `DEACTIVATED` +- `SOURCE_COUNT_CAPPED` = `SOURCE_COUNT_CAPPED` +- `SOURCE_DATA_CAPPED` = `SOURCE_DATA_CAPPED` +- `TRIAL_EXPIRED` = `TRIAL_EXPIRED` + +### UserTier + +Defined in `nexla_sdk/models/enums.py:67` + +User account tiers. + +Members: + +- `FREE` = `FREE` +- `TRIAL` = `TRIAL` +- `PAID` = `PAID` +- `FREE_FOREVER` = `FREE_FOREVER` + +### UserTierInfo + +Defined in `nexla_sdk/models/user_tiers/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: +- `id`: `int` - `name`: `Optional` -- `description`: `Optional` -- `members`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` Methods: @@ -3723,44 +6030,69 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### Transform +### UserUpdate -Defined in `nexla_sdk/models/transforms/responses.py:12` +Defined in `nexla_sdk/models/users/requests.py:21` -Base model class with Pydantic functionality and Nexla API compatibility. +Request model for updating a user. -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Fields: + +- `name`: `Optional` +- `email`: `Optional` +- `status`: `Optional` +- `user_tier_id`: `Optional` +- `user_tier`: `Optional` +- `password`: `Optional` +- `password_confirmation`: `Optional` +- `password_current`: `Optional` +- `tos_signed_at`: `Optional` +- `admin`: `Union` + +Methods: + +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. + +### Validator + +Defined in `nexla_sdk/models/validators/responses.py:22` + +Validator response model. Fields: - `id`: `int` -- `name`: `str` -- `resource_type`: `Optional` -- `reusable`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `data_credentials`: `Optional` -- `runtime_data_credentials`: `Optional` +- `name`: `Optional` - `description`: `Optional` +- `resource_type`: `str` - `code_type`: `Optional` - `output_type`: `Optional` +- `code`: `Optional` - `code_config`: `Optional` -- `custom_config`: `Optional` - `code_encoding`: `Optional` -- `code`: `Optional` -- `managed`: `Optional` +- `code_error`: `Optional` +- `custom_config`: `Optional` +- `repo_config`: `Optional` +- `reusable`: `bool` +- `public`: `bool` +- `managed`: `bool` +- `ai_function_type`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `data_credentials`: `Optional` +- `runtime_data_credentials`: `Optional` - `data_sets`: `Optional` +- `tags`: `Optional` +- `referenced_resource_ids`: `Optional` - `copied_from_id`: `Optional` - `updated_at`: `Optional` - `created_at`: `Optional` -- `tags`: `Optional` Methods: @@ -3771,33 +6103,18 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TransformCreate - -Defined in `nexla_sdk/models/transforms/requests.py:8` +### ValidatorCopyOptions -Base model class with Pydantic functionality and Nexla API compatibility. +Defined in `nexla_sdk/models/validators/requests.py:52` -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Options for copying a validator. Fields: -- `name`: `str` -- `output_type`: `str` -- `reusable`: `bool` -- `code_type`: `str` -- `code_encoding`: `str` -- `code`: `List` -- `description`: `Optional` -- `code_config`: `Optional` -- `custom_config`: `Optional` -- `data_credentials_id`: `Optional` -- `runtime_data_credentials_id`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `copy_access_controls`: `Optional` +- `reuse_data_credentials`: `Optional` Methods: @@ -3808,47 +6125,66 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### TransformType +### ValidatorCreate -Defined in `nexla_sdk/models/nexsets/enums.py:15` +Defined in `nexla_sdk/models/validators/requests.py:8` -Transform types. +Request model for creating a validator. -Members: +Fields: -- `JOLT_STANDARD` = `jolt_standard` -- `JOLT_CUSTOM` = `jolt_custom` -- `PYTHON` = `python` -- `JAVASCRIPT` = `javascript` -- `SQL` = `sql` +- `name`: `Optional` +- `description`: `Optional` +- `code_type`: `str` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `custom_config`: `Optional` +- `resource_type`: `str` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `ai_function_type`: `Optional` -### TransformUpdate +Methods: -Defined in `nexla_sdk/models/transforms/requests.py:23` +- `to_dict(self, exclude_none: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/models/base.py:42` + - Convert model to dictionary. +- `to_json(self, exclude_none: bool = True, indent: int = 2) -> str` + - Source: `nexla_sdk/models/base.py:54` + - Convert model to JSON string. -Base model class with Pydantic functionality and Nexla API compatibility. +### ValidatorUpdate -Features: -- Automatically ignores unknown fields from API responses -- Supports both camelCase and snake_case field names -- Handles datetime parsing automatically -- Provides JSON serialization methods -- Validates data types automatically -- Easy logging and printing support +Defined in `nexla_sdk/models/validators/requests.py:32` + +Request model for updating a validator. Fields: - `name`: `Optional` -- `output_type`: `Optional` -- `reusable`: `Optional` +- `description`: `Optional` - `code_type`: `Optional` -- `code_encoding`: `Optional` - `code`: `Optional` -- `description`: `Optional` - `code_config`: `Optional` +- `code_encoding`: `Optional` - `custom_config`: `Optional` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` - `data_credentials_id`: `Optional` - `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` Methods: @@ -3859,27 +6195,27 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### User +### Vendor -Defined in `nexla_sdk/models/users/responses.py:26` +Defined in `nexla_sdk/models/vendors/responses.py:19` -User response model. +Vendor response model. + +Vendors represent third-party service providers that can be +connected via auth templates and endpoints. Fields: - `id`: `int` -- `email`: `str` -- `full_name`: `str` -- `super_user`: `Optional` -- `impersonated`: `bool` -- `default_org`: `DefaultOrg` -- `user_tier`: `Optional` -- `status`: `str` -- `account_locked`: `bool` -- `org_memberships`: `List` -- `api_key`: `Optional` -- `email_verified_at`: `Optional` -- `tos_signed_at`: `Optional` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connection_type`: `Optional` +- `auth_templates`: `Optional` +- `vendor_endpoints`: `Optional` - `created_at`: `Optional` - `updated_at`: `Optional` @@ -3892,19 +6228,21 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserAccessorRequest +### VendorCreate -Defined in `nexla_sdk/models/access/requests.py:10` +Defined in `nexla_sdk/models/vendors/requests.py:8` -Request model for USER type accessor. +Request model for creating a vendor (super user only). Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the user -- `email`: `Optional` — Email of the user -- `org_id`: `Optional` — Organization ID for cross-org access -- `access_roles`: `List` — List of access roles +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connector_id`: `Optional` Methods: @@ -3915,21 +6253,30 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserAccessorResponse +### VendorEndpoint -Defined in `nexla_sdk/models/access/responses.py:11` +Defined in `nexla_sdk/models/vendor_endpoints/responses.py:8` -Response model for USER type accessor. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `type`: `Literal` -- `id`: `Optional` — Unique ID of the user -- `email`: `Optional` — Email of the user -- `org_id`: `Optional` — Organization ID for cross-org access -- `access_roles`: `List` — List of access roles -- `created_at`: `Optional` — Creation timestamp -- `updated_at`: `Optional` — Last update timestamp +- `id`: `int` +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` Methods: @@ -3940,23 +6287,26 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserCreate +### VendorEndpointCreate -Defined in `nexla_sdk/models/users/requests.py:7` +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:6` -Request model for creating a user. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `full_name`: `str` -- `email`: `str` -- `default_org_id`: `Optional` -- `status`: `Optional` -- `user_tier_id`: `Optional` -- `user_tier`: `Optional` -- `password`: `Optional` -- `tos_signed_at`: `Optional` -- `admin`: `Union` +- `name`: `str` +- `vendor_id`: `int` +- `resource_type`: `Optional` +- `config`: `Optional` Methods: @@ -3967,30 +6317,25 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserExpanded +### VendorEndpointUpdate -Defined in `nexla_sdk/models/users/responses.py:56` +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:13` -User with expanded account summary. +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support Fields: -- `id`: `int` -- `email`: `str` -- `full_name`: `str` -- `super_user`: `Optional` -- `impersonated`: `bool` -- `default_org`: `DefaultOrg` -- `user_tier`: `Optional` -- `status`: `str` -- `account_locked`: `bool` -- `org_memberships`: `List` -- `api_key`: `Optional` -- `email_verified_at`: `Optional` -- `tos_signed_at`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` -- `account_summary`: `Optional` +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` Methods: @@ -4001,19 +6346,17 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserSettings +### VendorRef -Defined in `nexla_sdk/models/users/responses.py:62` +Defined in `nexla_sdk/models/vendors/responses.py:11` -User settings. +Minimal vendor reference. Fields: -- `id`: `str` -- `owner`: `Dict` -- `org`: `Dict` -- `user_settings_type`: `str` -- `settings`: `Dict` +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` Methods: @@ -4024,51 +6367,20 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. -### UserStatus - -Defined in `nexla_sdk/models/enums.py:76` - -User account status. - -Members: - -- `ACTIVE` = `ACTIVE` -- `DEACTIVATED` = `DEACTIVATED` -- `SOURCE_COUNT_CAPPED` = `SOURCE_COUNT_CAPPED` -- `SOURCE_DATA_CAPPED` = `SOURCE_DATA_CAPPED` -- `TRIAL_EXPIRED` = `TRIAL_EXPIRED` - -### UserTier - -Defined in `nexla_sdk/models/enums.py:67` - -User account tiers. - -Members: - -- `FREE` = `FREE` -- `TRIAL` = `TRIAL` -- `PAID` = `PAID` -- `FREE_FOREVER` = `FREE_FOREVER` - -### UserUpdate +### VendorUpdate -Defined in `nexla_sdk/models/users/requests.py:21` +Defined in `nexla_sdk/models/vendors/requests.py:20` -Request model for updating a user. +Request model for updating a vendor (super user only). Fields: - `name`: `Optional` -- `email`: `Optional` -- `status`: `Optional` -- `user_tier_id`: `Optional` -- `user_tier`: `Optional` -- `password`: `Optional` -- `password_confirmation`: `Optional` -- `password_current`: `Optional` -- `tos_signed_at`: `Optional` -- `admin`: `Union` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` Methods: @@ -4147,3 +6459,24 @@ Methods: - Source: `nexla_sdk/models/base.py:54` - Convert model to JSON string. +## Functions + +### `FlexibleEnum(enum_cls: Type[~E]) -> Type[Union[~E, str]]` + +Source: `nexla_sdk/models/flexible_enums.py:49` + +Create a flexible enum type annotation for Pydantic models. + +This creates an Annotated type that accepts either a valid enum value +or any string. Known values are returned as enum members; unknown values +are returned as raw strings. + +Usage: + sink_type: Optional[FlexibleEnum(DestinationType)] = None + +Args: + enum_cls: The enum class to create a flexible version of + +Returns: + An Annotated type suitable for Pydantic model fields + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.mdx new file mode 100644 index 0000000..46efb56 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.mdx @@ -0,0 +1,73 @@ +--- +id: nexla_sdk.models.notification_channel_settings +title: nexla_sdk.models.notification_channel_settings +slug: /api/python/modules/nexla_sdk/models/notification_channel_settings +description: API for nexla_sdk.models.notification_channel_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationChannelSetting + +Defined in `nexla_sdk/models/notification_channel_settings/responses.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `channel`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### NotificationChannelSettingCreate + +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `channel`: `str` +- `config`: `Optional` +- `org_id`: `Optional` + +### NotificationChannelSettingUpdate + +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:12` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `channel`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.requests.mdx new file mode 100644 index 0000000..2b88cb6 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.requests.mdx @@ -0,0 +1,49 @@ +--- +id: nexla_sdk.models.notification_channel_settings.requests +title: nexla_sdk.models.notification_channel_settings.requests +slug: /api/python/modules/nexla_sdk/models/notification_channel_settings/requests +description: API for nexla_sdk.models.notification_channel_settings.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationChannelSettingCreate + +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `channel`: `str` +- `config`: `Optional` +- `org_id`: `Optional` + +### NotificationChannelSettingUpdate + +Defined in `nexla_sdk/models/notification_channel_settings/requests.py:12` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `channel`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.responses.mdx new file mode 100644 index 0000000..2d984b5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_channel_settings.responses.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.models.notification_channel_settings.responses +title: nexla_sdk.models.notification_channel_settings.responses +slug: /api/python/modules/nexla_sdk/models/notification_channel_settings/responses +description: API for nexla_sdk.models.notification_channel_settings.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationChannelSetting + +Defined in `nexla_sdk/models/notification_channel_settings/responses.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `channel`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.mdx new file mode 100644 index 0000000..3ee4be2 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.mdx @@ -0,0 +1,78 @@ +--- +id: nexla_sdk.models.notification_settings +title: nexla_sdk.models.notification_settings +slug: /api/python/modules/nexla_sdk/models/notification_settings +description: API for nexla_sdk.models.notification_settings +keywords: [Nexla, SDK, Python, API] +--- + +Notification Settings models. + +## Classes + +### NotificationSetting + +Defined in `nexla_sdk/models/notification_settings/responses.py:9` + +Notification Setting response model. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `resource_id`: `Optional` +- `resource_type`: `Optional` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `payload`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### NotificationSettingBrief + +Defined in `nexla_sdk/models/notification_settings/responses.py:26` + +Brief Notification Setting response model for list views. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `resource_type`: `Optional` +- `resource_id`: `Optional` + +### NotificationSettingCreate + +Defined in `nexla_sdk/models/notification_settings/requests.py:10` + +Notification Setting creation request model. + +Fields: + +- `notification_type_id`: `int` +- `resource_id`: `Optional` +- `resource_type`: `Optional` +- `channel`: `str` — Notification channel (e.g., email, slack) +- `priority`: `int` — Priority level +- `status`: `str` — Status (ENABLED, DISABLED) +- `payload`: `Optional` + +### NotificationSettingUpdate + +Defined in `nexla_sdk/models/notification_settings/requests.py:27` + +Notification Setting update request model. + +Fields: + +- `channel`: `Optional` +- `priority`: `Optional` +- `status`: `Optional` +- `payload`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.requests.mdx new file mode 100644 index 0000000..cbc6cf4 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.requests.mdx @@ -0,0 +1,41 @@ +--- +id: nexla_sdk.models.notification_settings.requests +title: nexla_sdk.models.notification_settings.requests +slug: /api/python/modules/nexla_sdk/models/notification_settings/requests +description: API for nexla_sdk.models.notification_settings.requests +keywords: [Nexla, SDK, Python, API] +--- + +Notification Setting request models. + +## Classes + +### NotificationSettingCreate + +Defined in `nexla_sdk/models/notification_settings/requests.py:10` + +Notification Setting creation request model. + +Fields: + +- `notification_type_id`: `int` +- `resource_id`: `Optional` +- `resource_type`: `Optional` +- `channel`: `str` — Notification channel (e.g., email, slack) +- `priority`: `int` — Priority level +- `status`: `str` — Status (ENABLED, DISABLED) +- `payload`: `Optional` + +### NotificationSettingUpdate + +Defined in `nexla_sdk/models/notification_settings/requests.py:27` + +Notification Setting update request model. + +Fields: + +- `channel`: `Optional` +- `priority`: `Optional` +- `status`: `Optional` +- `payload`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.responses.mdx new file mode 100644 index 0000000..4283157 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_settings.responses.mdx @@ -0,0 +1,49 @@ +--- +id: nexla_sdk.models.notification_settings.responses +title: nexla_sdk.models.notification_settings.responses +slug: /api/python/modules/nexla_sdk/models/notification_settings/responses +description: API for nexla_sdk.models.notification_settings.responses +keywords: [Nexla, SDK, Python, API] +--- + +Notification Setting response models. + +## Classes + +### NotificationSetting + +Defined in `nexla_sdk/models/notification_settings/responses.py:9` + +Notification Setting response model. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `resource_id`: `Optional` +- `resource_type`: `Optional` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `payload`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### NotificationSettingBrief + +Defined in `nexla_sdk/models/notification_settings/responses.py:26` + +Brief Notification Setting response model for list views. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `resource_type`: `Optional` +- `resource_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.mdx new file mode 100644 index 0000000..dbd39c8 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.mdx @@ -0,0 +1,35 @@ +--- +id: nexla_sdk.models.notification_types +title: nexla_sdk.models.notification_types +slug: /api/python/modules/nexla_sdk/models/notification_types +description: API for nexla_sdk.models.notification_types +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationType + +Defined in `nexla_sdk/models/notification_types/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `category`: `Optional` +- `default`: `Optional` +- `status`: `Optional` +- `event_type`: `Optional` +- `resource_type`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.responses.mdx new file mode 100644 index 0000000..f2c5b89 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notification_types.responses.mdx @@ -0,0 +1,35 @@ +--- +id: nexla_sdk.models.notification_types.responses +title: nexla_sdk.models.notification_types.responses +slug: /api/python/modules/nexla_sdk/models/notification_types/responses +description: API for nexla_sdk.models.notification_types.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationType + +Defined in `nexla_sdk/models/notification_types/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `category`: `Optional` +- `default`: `Optional` +- `status`: `Optional` +- `event_type`: `Optional` +- `resource_type`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.mdx index 586769a..a0d3978 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.mdx @@ -100,6 +100,22 @@ Fields: - `config`: `Dict` - `priority`: `Optional` +### NotificationSettingBrief + +Defined in `nexla_sdk/models/notifications/responses.py:79` + +Brief Notification Setting response model for list views. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `resource_type`: `Optional` +- `resource_id`: `Optional` + ### NotificationSettingCreate Defined in `nexla_sdk/models/notifications/requests.py:22` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.responses.mdx index 7dae039..7fe1b61 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.responses.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.notifications.responses.mdx @@ -78,6 +78,22 @@ Fields: - `config`: `Dict` - `priority`: `Optional` +### NotificationSettingBrief + +Defined in `nexla_sdk/models/notifications/responses.py:79` + +Brief Notification Setting response model for list views. + +Fields: + +- `id`: `int` +- `notification_type_id`: `int` +- `channel`: `str` +- `priority`: `int` +- `status`: `str` +- `resource_type`: `Optional` +- `resource_id`: `Optional` + ### NotificationType Defined in `nexla_sdk/models/notifications/responses.py:28` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.mdx new file mode 100644 index 0000000..2a81a82 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.models.org_tiers +title: nexla_sdk.models.org_tiers +slug: /api/python/modules/nexla_sdk/models/org_tiers +description: API for nexla_sdk.models.org_tiers +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### OrgTier + +Defined in `nexla_sdk/models/org_tiers/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.responses.mdx new file mode 100644 index 0000000..fbe2e30 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.org_tiers.responses.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.models.org_tiers.responses +title: nexla_sdk.models.org_tiers.responses +slug: /api/python/modules/nexla_sdk/models/org_tiers/responses +description: API for nexla_sdk.models.org_tiers.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### OrgTier + +Defined in `nexla_sdk/models/org_tiers/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.mdx new file mode 100644 index 0000000..b630378 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.mdx @@ -0,0 +1,80 @@ +--- +id: nexla_sdk.models.quarantine_settings +title: nexla_sdk.models.quarantine_settings +slug: /api/python/modules/nexla_sdk/models/quarantine_settings +description: API for nexla_sdk.models.quarantine_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### QuarantineSetting + +Defined in `nexla_sdk/models/quarantine_settings/responses.py:9` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `config`: `Optional` +- `data_credentials_id`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### QuarantineSettingCreate + +Defined in `nexla_sdk/models/quarantine_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials_id`: `int` +- `config`: `Dict` +- `owner_id`: `Optional` +- `org_id`: `Optional` + +### QuarantineSettingUpdate + +Defined in `nexla_sdk/models/quarantine_settings/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.requests.mdx new file mode 100644 index 0000000..3d03742 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.requests.mdx @@ -0,0 +1,52 @@ +--- +id: nexla_sdk.models.quarantine_settings.requests +title: nexla_sdk.models.quarantine_settings.requests +slug: /api/python/modules/nexla_sdk/models/quarantine_settings/requests +description: API for nexla_sdk.models.quarantine_settings.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### QuarantineSettingCreate + +Defined in `nexla_sdk/models/quarantine_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials_id`: `int` +- `config`: `Dict` +- `owner_id`: `Optional` +- `org_id`: `Optional` + +### QuarantineSettingUpdate + +Defined in `nexla_sdk/models/quarantine_settings/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `data_credentials_id`: `Optional` +- `config`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.responses.mdx new file mode 100644 index 0000000..fb80310 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.quarantine_settings.responses.mdx @@ -0,0 +1,38 @@ +--- +id: nexla_sdk.models.quarantine_settings.responses +title: nexla_sdk.models.quarantine_settings.responses +slug: /api/python/modules/nexla_sdk/models/quarantine_settings/responses +description: API for nexla_sdk.models.quarantine_settings.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### QuarantineSetting + +Defined in `nexla_sdk/models/quarantine_settings/responses.py:9` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `resource_type`: `Optional` +- `resource_id`: `Optional` +- `config`: `Optional` +- `data_credentials_id`: `Optional` +- `credentials_type`: `Optional` +- `data_credentials`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.mdx new file mode 100644 index 0000000..026c1f3 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.mdx @@ -0,0 +1,94 @@ +--- +id: nexla_sdk.models.resource_parameters +title: nexla_sdk.models.resource_parameters +slug: /api/python/modules/nexla_sdk/models/resource_parameters +description: API for nexla_sdk.models.resource_parameters +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### ResourceParameter + +Defined in `nexla_sdk/models/resource_parameters/responses.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint`: `Optional` +- `allowed_values`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### ResourceParameterCreate + +Defined in `nexla_sdk/models/resource_parameters/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` + +### ResourceParameterUpdate + +Defined in `nexla_sdk/models/resource_parameters/requests.py:19` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.requests.mdx new file mode 100644 index 0000000..63aa24d --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.requests.mdx @@ -0,0 +1,64 @@ +--- +id: nexla_sdk.models.resource_parameters.requests +title: nexla_sdk.models.resource_parameters.requests +slug: /api/python/modules/nexla_sdk/models/resource_parameters/requests +description: API for nexla_sdk.models.resource_parameters.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### ResourceParameterCreate + +Defined in `nexla_sdk/models/resource_parameters/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` + +### ResourceParameterUpdate + +Defined in `nexla_sdk/models/resource_parameters/requests.py:19` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint_id`: `Optional` +- `allowed_values`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.responses.mdx new file mode 100644 index 0000000..55d8684 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.resource_parameters.responses.mdx @@ -0,0 +1,40 @@ +--- +id: nexla_sdk.models.resource_parameters.responses +title: nexla_sdk.models.resource_parameters.responses +slug: /api/python/modules/nexla_sdk/models/resource_parameters/responses +description: API for nexla_sdk.models.resource_parameters.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### ResourceParameter + +Defined in `nexla_sdk/models/resource_parameters/responses.py:10` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `resource_type`: `Optional` +- `data_type`: `Optional` +- `order`: `Optional` +- `config`: `Optional` +- `global_param`: `Optional` +- `vendor_endpoint`: `Optional` +- `allowed_values`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.mdx new file mode 100644 index 0000000..7df4f65 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.mdx @@ -0,0 +1,61 @@ +--- +id: nexla_sdk.models.service_keys +title: nexla_sdk.models.service_keys +slug: /api/python/modules/nexla_sdk/models/service_keys +description: API for nexla_sdk.models.service_keys +keywords: [Nexla, SDK, Python, API] +--- + +Service keys models. + +## Classes + +### ServiceKey + +Defined in `nexla_sdk/models/service_keys/responses.py:9` + +Service key response model. + +Service keys are long-lived credentials used for programmatic API access. +They can be rotated and have lifecycle management (activate/pause). + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `str` +- `api_key`: `str` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `data_source_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### ServiceKeyCreate + +Defined in `nexla_sdk/models/service_keys/requests.py:8` + +Request model for creating a service key. + +Fields: + +- `name`: `str` +- `description`: `str` +- `data_source_id`: `Optional` + +### ServiceKeyUpdate + +Defined in `nexla_sdk/models/service_keys/requests.py:16` + +Request model for updating a service key. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.requests.mdx new file mode 100644 index 0000000..c6fcccd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.requests.mdx @@ -0,0 +1,35 @@ +--- +id: nexla_sdk.models.service_keys.requests +title: nexla_sdk.models.service_keys.requests +slug: /api/python/modules/nexla_sdk/models/service_keys/requests +description: API for nexla_sdk.models.service_keys.requests +keywords: [Nexla, SDK, Python, API] +--- + +Service key request models. + +## Classes + +### ServiceKeyCreate + +Defined in `nexla_sdk/models/service_keys/requests.py:8` + +Request model for creating a service key. + +Fields: + +- `name`: `str` +- `description`: `str` +- `data_source_id`: `Optional` + +### ServiceKeyUpdate + +Defined in `nexla_sdk/models/service_keys/requests.py:16` + +Request model for updating a service key. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.responses.mdx new file mode 100644 index 0000000..70a6aec --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.service_keys.responses.mdx @@ -0,0 +1,38 @@ +--- +id: nexla_sdk.models.service_keys.responses +title: nexla_sdk.models.service_keys.responses +slug: /api/python/modules/nexla_sdk/models/service_keys/responses +description: API for nexla_sdk.models.service_keys.responses +keywords: [Nexla, SDK, Python, API] +--- + +Service key response models. + +## Classes + +### ServiceKey + +Defined in `nexla_sdk/models/service_keys/responses.py:9` + +Service key response model. + +Service keys are long-lived credentials used for programmatic API access. +They can be rotated and have lifecycle management (activate/pause). + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `name`: `Optional` +- `description`: `Optional` +- `status`: `str` +- `api_key`: `str` +- `last_rotated_key`: `Optional` +- `last_rotated_at`: `Optional` +- `data_source_id`: `Optional` +- `cluster_id`: `Optional` +- `cluster_uid`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.enums.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.enums.mdx index 5a19f8f..5e95c56 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.enums.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.enums.mdx @@ -12,7 +12,7 @@ Enums for sources. ### FlowType -Defined in `nexla_sdk/models/sources/enums.py:72` +Defined in `nexla_sdk/models/sources/enums.py:108` Flow processing types. @@ -24,7 +24,7 @@ Members: ### IngestMethod -Defined in `nexla_sdk/models/sources/enums.py:62` +Defined in `nexla_sdk/models/sources/enums.py:98` Data ingestion methods. @@ -61,29 +61,57 @@ Members: - `S3` = `s3` - `GCS` = `gcs` - `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` - `FTP` = `ftp` - `DROPBOX` = `dropbox` - `BOX` = `box` - `GDRIVE` = `gdrive` - `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` - `MYSQL` = `mysql` - `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` - `SQLSERVER` = `sqlserver` - `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `AS400` = `as400` +- `DB2` = `db2` +- `SYBASE` = `sybase` +- `HANA_JDBC` = `hana_jdbc` +- `NETSUITE_JDBC` = `netsuite_jdbc` - `REDSHIFT` = `redshift` - `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` - `BIGQUERY` = `bigquery` - `DATABRICKS` = `databricks` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `FIREBOLT` = `firebolt` +- `TERADATA` = `teradata` +- `HIVE` = `hive` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` - `MONGO` = `mongo` - `DYNAMODB` = `dynamodb` - `FIREBASE` = `firebase` - `KAFKA` = `kafka` - `CONFLUENT_KAFKA` = `confluent_kafka` - `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` - `REST` = `rest` - `SOAP` = `soap` - `NEXLA_REST` = `nexla_rest` - `FILE_UPLOAD` = `file_upload` - `EMAIL` = `email` - `NEXLA_MONITOR` = `nexla_monitor` +- `PINECONE` = `pinecone` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.mdx index ba6a768..bc3119c 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.mdx @@ -8,26 +8,9 @@ keywords: [Nexla, SDK, Python, API] ## Classes -### DataSetBrief - -Defined in `nexla_sdk/models/sources/responses.py:11` - -Brief dataset information. - -Fields: - -- `id`: `int` -- `owner_id`: `int` -- `org_id`: `int` -- `name`: `Optional` -- `description`: `Optional` -- `version`: `Optional` -- `created_at`: `Optional` -- `updated_at`: `Optional` - ### FlowType -Defined in `nexla_sdk/models/sources/enums.py:72` +Defined in `nexla_sdk/models/sources/enums.py:108` Flow processing types. @@ -39,7 +22,7 @@ Members: ### IngestMethod -Defined in `nexla_sdk/models/sources/enums.py:62` +Defined in `nexla_sdk/models/sources/enums.py:98` Data ingestion methods. @@ -51,86 +34,6 @@ Members: - `SCHEDULED` = `SCHEDULED` - `POLL` = `POLL` -### RunInfo - -Defined in `nexla_sdk/models/sources/responses.py:24` - -Run information. - -Fields: - -- `id`: `int` -- `created_at`: `datetime` - -### Source - -Defined in `nexla_sdk/models/sources/responses.py:31` - -Data source response model. - -Fields: - -- `id`: `int` -- `name`: `str` -- `status`: `str` -- `source_type`: `str` -- `connector_type`: `Optional` -- `owner`: `Optional` -- `org`: `Optional` -- `access_roles`: `Optional` -- `managed`: `Optional` -- `auto_generated`: `Optional` -- `connector`: `Optional` -- `description`: `Optional` -- `ingest_method`: `Optional` -- `source_format`: `Optional` -- `source_config`: `Optional` -- `poll_schedule`: `Optional` -- `code_container_id`: `Optional` -- `data_credentials_id`: `Optional` -- `data_credentials`: `Optional` -- `data_sets`: `List` -- `api_keys`: `List` -- `run_ids`: `List` -- `copied_from_id`: `Optional` -- `flow_type`: `Optional` -- `has_template`: `Optional` -- `vendor_endpoint`: `Optional` -- `vendor`: `Optional` -- `tags`: `List` -- `created_at`: `Optional` -- `updated_at`: `Optional` - -### SourceCopyOptions - -Defined in `nexla_sdk/models/sources/requests.py:34` - -Options for copying a source. - -Fields: - -- `reuse_data_credentials`: `bool` -- `copy_access_controls`: `bool` -- `owner_id`: `Optional` -- `org_id`: `Optional` - -### SourceCreate - -Defined in `nexla_sdk/models/sources/requests.py:8` - -Request model for creating a source. - -Fields: - -- `name`: `str` -- `source_type`: `str` -- `data_credentials_id`: `Optional` -- `description`: `Optional` -- `source_config`: `Optional` -- `vendor_endpoint_id`: `Optional` -- `ingest_method`: `Optional` -- `template_config`: `Optional` - ### SourceStatus Defined in `nexla_sdk/models/sources/enums.py:6` @@ -156,42 +59,57 @@ Members: - `S3` = `s3` - `GCS` = `gcs` - `AZURE_BLB` = `azure_blb` +- `AZURE_DATA_LAKE` = `azure_data_lake` - `FTP` = `ftp` - `DROPBOX` = `dropbox` - `BOX` = `box` - `GDRIVE` = `gdrive` - `SHAREPOINT` = `sharepoint` +- `MIN_IO_S3` = `min_io_s3` +- `WEBDAV` = `webdav` - `MYSQL` = `mysql` - `POSTGRES` = `postgres` +- `SUPABASE` = `supabase` - `SQLSERVER` = `sqlserver` - `ORACLE` = `oracle` +- `ORACLE_AUTONOMOUS` = `oracle_autonomous` +- `AS400` = `as400` +- `DB2` = `db2` +- `SYBASE` = `sybase` +- `HANA_JDBC` = `hana_jdbc` +- `NETSUITE_JDBC` = `netsuite_jdbc` - `REDSHIFT` = `redshift` - `SNOWFLAKE` = `snowflake` +- `SNOWFLAKE_DCR` = `snowflake_dcr` - `BIGQUERY` = `bigquery` - `DATABRICKS` = `databricks` +- `AWS_ATHENA` = `aws_athena` +- `AZURE_SYNAPSE` = `azure_synapse` +- `FIREBOLT` = `firebolt` +- `TERADATA` = `teradata` +- `HIVE` = `hive` +- `CLOUDSQL_MYSQL` = `cloudsql_mysql` +- `CLOUDSQL_POSTGRES` = `cloudsql_postgres` +- `CLOUDSQL_SQLSERVER` = `cloudsql_sqlserver` +- `GCP_ALLOYDB` = `gcp_alloydb` +- `GCP_SPANNER` = `gcp_spanner` +- `DELTA_LAKE_AZURE_BLB` = `delta_lake_azure_blb` +- `DELTA_LAKE_AZURE_DATA_LAKE` = `delta_lake_azure_data_lake` +- `DELTA_LAKE_S3` = `delta_lake_s3` +- `S3_ICEBERG` = `s3_iceberg` - `MONGO` = `mongo` - `DYNAMODB` = `dynamodb` - `FIREBASE` = `firebase` - `KAFKA` = `kafka` - `CONFLUENT_KAFKA` = `confluent_kafka` - `GOOGLE_PUBSUB` = `google_pubsub` +- `JMS` = `jms` +- `TIBCO` = `tibco` - `REST` = `rest` - `SOAP` = `soap` - `NEXLA_REST` = `nexla_rest` - `FILE_UPLOAD` = `file_upload` - `EMAIL` = `email` - `NEXLA_MONITOR` = `nexla_monitor` - -### SourceUpdate - -Defined in `nexla_sdk/models/sources/requests.py:25` - -Request model for updating a source. - -Fields: - -- `name`: `Optional` -- `description`: `Optional` -- `source_config`: `Optional` -- `data_credentials_id`: `Optional` +- `PINECONE` = `pinecone` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.responses.mdx index ab7155a..bc2531a 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.sources.responses.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.sources.responses.mdx @@ -10,7 +10,7 @@ keywords: [Nexla, SDK, Python, API] ### DataSetBrief -Defined in `nexla_sdk/models/sources/responses.py:11` +Defined in `nexla_sdk/models/sources/responses.py:12` Brief dataset information. @@ -27,7 +27,7 @@ Fields: ### RunInfo -Defined in `nexla_sdk/models/sources/responses.py:24` +Defined in `nexla_sdk/models/sources/responses.py:25` Run information. @@ -38,7 +38,7 @@ Fields: ### Source -Defined in `nexla_sdk/models/sources/responses.py:31` +Defined in `nexla_sdk/models/sources/responses.py:32` Data source response model. @@ -47,7 +47,7 @@ Fields: - `id`: `int` - `name`: `str` - `status`: `str` -- `source_type`: `str` +- `source_type`: `Union` - `connector_type`: `Optional` - `owner`: `Optional` - `org`: `Optional` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.mdx new file mode 100644 index 0000000..19644cc --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.mdx @@ -0,0 +1,78 @@ +--- +id: nexla_sdk.models.user_settings +title: nexla_sdk.models.user_settings +slug: /api/python/modules/nexla_sdk/models/user_settings +description: API for nexla_sdk.models.user_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserSetting + +Defined in `nexla_sdk/models/user_settings/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `user_settings_type`: `Optional` +- `primary_key_value`: `Optional` +- `description`: `Optional` +- `settings`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### UserSettingCreate + +Defined in `nexla_sdk/models/user_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `user_settings_type`: `str` +- `primary_key_value`: `str` +- `description`: `Optional` +- `settings`: `Optional` +- `copied_from_id`: `Optional` + +### UserSettingUpdate + +Defined in `nexla_sdk/models/user_settings/requests.py:14` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `description`: `Optional` +- `settings`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.requests.mdx new file mode 100644 index 0000000..34bdcb8 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.requests.mdx @@ -0,0 +1,51 @@ +--- +id: nexla_sdk.models.user_settings.requests +title: nexla_sdk.models.user_settings.requests +slug: /api/python/modules/nexla_sdk/models/user_settings/requests +description: API for nexla_sdk.models.user_settings.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserSettingCreate + +Defined in `nexla_sdk/models/user_settings/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `user_settings_type`: `str` +- `primary_key_value`: `str` +- `description`: `Optional` +- `settings`: `Optional` +- `copied_from_id`: `Optional` + +### UserSettingUpdate + +Defined in `nexla_sdk/models/user_settings/requests.py:14` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `description`: `Optional` +- `settings`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.responses.mdx new file mode 100644 index 0000000..1045f09 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.user_settings.responses.mdx @@ -0,0 +1,37 @@ +--- +id: nexla_sdk.models.user_settings.responses +title: nexla_sdk.models.user_settings.responses +slug: /api/python/modules/nexla_sdk/models/user_settings/responses +description: API for nexla_sdk.models.user_settings.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserSetting + +Defined in `nexla_sdk/models/user_settings/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner`: `Optional` +- `org`: `Optional` +- `user_settings_type`: `Optional` +- `primary_key_value`: `Optional` +- `description`: `Optional` +- `settings`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.mdx new file mode 100644 index 0000000..eac2296 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.models.user_tiers +title: nexla_sdk.models.user_tiers +slug: /api/python/modules/nexla_sdk/models/user_tiers +description: API for nexla_sdk.models.user_tiers +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserTier + +Defined in `nexla_sdk/models/user_tiers/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.responses.mdx new file mode 100644 index 0000000..310851e --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.user_tiers.responses.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.models.user_tiers.responses +title: nexla_sdk.models.user_tiers.responses +slug: /api/python/modules/nexla_sdk/models/user_tiers/responses +description: API for nexla_sdk.models.user_tiers.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserTier + +Defined in `nexla_sdk/models/user_tiers/responses.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `record_count_limit`: `Optional` +- `record_count_limit_time`: `Optional` +- `data_source_count_limit`: `Optional` +- `trial_period_days`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.users.credits.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.users.credits.mdx new file mode 100644 index 0000000..529b020 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.users.credits.mdx @@ -0,0 +1,62 @@ +--- +id: nexla_sdk.models.users.credits +title: nexla_sdk.models.users.credits +slug: /api/python/modules/nexla_sdk/models/users/credits +description: API for nexla_sdk.models.users.credits +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserCredit + +Defined in `nexla_sdk/models/users/credits.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `grant_type`: `Optional` +- `credits_available`: `Optional` +- `credits`: `Optional` +- `credits_used`: `Optional` +- `credits_monthly`: `Optional` +- `credits_used_in_month`: `Optional` +- `granted_at`: `Optional` +- `refreshed_at`: `Optional` +- `expires_at`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### UserCreditCreate + +Defined in `nexla_sdk/models/users/credits.py:24` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `grant_type`: `Optional` +- `credits`: `Optional` +- `credits_monthly`: `Optional` +- `expires_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.users.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.users.mdx index df7451a..345b36c 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.models.users.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.users.mdx @@ -88,6 +88,58 @@ Fields: - `tos_signed_at`: `Optional` - `admin`: `Union` +### UserCredit + +Defined in `nexla_sdk/models/users/credits.py:7` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `grant_type`: `Optional` +- `credits_available`: `Optional` +- `credits`: `Optional` +- `credits_used`: `Optional` +- `credits_monthly`: `Optional` +- `credits_used_in_month`: `Optional` +- `granted_at`: `Optional` +- `refreshed_at`: `Optional` +- `expires_at`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### UserCreditCreate + +Defined in `nexla_sdk/models/users/credits.py:24` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `grant_type`: `Optional` +- `credits`: `Optional` +- `credits_monthly`: `Optional` +- `expires_at`: `Optional` + ### UserExpanded Defined in `nexla_sdk/models/users/responses.py:56` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.validators.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.mdx new file mode 100644 index 0000000..82b045e --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.mdx @@ -0,0 +1,113 @@ +--- +id: nexla_sdk.models.validators +title: nexla_sdk.models.validators +slug: /api/python/modules/nexla_sdk/models/validators +description: API for nexla_sdk.models.validators +keywords: [Nexla, SDK, Python, API] +--- + +Validators models. + +## Classes + +### Validator + +Defined in `nexla_sdk/models/validators/responses.py:22` + +Validator response model. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `resource_type`: `str` +- `code_type`: `Optional` +- `output_type`: `Optional` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `code_error`: `Optional` +- `custom_config`: `Optional` +- `repo_config`: `Optional` +- `reusable`: `bool` +- `public`: `bool` +- `managed`: `bool` +- `ai_function_type`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `data_credentials`: `Optional` +- `runtime_data_credentials`: `Optional` +- `data_sets`: `Optional` +- `tags`: `Optional` +- `referenced_resource_ids`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### ValidatorCopyOptions + +Defined in `nexla_sdk/models/validators/requests.py:52` + +Options for copying a validator. + +Fields: + +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `copy_access_controls`: `Optional` +- `reuse_data_credentials`: `Optional` + +### ValidatorCreate + +Defined in `nexla_sdk/models/validators/requests.py:8` + +Request model for creating a validator. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `code_type`: `str` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `custom_config`: `Optional` +- `resource_type`: `str` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `ai_function_type`: `Optional` + +### ValidatorUpdate + +Defined in `nexla_sdk/models/validators/requests.py:32` + +Request model for updating a validator. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `code_type`: `Optional` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `custom_config`: `Optional` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.validators.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.requests.mdx new file mode 100644 index 0000000..87dd069 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.requests.mdx @@ -0,0 +1,77 @@ +--- +id: nexla_sdk.models.validators.requests +title: nexla_sdk.models.validators.requests +slug: /api/python/modules/nexla_sdk/models/validators/requests +description: API for nexla_sdk.models.validators.requests +keywords: [Nexla, SDK, Python, API] +--- + +Validator request models. + +## Classes + +### ValidatorCopyOptions + +Defined in `nexla_sdk/models/validators/requests.py:52` + +Options for copying a validator. + +Fields: + +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `copy_access_controls`: `Optional` +- `reuse_data_credentials`: `Optional` + +### ValidatorCreate + +Defined in `nexla_sdk/models/validators/requests.py:8` + +Request model for creating a validator. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `code_type`: `str` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `custom_config`: `Optional` +- `resource_type`: `str` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `owner_id`: `Optional` +- `org_id`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` +- `ai_function_type`: `Optional` + +### ValidatorUpdate + +Defined in `nexla_sdk/models/validators/requests.py:32` + +Request model for updating a validator. + +Fields: + +- `name`: `Optional` +- `description`: `Optional` +- `code_type`: `Optional` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `custom_config`: `Optional` +- `output_type`: `Optional` +- `reusable`: `Optional` +- `public`: `Optional` +- `data_credentials_id`: `Optional` +- `runtime_data_credentials_id`: `Optional` +- `tags`: `Optional` +- `repo_type`: `Optional` +- `repo_config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.validators.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.responses.mdx new file mode 100644 index 0000000..ec51aaf --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.validators.responses.mdx @@ -0,0 +1,62 @@ +--- +id: nexla_sdk.models.validators.responses +title: nexla_sdk.models.validators.responses +slug: /api/python/modules/nexla_sdk/models/validators/responses +description: API for nexla_sdk.models.validators.responses +keywords: [Nexla, SDK, Python, API] +--- + +Validator response models. + +## Classes + +### Validator + +Defined in `nexla_sdk/models/validators/responses.py:22` + +Validator response model. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `resource_type`: `str` +- `code_type`: `Optional` +- `output_type`: `Optional` +- `code`: `Optional` +- `code_config`: `Optional` +- `code_encoding`: `Optional` +- `code_error`: `Optional` +- `custom_config`: `Optional` +- `repo_config`: `Optional` +- `reusable`: `bool` +- `public`: `bool` +- `managed`: `bool` +- `ai_function_type`: `Optional` +- `owner`: `Optional` +- `org`: `Optional` +- `access_roles`: `Optional` +- `data_credentials`: `Optional` +- `runtime_data_credentials`: `Optional` +- `data_sets`: `Optional` +- `tags`: `Optional` +- `referenced_resource_ids`: `Optional` +- `copied_from_id`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + +### ValidatorCredential + +Defined in `nexla_sdk/models/validators/responses.py:12` + +Credential reference in validator response. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `description`: `Optional` +- `updated_at`: `Optional` +- `created_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.mdx new file mode 100644 index 0000000..016b359 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.mdx @@ -0,0 +1,76 @@ +--- +id: nexla_sdk.models.vendor_endpoints +title: nexla_sdk.models.vendor_endpoints +slug: /api/python/modules/nexla_sdk/models/vendor_endpoints +description: API for nexla_sdk.models.vendor_endpoints +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### VendorEndpoint + +Defined in `nexla_sdk/models/vendor_endpoints/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### VendorEndpointCreate + +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `vendor_id`: `int` +- `resource_type`: `Optional` +- `config`: `Optional` + +### VendorEndpointUpdate + +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.requests.mdx new file mode 100644 index 0000000..41f3bb0 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.requests.mdx @@ -0,0 +1,51 @@ +--- +id: nexla_sdk.models.vendor_endpoints.requests +title: nexla_sdk.models.vendor_endpoints.requests +slug: /api/python/modules/nexla_sdk/models/vendor_endpoints/requests +description: API for nexla_sdk.models.vendor_endpoints.requests +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### VendorEndpointCreate + +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:6` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `str` +- `vendor_id`: `int` +- `resource_type`: `Optional` +- `config`: `Optional` + +### VendorEndpointUpdate + +Defined in `nexla_sdk/models/vendor_endpoints/requests.py:13` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.responses.mdx new file mode 100644 index 0000000..e6ddab3 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendor_endpoints.responses.mdx @@ -0,0 +1,35 @@ +--- +id: nexla_sdk.models.vendor_endpoints.responses +title: nexla_sdk.models.vendor_endpoints.responses +slug: /api/python/modules/nexla_sdk/models/vendor_endpoints/responses +description: API for nexla_sdk.models.vendor_endpoints.responses +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### VendorEndpoint + +Defined in `nexla_sdk/models/vendor_endpoints/responses.py:8` + +Base model class with Pydantic functionality and Nexla API compatibility. + +Features: +- Automatically ignores unknown fields from API responses +- Supports both camelCase and snake_case field names +- Handles datetime parsing automatically +- Provides JSON serialization methods +- Validates data types automatically +- Easy logging and printing support + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `resource_type`: `Optional` +- `config`: `Optional` +- `vendor`: `Optional` +- `vendor_id`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.mdx new file mode 100644 index 0000000..c037c86 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.mdx @@ -0,0 +1,79 @@ +--- +id: nexla_sdk.models.vendors +title: nexla_sdk.models.vendors +slug: /api/python/modules/nexla_sdk/models/vendors +description: API for nexla_sdk.models.vendors +keywords: [Nexla, SDK, Python, API] +--- + +Vendor models. + +## Classes + +### Vendor + +Defined in `nexla_sdk/models/vendors/responses.py:19` + +Vendor response model. + +Vendors represent third-party service providers that can be +connected via auth templates and endpoints. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connection_type`: `Optional` +- `auth_templates`: `Optional` +- `vendor_endpoints`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### VendorCreate + +Defined in `nexla_sdk/models/vendors/requests.py:8` + +Request model for creating a vendor (super user only). + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connector_id`: `Optional` + +### VendorRef + +Defined in `nexla_sdk/models/vendors/responses.py:11` + +Minimal vendor reference. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` + +### VendorUpdate + +Defined in `nexla_sdk/models/vendors/requests.py:20` + +Request model for updating a vendor (super user only). + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.requests.mdx new file mode 100644 index 0000000..46c5dcf --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.requests.mdx @@ -0,0 +1,43 @@ +--- +id: nexla_sdk.models.vendors.requests +title: nexla_sdk.models.vendors.requests +slug: /api/python/modules/nexla_sdk/models/vendors/requests +description: API for nexla_sdk.models.vendors.requests +keywords: [Nexla, SDK, Python, API] +--- + +Vendor request models. + +## Classes + +### VendorCreate + +Defined in `nexla_sdk/models/vendors/requests.py:8` + +Request model for creating a vendor (super user only). + +Fields: + +- `name`: `str` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connector_id`: `Optional` + +### VendorUpdate + +Defined in `nexla_sdk/models/vendors/requests.py:20` + +Request model for updating a vendor (super user only). + +Fields: + +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.responses.mdx b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.responses.mdx new file mode 100644 index 0000000..895e15c --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.models.vendors.responses.mdx @@ -0,0 +1,48 @@ +--- +id: nexla_sdk.models.vendors.responses +title: nexla_sdk.models.vendors.responses +slug: /api/python/modules/nexla_sdk/models/vendors/responses +description: API for nexla_sdk.models.vendors.responses +keywords: [Nexla, SDK, Python, API] +--- + +Vendor response models. + +## Classes + +### Vendor + +Defined in `nexla_sdk/models/vendors/responses.py:19` + +Vendor response model. + +Vendors represent third-party service providers that can be +connected via auth templates and endpoints. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` +- `description`: `Optional` +- `config`: `Optional` +- `small_logo`: `Optional` +- `logo`: `Optional` +- `connection_type`: `Optional` +- `auth_templates`: `Optional` +- `vendor_endpoints`: `Optional` +- `created_at`: `Optional` +- `updated_at`: `Optional` + +### VendorRef + +Defined in `nexla_sdk/models/vendors/responses.py:11` + +Minimal vendor reference. + +Fields: + +- `id`: `int` +- `name`: `Optional` +- `display_name`: `Optional` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.raw_operations.mdx b/docs-site/docs/api/python/modules/nexla_sdk.raw_operations.mdx new file mode 100644 index 0000000..de2d6a5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.raw_operations.mdx @@ -0,0 +1,53 @@ +--- +id: nexla_sdk.raw_operations +title: nexla_sdk.raw_operations +slug: /api/python/modules/nexla_sdk/raw_operations +description: API for nexla_sdk.raw_operations +keywords: [Nexla, SDK, Python, API] +--- + +Typed operation-level access for the full OpenAPI surface. + +## Classes + +### OperationDefinition + +Defined in `nexla_sdk/raw_operations.py:19` + +Normalized operation metadata. + +### RawOperationsClient + +Defined in `nexla_sdk/raw_operations.py:31` + +Low-level typed access to any OpenAPI operation. + +Methods: + +- `call(self, operation_id: 'Union[OperationId, str]', *, path_params: 'Optional[Mapping[str, Any]]' = None, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:63` + - Call an operation by operation id. +- `delete(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:155` +- `get(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:107` +- `get_operation(self, operation_id: 'Union[OperationId, str]') -> 'OperationDefinition'` + - Source: `nexla_sdk/raw_operations.py:41` + - Get metadata for a specific operation id. +- `head(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:189` +- `list_operations(self) -> 'List[str]'` + - Source: `nexla_sdk/raw_operations.py:37` + - Return sorted operation ids available in this SDK build. +- `options(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:203` +- `patch(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:172` +- `post(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:121` +- `put(self, path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:138` +- `request(self, method: 'str', path: 'str', *, query: 'Optional[Mapping[str, Any]]' = None, body: 'Any' = None, headers: 'Optional[Mapping[str, str]]' = None) -> 'Any'` + - Source: `nexla_sdk/raw_operations.py:88` + - Send an arbitrary request to support non-spec or backend-only endpoints. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.api_keys.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.api_keys.mdx new file mode 100644 index 0000000..ab82d31 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.api_keys.mdx @@ -0,0 +1,70 @@ +--- +id: nexla_sdk.resources.api_keys +title: nexla_sdk.resources.api_keys +slug: /api/python/modules/nexla_sdk/resources/api_keys +description: API for nexla_sdk.resources.api_keys +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing API keys (read-only). + +## Classes + +### ApiKeysResource + +Defined in `nexla_sdk/resources/api_keys.py:9` + +Resource for API keys (read-only access). + +API keys provide programmatic access to specific resources like +datasets, data sources, data sinks, and users. + +Note: + This resource only supports ``list()``, ``list_grouped()``, + ``get()``, and ``search()``. Write operations inherited from + ``BaseResource`` (e.g. ``create``, ``update``, ``delete``) are + not supported by the backend and will raise ``NotImplementedError``. + +Examples: + # List all API keys (grouped by type) + all_keys = client.api_keys.list_grouped() + + # Get a specific API key + key = client.api_keys.get(123) + + # Search API keys + keys = client.api_keys.search(\{"scope": "read"\}) + +Methods: + +- `activate(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:149` + - Activate resource. +- `copy(self, resource_id=None, options=None)` + - Source: `nexla_sdk/resources/api_keys.py:146` + - Copy resource. +- `create(self, data=None)` + - Source: `nexla_sdk/resources/api_keys.py:137` + - Create new resource. +- `delete(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:143` + - Delete resource. +- `get(self, api_key_id: Union[int, str]) -> nexla_sdk.models.api_keys.responses.ApiKey` + - Source: `nexla_sdk/resources/api_keys.py:99` + - Get API key by ID or key value. +- `list(self, access_role: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.api_keys.responses.ApiKey]` + - Source: `nexla_sdk/resources/api_keys.py:47` + - List API keys. +- `list_grouped(self, page: Optional[int] = None, per_page: Optional[int] = None) -> nexla_sdk.models.api_keys.responses.ApiKeysIndex` + - Source: `nexla_sdk/resources/api_keys.py:74` + - List API keys grouped by resource type. +- `pause(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:152` + - Pause resource. +- `search(self, filters: Dict[str, Any], page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.api_keys.responses.ApiKey]` + - Source: `nexla_sdk/resources/api_keys.py:112` + - Search API keys with filters. +- `update(self, resource_id=None, data=None)` + - Source: `nexla_sdk/resources/api_keys.py:140` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.approval_requests.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.approval_requests.mdx index aebacdc..bf1cb1f 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.approval_requests.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.approval_requests.mdx @@ -17,11 +17,28 @@ Resource for managing approval requests. Methods: - `approve(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:25` + - Source: `nexla_sdk/resources/approval_requests.py:60` +- `cancel(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:71` +- `get(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:50` + - Get single resource by ID. +- `list_access_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:35` +- `list_access_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:30` +- `list_assigned(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:20` +- `list_listings_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:45` +- `list_listings_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:40` - `list_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - Source: `nexla_sdk/resources/approval_requests.py:15` - `list_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - - Source: `nexla_sdk/resources/approval_requests.py:20` + - Source: `nexla_sdk/resources/approval_requests.py:25` - `reject(self, request_id: int, reason: str = '') -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:30` + - Source: `nexla_sdk/resources/approval_requests.py:65` +- `show_data_set(self, data_set_id: int) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:55` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.async_tasks.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.async_tasks.mdx index 4893f6f..701ca3f 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.async_tasks.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.async_tasks.mdx @@ -31,12 +31,12 @@ Methods: - `get(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:45` - Get single resource by ID. -- `list(self) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `list(self, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:16` - List asynchronous tasks. - `list_by_status(self, status: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:32` -- `list_of_type(self, task_type: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `list_of_type(self, task_type: str, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:27` - `rerun(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:54` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.attribute_transforms.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.attribute_transforms.mdx index aae13d2..6502b9d 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.attribute_transforms.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.attribute_transforms.mdx @@ -16,6 +16,9 @@ Resource for reusable attribute transforms (aliased to code containers). Methods: +- `copy(self, attribute_transform_id: int) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` + - Source: `nexla_sdk/resources/attribute_transforms.py:63` + - Copy an attribute transform. - `create(self, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformCreate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:43` - Create a new attribute transform. @@ -31,6 +34,12 @@ Methods: - `list_public(self) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` - Source: `nexla_sdk/resources/attribute_transforms.py:57` - List publicly shared attribute transforms. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:67` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:70` + - Search resources by tags. - `update(self, attribute_transform_id: int, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformUpdate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:47` - Update an attribute transform by ID. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_parameters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_parameters.mdx new file mode 100644 index 0000000..df616f5 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_parameters.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.resources.auth_parameters +title: nexla_sdk.resources.auth_parameters +slug: /api/python/modules/nexla_sdk/resources/auth_parameters +description: API for nexla_sdk.resources.auth_parameters +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### AuthParametersResource + +Defined in `nexla_sdk/resources/auth_parameters.py:11` + +Resource for managing auth parameters. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.auth_parameters.requests.AuthParameterCreate, Dict[str, Any]]) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:25` + - Create new resource. +- `delete(self, auth_parameter_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_parameters.py:35` + - Delete resource. +- `get(self, auth_parameter_id: int) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:22` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.auth_parameters.responses.AuthParameter]` + - Source: `nexla_sdk/resources/auth_parameters.py:19` + - List resources with optional filters. +- `update(self, auth_parameter_id: int, data: Union[nexla_sdk.models.auth_parameters.requests.AuthParameterUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:28` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_templates.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_templates.mdx new file mode 100644 index 0000000..688a27d --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.auth_templates.mdx @@ -0,0 +1,79 @@ +--- +id: nexla_sdk.resources.auth_templates +title: nexla_sdk.resources.auth_templates +slug: /api/python/modules/nexla_sdk/resources/auth_templates +description: API for nexla_sdk.resources.auth_templates +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing auth templates. + +## Classes + +### AuthTemplatesResource + +Defined in `nexla_sdk/resources/auth_templates.py:13` + +Resource for managing auth templates. + +Auth templates define authentication configurations for vendors. +Write operations (create, update, delete) require super user access. + +Examples: + # List all auth templates + templates = client.auth_templates.list() + + # Get an auth template by ID + template = client.auth_templates.get(123) + + # Get an auth template by name + template = client.auth_templates.get_by_name("oauth2_standard") + + # Create an auth template (super user only) + template = client.auth_templates.create(AuthTemplateCreate( + name="new_template", + vendor_id=456, + display_name="New Auth Template" + )) + + # Update an auth template (super user only) + template = client.auth_templates.update(123, AuthTemplateUpdate( + description="Updated description" + )) + + # Delete an auth template (super user only) + client.auth_templates.delete(123) + +Methods: + +- `create(self, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateCreate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:101` + - Create a new auth template (super user only). +- `delete(self, auth_template_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:145` + - Delete an auth template (super user only). +- `delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:172` + - Delete auth templates via collection endpoint. +- `delete_by_name(self, auth_template_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:156` + - Delete an auth template by name (super user only). +- `get(self, auth_template_id: int, expand: bool = False) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:76` + - Get auth template by ID. +- `get_by_name(self, auth_template_name: str) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:88` + - Get auth template by name. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.auth_templates.responses.AuthTemplate]` + - Source: `nexla_sdk/resources/auth_templates.py:55` + - List auth templates. +- `update(self, auth_template_id: int, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:112` + - Update an auth template (super user only). +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:168` + - Update auth templates via collection endpoint. +- `update_by_name(self, auth_template_name: str, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:126` + - Update an auth template by name (super user only). + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.base_resource.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.base_resource.mdx index c04f36f..efa56ea 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.base_resource.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.base_resource.mdx @@ -20,8 +20,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -32,29 +38,71 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.catalog_configs.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.catalog_configs.mdx new file mode 100644 index 0000000..a5c2c15 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.catalog_configs.mdx @@ -0,0 +1,42 @@ +--- +id: nexla_sdk.resources.catalog_configs +title: nexla_sdk.resources.catalog_configs +slug: /api/python/modules/nexla_sdk/resources/catalog_configs +description: API for nexla_sdk.resources.catalog_configs +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CatalogConfigsResource + +Defined in `nexla_sdk/resources/catalog_configs.py:11` + +Resource for managing catalog configs. + +Methods: + +- `check_job_status(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:43` +- `create(self, data: Union[nexla_sdk.models.catalog_configs.requests.CatalogConfigCreate, Dict[str, Any]]) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:29` + - Create new resource. +- `delete(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:37` + - Delete resource. +- `get(self, catalog_config_id: int) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:26` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.catalog_configs.responses.CatalogConfig]` + - Source: `nexla_sdk/resources/catalog_configs.py:19` + - List resources with optional filters. +- `list_all(self, **params) -> List[nexla_sdk.models.catalog_configs.responses.CatalogConfig]` + - Source: `nexla_sdk/resources/catalog_configs.py:22` +- `mock_catalog_add(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:40` +- `start_bulk_create_update(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:47` +- `update(self, catalog_config_id: int, data: Union[nexla_sdk.models.catalog_configs.requests.CatalogConfigUpdate, Dict[str, Any]]) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:32` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.cluster_endpoints.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.cluster_endpoints.mdx new file mode 100644 index 0000000..9bb5d20 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.cluster_endpoints.mdx @@ -0,0 +1,63 @@ +--- +id: nexla_sdk.resources.cluster_endpoints +title: nexla_sdk.resources.cluster_endpoints +slug: /api/python/modules/nexla_sdk/resources/cluster_endpoints +description: API for nexla_sdk.resources.cluster_endpoints +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing cluster endpoints. + +## Classes + +### ClusterEndpointsResource + +Defined in `nexla_sdk/resources/cluster_endpoints.py:13` + +Resource for managing cluster endpoints. + +Cluster endpoints define individual service connections within a cluster. +Most operations require super user access. + +Examples: + # List cluster endpoints + endpoints = client.cluster_endpoints.list() + + # Get a specific endpoint + endpoint = client.cluster_endpoints.get(123) + + # Create an endpoint + endpoint = client.cluster_endpoints.create(ClusterEndpointCreate( + cluster_id=456, + service="data_ingestion", + protocol="https", + host="ingestion.example.com", + port=443 + )) + + # Update an endpoint + endpoint = client.cluster_endpoints.update(123, ClusterEndpointUpdate( + host="new-ingestion.example.com" + )) + + # Get audit log + audit_log = client.cluster_endpoints.get_audit_log(123) + +Methods: + +- `create(self, data: Union[nexla_sdk.models.clusters.requests.ClusterEndpointCreate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:84` + - Create a new cluster endpoint. +- `get(self, endpoint_id: int) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:71` + - Get cluster endpoint by ID. +- `get_audit_log(self, endpoint_id: int, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/cluster_endpoints.py:116` + - Get audit log for a cluster endpoint. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.clusters.responses.ClusterEndpoint]` + - Source: `nexla_sdk/resources/cluster_endpoints.py:54` + - List cluster endpoints. +- `update(self, endpoint_id: int, data: Union[nexla_sdk.models.clusters.requests.ClusterEndpointUpdate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:99` + - Update a cluster endpoint. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.clusters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.clusters.mdx new file mode 100644 index 0000000..fcc091b --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.clusters.mdx @@ -0,0 +1,69 @@ +--- +id: nexla_sdk.resources.clusters +title: nexla_sdk.resources.clusters +slug: /api/python/modules/nexla_sdk/resources/clusters +description: API for nexla_sdk.resources.clusters +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing clusters. + +## Classes + +### ClustersResource + +Defined in `nexla_sdk/resources/clusters.py:10` + +Resource for managing clusters. + +Clusters define infrastructure endpoints for processing data flows. +This resource requires super user access for most operations. + +Examples: + # List clusters + clusters = client.clusters.list() + + # Get a specific cluster + cluster = client.clusters.get(123) + + # Create a cluster + cluster = client.clusters.create(ClusterCreate( + org_id=1, + name="Production Cluster", + region="us-west-2", + provider="aws" + )) + + # Activate a cluster + client.clusters.activate(cluster.id) + + # Set as default cluster + client.clusters.set_default(cluster.id) + +Methods: + +- `activate(self, cluster_id: int) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:117` + - Activate a cluster. +- `create(self, data: Union[nexla_sdk.models.clusters.requests.ClusterCreate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:81` + - Create a new cluster. +- `delete(self, cluster_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/clusters.py:106` + - Delete a cluster. +- `delete_endpoint(self, cluster_id: int, endpoint_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/clusters.py:144` + - Delete an endpoint from a cluster. +- `get(self, cluster_id: int, expand: bool = False) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:69` + - Get cluster by ID. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.clusters.responses.Cluster]` + - Source: `nexla_sdk/resources/clusters.py:48` + - List clusters. +- `set_default(self, cluster_id: int) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:128` + - Set a cluster as the default. +- `update(self, cluster_id: int, data: Union[nexla_sdk.models.clusters.requests.ClusterUpdate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:92` + - Update a cluster. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.code_containers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.code_containers.mdx index a678fcc..8b02fa3 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.code_containers.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.code_containers.mdx @@ -25,15 +25,28 @@ Methods: - `delete(self, code_container_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/code_containers.py:63` - Delete a code container by ID. +- `error_functions(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:84` - `get(self, code_container_id: int, expand: bool = False) -> nexla_sdk.models.code_containers.responses.CodeContainer` - Source: `nexla_sdk/resources/code_containers.py:37` - Get a code container by ID. - `list(self, **kwargs) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - Source: `nexla_sdk/resources/code_containers.py:19` - List code containers with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:77` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - Source: `nexla_sdk/resources/code_containers.py:71` - List publicly shared code containers. +- `repo(self, code_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:80` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:87` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:90` + - Search resources by tags. - `update(self, code_container_id: int, data: nexla_sdk.models.code_containers.requests.CodeContainerUpdate) -> nexla_sdk.models.code_containers.responses.CodeContainer` - Source: `nexla_sdk/resources/code_containers.py:53` - Update an existing code container. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.connectors.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.connectors.mdx new file mode 100644 index 0000000..c3b80a1 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.connectors.mdx @@ -0,0 +1,75 @@ +--- +id: nexla_sdk.resources.connectors +title: nexla_sdk.resources.connectors +slug: /api/python/modules/nexla_sdk/resources/connectors +description: API for nexla_sdk.resources.connectors +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing connectors. + +## Classes + +### ConnectorsResource + +Defined in `nexla_sdk/resources/connectors.py:10` + +Resource for managing connectors. + +Connectors define connection types for data sources and destinations. +The backend only supports list, get, and update operations. + +Read access requires Nexla admin org membership. +Update operations require super user access. + +Note: + This resource only supports ``list()``, ``get()``, and ``update()``. + Other write operations inherited from ``BaseResource`` (e.g. + ``create``, ``delete``, ``copy``) are not supported by the backend + and will raise ``NotImplementedError``. + +Examples: + # List all connectors + connectors = client.connectors.list() + + # Filter by API compatibility + nexset_connectors = client.connectors.list(nexset_api_compatible=True) + + # Get a specific connector by ID + connector = client.connectors.get(123) + + # Get a connector by type + connector = client.connectors.get("s3") + + # Update a connector (super user only) + connector = client.connectors.update(123, ConnectorUpdate( + description="Updated description" + )) + +Methods: + +- `activate(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:135` + - Activate resource. +- `copy(self, resource_id=None, options=None)` + - Source: `nexla_sdk/resources/connectors.py:132` + - Copy resource. +- `create(self, data=None)` + - Source: `nexla_sdk/resources/connectors.py:126` + - Create new resource. +- `delete(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:129` + - Delete resource. +- `get(self, connector_id: Union[int, str]) -> nexla_sdk.models.connectors.responses.Connector` + - Source: `nexla_sdk/resources/connectors.py:94` + - Get connector by ID or type. +- `list(self, access_role: Optional[str] = None, nexset_api_compatible: Optional[bool] = None, sync_api_compatible: Optional[bool] = None, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.connectors.responses.Connector]` + - Source: `nexla_sdk/resources/connectors.py:59` + - List connectors. +- `pause(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:138` + - Pause resource. +- `update(self, connector_id: Union[int, str], data: Union[nexla_sdk.models.connectors.requests.ConnectorUpdate, Dict[str, Any]]) -> nexla_sdk.models.connectors.responses.Connector` + - Source: `nexla_sdk/resources/connectors.py:107` + - Update a connector (super user only). + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.credentials.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.credentials.mdx index 4a2c7b1..4570bdc 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.credentials.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.credentials.mdx @@ -19,27 +19,72 @@ Resource for managing data credentials. Methods: - `create(self, data: nexla_sdk.models.credentials.requests.CredentialCreate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:75` + - Source: `nexla_sdk/resources/credentials.py:103` - Create new credential. +- `credentials_schema(self, source_type: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:71` +- `db_data_types(self, source_type: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:77` - `delete(self, credential_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:105` + - Source: `nexla_sdk/resources/credentials.py:133` - Delete credential. - `get(self, credential_id: int, expand: bool = False) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:59` + - Source: `nexla_sdk/resources/credentials.py:87` - Get single credential by ID. +- `intent(self, credential_id: int, payload: Dict[str, Any], method: str = 'PUT') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:297` - `list(self, credentials_type: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.credentials.responses.Credential]` - Source: `nexla_sdk/resources/credentials.py:27` - List credentials with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:68` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:59` + - List all credentials (admin only). +- `list_public(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:64` + - List publicly available resources for this type. +- `migrate_iceberg(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:303` - `probe(self, credential_id: int, async_mode: bool = False, request_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:117` + - Source: `nexla_sdk/resources/credentials.py:145` - Test credential validity. -- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` +- `probe_detect_schemas(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:209` +- `probe_file_download(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:221` +- `probe_list_buckets(self, credential_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/credentials.py:183` +- `probe_list_files(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:191` +- `probe_read_file(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:203` +- `probe_read_sample(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:215` +- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` + - Source: `nexla_sdk/resources/credentials.py:261` - Preview data content accessible by credential. +- `probe_search_path(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:227` +- `probe_summary(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:187` - `probe_tree(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeTreeRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeTreeResponse` - - Source: `nexla_sdk/resources/credentials.py:155` + - Source: `nexla_sdk/resources/credentials.py:233` - Preview storage structure accessible by credential. +- `probe_tree_request(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:197` +- `refresh(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:289` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:81` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:84` + - Search resources by tags. - `update(self, credential_id: int, data: nexla_sdk.models.credentials.requests.CredentialUpdate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:92` + - Source: `nexla_sdk/resources/credentials.py:120` - Update credential. +- `usage(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:293` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.cubejs.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.cubejs.mdx new file mode 100644 index 0000000..ee4db0f --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.cubejs.mdx @@ -0,0 +1,21 @@ +--- +id: nexla_sdk.resources.cubejs +title: nexla_sdk.resources.cubejs +slug: /api/python/modules/nexla_sdk/resources/cubejs +description: API for nexla_sdk.resources.cubejs +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CubeJsResource + +Defined in `nexla_sdk/resources/cubejs.py:6` + +Resource for Cube.js query endpoint. + +Methods: + +- `query(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/cubejs.py:14` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.custom_data_flows.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.custom_data_flows.mdx new file mode 100644 index 0000000..2956f06 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.custom_data_flows.mdx @@ -0,0 +1,55 @@ +--- +id: nexla_sdk.resources.custom_data_flows +title: nexla_sdk.resources.custom_data_flows +slug: /api/python/modules/nexla_sdk/resources/custom_data_flows +description: API for nexla_sdk.resources.custom_data_flows +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### CustomDataFlowsResource + +Defined in `nexla_sdk/resources/custom_data_flows.py:11` + +Resource for managing custom data flows. + +Methods: + +- `activate(self, custom_data_flow_id: int, activate: bool = True) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:48` + - Activate resource. +- `copy(self, custom_data_flow_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:43` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.custom_data_flows.requests.CustomDataFlowCreate, Dict[str, Any]]) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:28` + - Create new resource. +- `delete(self, custom_data_flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:40` + - Delete resource. +- `edit_code_containers(self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:60` +- `edit_data_credentials(self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:68` +- `get(self, custom_data_flow_id: int, expand: bool = False) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:25` + - Get single resource by ID. +- `get_metrics(self, custom_data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:56` +- `list(self, **kwargs) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:22` + - List resources accessible to the current user (access_insights). +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:76` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:79` + - Search resources by tags. +- `update(self, custom_data_flow_id: int, data: Union[nexla_sdk.models.custom_data_flows.requests.CustomDataFlowUpdate, Dict[str, Any]]) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:33` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.dashboard_transforms.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.dashboard_transforms.mdx new file mode 100644 index 0000000..d138217 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.dashboard_transforms.mdx @@ -0,0 +1,36 @@ +--- +id: nexla_sdk.resources.dashboard_transforms +title: nexla_sdk.resources.dashboard_transforms +slug: /api/python/modules/nexla_sdk/resources/dashboard_transforms +description: API for nexla_sdk.resources.dashboard_transforms +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DashboardTransformsResource + +Defined in `nexla_sdk/resources/dashboard_transforms.py:11` + +Resource for dashboard transforms (global endpoints). + +Methods: + +- `create(self, data: Union[nexla_sdk.models.dashboard_transforms.requests.DashboardTransformCreate, Dict[str, Any]]) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:29` + - Create new resource. +- `delete(self, dashboard_transform_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:41` + - Delete resource. +- `get(self, dashboard_transform_id: int) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:26` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.dashboard_transforms.responses.DashboardTransform]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:19` + - List resources with optional filters. +- `list_all(self, **params) -> List[nexla_sdk.models.dashboard_transforms.responses.DashboardTransform]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:22` +- `update(self, dashboard_transform_id: int, data: Union[nexla_sdk.models.dashboard_transforms.requests.DashboardTransformUpdate, Dict[str, Any]]) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:34` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.data_credentials_groups.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_credentials_groups.mdx new file mode 100644 index 0000000..baca548 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_credentials_groups.mdx @@ -0,0 +1,38 @@ +--- +id: nexla_sdk.resources.data_credentials_groups +title: nexla_sdk.resources.data_credentials_groups +slug: /api/python/modules/nexla_sdk/resources/data_credentials_groups +description: API for nexla_sdk.resources.data_credentials_groups +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DataCredentialsGroupsResource + +Defined in `nexla_sdk/resources/data_credentials_groups.py:13` + +Resource for managing data credentials groups. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupCreate, Dict[str, Any]]) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:27` + - Create new resource. +- `delete(self, group_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:39` + - Delete resource. +- `get(self, group_id: int, expand: bool = False) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:24` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:21` + - List resources with optional filters. +- `list_credentials(self, group_id: int, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:42` +- `remove_credentials(self, group_id: int, payload: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupRemoveCredentials, Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:47` +- `update(self, group_id: int, data: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupUpdate, Dict[str, Any]]) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:32` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.data_flows.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_flows.mdx new file mode 100644 index 0000000..097ddd2 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_flows.mdx @@ -0,0 +1,49 @@ +--- +id: nexla_sdk.resources.data_flows +title: nexla_sdk.resources.data_flows +slug: /api/python/modules/nexla_sdk/resources/data_flows +description: API for nexla_sdk.resources.data_flows +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### DataFlowsResource + +Defined in `nexla_sdk/resources/data_flows.py:6` + +Resource for legacy data_flows endpoints. + +Methods: + +- `create(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:22` + - Create new resource. +- `create_data_sink_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:48` +- `create_data_source_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:38` +- `get(self, data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:18` + - Get single resource by ID. +- `get_audit_log(self, data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:25` + - Get audit log for resource. +- `get_data_sink_audit_log(self, data_sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:59` +- `get_data_sink_flow(self, data_sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:44` +- `get_data_source_audit_log(self, data_source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:54` +- `get_data_source_flow(self, data_source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:34` +- `get_flow_audit_log(self, flow_node_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:51` +- `list(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:14` + - List resources with optional filters. +- `list_data_sink_flows(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:41` +- `list_data_source_flows(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:29` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.data_schemas.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_schemas.mdx index 80a325e..3dd8f3e 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.data_schemas.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.data_schemas.mdx @@ -10,13 +10,47 @@ keywords: [Nexla, SDK, Python, API] ### DataSchemasResource -Defined in `nexla_sdk/resources/data_schemas.py:7` +Defined in `nexla_sdk/resources/data_schemas.py:8` -Resource for data schemas (accessors + audit log only). +Resource for data schemas. Methods: +- `copy(self, schema_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:56` + - Copy resource. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:33` + - Create new resource. +- `delete(self, schema_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:39` + - Delete resource. +- `get(self, schema_id: int, expand: bool = False) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:30` + - Get single resource by ID. - `get_audit_log(self, schema_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/data_schemas.py:15` + - Source: `nexla_sdk/resources/data_schemas.py:61` - Get audit log for resource. +- `get_metrics(self, schema_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:42` +- `list(self, **kwargs) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:16` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:27` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:19` +- `list_public(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:23` + - List publicly available resources for this type. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:50` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:53` + - Search resources by tags. +- `update(self, schema_id: int, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:36` + - Update resource. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.destinations.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.destinations.mdx index ce582ca..3ab67c9 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.destinations.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.destinations.mdx @@ -17,27 +17,132 @@ Resource for managing destinations (data sinks). Methods: - `activate(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:94` + - Source: `nexla_sdk/resources/destinations.py:173` - Activate destination. +- `activate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:354` - `copy(self, sink_id: int, options: Optional[nexla_sdk.models.destinations.requests.DestinationCopyOptions] = None) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:118` + - Source: `nexla_sdk/resources/destinations.py:197` - Copy a destination. - `create(self, data: nexla_sdk.models.destinations.requests.DestinationCreate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:54` + - Source: `nexla_sdk/resources/destinations.py:86` - Create new destination. +- `create_api_key(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:340` +- `create_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:273` +- `create_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:253` - `delete(self, sink_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/destinations.py:82` + - Source: `nexla_sdk/resources/destinations.py:114` - Delete destination. +- `delete_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:366` +- `delete_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:285` +- `delete_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:265` +- `edit_flow_triggers(self, sink_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:309` - `get(self, sink_id: int, expand: bool = False) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:38` + - Source: `nexla_sdk/resources/destinations.py:70` - Get single destination by ID. +- `get_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:336` +- `get_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:269` +- `get_flow(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:126` +- `get_flow_dashboard(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:129` +- `get_flow_logs(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:144` +- `get_flow_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:139` +- `get_flow_status_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:134` +- `get_metrics(self, sink_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:149` +- `get_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:165` +- `get_quarantine_aggregation(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:376` +- `get_quarantine_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:157` +- `get_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:249` - `list(self, **kwargs) -> List[nexla_sdk.models.destinations.responses.Destination]` - Source: `nexla_sdk/resources/destinations.py:20` - List destinations with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:60` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:44` +- `list_all_by_data_set(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:54` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:48` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/destinations.py:51` +- `list_api_keys(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:326` +- `list_flow_triggers(self, sink_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:305` - `pause(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:106` + - Source: `nexla_sdk/resources/destinations.py:185` - Pause destination. +- `pause_all_api_keys(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:362` +- `pause_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:358` +- `probe_authenticate(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:221` +- `probe_detect_schemas(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:237` +- `probe_list_buckets(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:213` +- `probe_list_files(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:225` +- `probe_quarantine_sample(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:243` +- `probe_read_file(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:233` +- `probe_summary(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:217` +- `probe_tree(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:229` +- `rotate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:350` +- `run_analysis(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:301` +- `run_status(self, sink_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:295` +- `script_sink_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:63` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:38` + - Search resources using filter criteria. +- `search_api_keys(self, sink_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:330` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:41` + - Search resources by tags. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:292` +- `trigger_quarantine_aggregation(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:370` - `update(self, sink_id: int, data: nexla_sdk.models.destinations.requests.DestinationUpdate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:69` + - Source: `nexla_sdk/resources/destinations.py:101` - Update destination. +- `update_api_key(self, sink_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:344` +- `update_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:279` +- `update_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:259` +- `update_runtime_status(self, sink_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:66` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:289` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.doc_containers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.doc_containers.mdx index 3f4b45e..fd2f574 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.doc_containers.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.doc_containers.mdx @@ -10,13 +10,37 @@ keywords: [Nexla, SDK, Python, API] ### DocContainersResource -Defined in `nexla_sdk/resources/doc_containers.py:7` +Defined in `nexla_sdk/resources/doc_containers.py:8` -Resource for document containers accessors and audit logs. +Resource for document containers. Methods: +- `copy(self, doc_container_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:31` + - Copy resource. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:22` + - Create new resource. +- `delete(self, doc_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/doc_containers.py:28` + - Delete resource. +- `get(self, doc_container_id: int, expand: bool = False) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:19` + - Get single resource by ID. - `get_audit_log(self, doc_container_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/doc_containers.py:15` + - Source: `nexla_sdk/resources/doc_containers.py:42` - Get audit log for resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:16` + - List resources with optional filters. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:36` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:39` + - Search resources by tags. +- `update(self, doc_container_id: int, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:25` + - Update resource. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_nodes.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_nodes.mdx new file mode 100644 index 0000000..cac7015 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_nodes.mdx @@ -0,0 +1,32 @@ +--- +id: nexla_sdk.resources.flow_nodes +title: nexla_sdk.resources.flow_nodes +slug: /api/python/modules/nexla_sdk/resources/flow_nodes +description: API for nexla_sdk.resources.flow_nodes +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### FlowNodesResource + +Defined in `nexla_sdk/resources/flow_nodes.py:7` + +Resource for flow nodes. + +Methods: + +- `get(self, flow_node_id: int) -> nexla_sdk.models.common.FlowNode` + - Source: `nexla_sdk/resources/flow_nodes.py:15` + - Get single resource by ID. +- `get_access_insights(self, flow_node_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:27` + - Explain why the current user can access a resource. +- `list_flows_minimal(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:24` +- `list_origin_nodes_condensed(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:21` +- `update(self, flow_node_id: int, data: Dict[str, Any]) -> nexla_sdk.models.common.FlowNode` + - Source: `nexla_sdk/resources/flow_nodes.py:18` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_triggers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_triggers.mdx new file mode 100644 index 0000000..779d115 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.flow_triggers.mdx @@ -0,0 +1,73 @@ +--- +id: nexla_sdk.resources.flow_triggers +title: nexla_sdk.resources.flow_triggers +slug: /api/python/modules/nexla_sdk/resources/flow_triggers +description: API for nexla_sdk.resources.flow_triggers +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing flow triggers. + +## Classes + +### FlowTriggersResource + +Defined in `nexla_sdk/resources/flow_triggers.py:10` + +Resource for managing flow triggers (orchestration events). + +Flow triggers define when one flow should trigger based on events +from another flow. They are immutable once created - to change a +trigger, delete and recreate it. + +Examples: + # List flow triggers + triggers = client.flow_triggers.list() + + # List all triggers (super user only) + all_triggers = client.flow_triggers.list_all() + + # Create a trigger: start data source when sink completes + trigger = client.flow_triggers.create(FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + data_sink_id=123, # Triggering sink + data_source_id=456 # Triggered source + )) + + # Pause a trigger + client.flow_triggers.pause(trigger.id) + + # Activate a trigger + client.flow_triggers.activate(trigger.id) + + # Delete a trigger + client.flow_triggers.delete(trigger.id) + +Methods: + +- `activate(self, trigger_id: int) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:139` + - Activate a flow trigger. +- `create(self, data: Union[nexla_sdk.models.flow_triggers.requests.FlowTriggerCreate, Dict[str, Any]]) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:111` + - Create a new flow trigger. +- `delete(self, trigger_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_triggers.py:128` + - Delete a flow trigger. +- `get(self, trigger_id: int, expand: bool = False) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:99` + - Get flow trigger by ID. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.flow_triggers.responses.FlowTrigger]` + - Source: `nexla_sdk/resources/flow_triggers.py:52` + - List flow triggers accessible by current user. +- `list_all(self, page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.flow_triggers.responses.FlowTrigger]` + - Source: `nexla_sdk/resources/flow_triggers.py:73` + - List all flow triggers (super user only). +- `pause(self, trigger_id: int) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:150` + - Pause a flow trigger. +- `update(self, resource_id=None, data=None)` + - Source: `nexla_sdk/resources/flow_triggers.py:161` + - Flow triggers are immutable. To change a trigger, delete and recreate it. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.flows.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.flows.mdx index 3f36fc8..7d5b764 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.flows.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.flows.mdx @@ -16,58 +16,119 @@ Resource for managing data flows. Methods: +- `accessors_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:395` - `activate(self, flow_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:117` - Activate a flow. - `activate_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:314` - Activate flow by resource ID. +- `active_flows_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:527` +- `bulk_assign_project(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:512` - `copy(self, flow_id: int, options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:171` - Copy a flow. - `copy_and_replace_credentials(self, flow_id: int, resource_credential_mapping: Dict[int, int], copy_options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None, target_project_id: Optional[int] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:186` - Copy a flow and replace credentials on specified resources. +- `copy_by_resource(self, resource_type: str, resource_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:385` +- `create_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:453` +- `daily_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:521` - `delete(self, flow_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:282` - Delete flow. +- `delete_all_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:471` - `delete_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:294` - Delete flow by resource ID. +- `delete_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:465` +- `docs_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:407` - `docs_recommendation(self, flow_id: int) -> Union[nexla_sdk.models.flows.responses.DocsRecommendation, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:378` + - Source: `nexla_sdk/resources/flows.py:535` - Generate AI suggestion for flow documentation. +- `flow_logs(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:435` +- `flow_logs_v2(self, flow_id: int, payload: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:439` +- `flow_metrics(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:445` - `get(self, flow_id: int, flows_only: bool = False, include_run_metrics: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:67` - Get flow by ID. - `get_active_flows_metrics(self, from_date: str = None, to_date: str = None, org_id: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:475` + - Source: `nexla_sdk/resources/flows.py:632` - Get metrics for currently active flows. - `get_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, flows_only: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:90` - Get flow by resource ID. - `get_flow_logs(self, flow_id: int, from_date: str = None, to_date: str = None, severity: str = None, run_id: int = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:397` + - Source: `nexla_sdk/resources/flows.py:554` - Get execution logs for a specific flow. -- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:529` +- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:686` - Get flow execution logs for a specific run id of a flow. -- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:581` +- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:738` - Get flow metrics for a flow node keyed by resource id. +- `get_resources_access(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:532` - `get_run_status(self, flow_id: int, run_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:499` + - Source: `nexla_sdk/resources/flows.py:656` - Get status of a specific flow run. +- `import_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:515` +- `insert_flow_node(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:475` - `list(self, flows_only: bool = False, include_run_metrics: bool = False, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.flows.responses.FlowResponse]` - Source: `nexla_sdk/resources/flows.py:29` - List flows with optional filters. +- `list_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:449` - `pause(self, flow_id: int, all: bool = False, full_tree: bool = False, async_mode: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:140` - Pause a flow. - `pause_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:346` - Pause flow by resource ID. +- `publish_rag(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:489` +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:518` +- `remove_flow_node(self, flow_id: int, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:479` +- `restore_archival(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:499` +- `run_now(self, flow_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:431` +- `run_profiles_activate(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:425` +- `run_status(self, flow_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:503` +- `run_status_by_resource(self, resource_type: str, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:419` +- `search(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:509` + - Search resources using filter criteria. - `search_flow_logs(self, flow_id: int, run_ids: str = None, severity: str = None, search_string: str = None, from_date: str = None, to_date: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:438` + - Source: `nexla_sdk/resources/flows.py:595` - Advanced search for flow execution logs. +- `total_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:524` +- `update_archival_status(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:493` +- `update_by_resource(self, resource_type: str, resource_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:378` +- `update_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:459` +- `update_samples(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:485` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.genai.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.genai.mdx index fb62b16..e93e250 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.genai.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.genai.mdx @@ -23,7 +23,9 @@ Methods: - `delete_config(self, gen_ai_config_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/genai.py:49` - `delete_org_setting(self, gen_ai_org_setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/genai.py:77` + - Source: `nexla_sdk/resources/genai.py:86` +- `delete_org_settings(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/genai.py:91` - `get_config(self, gen_ai_config_id: int) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:34` - `get_org_setting(self, gen_ai_org_setting_id: int) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` @@ -33,7 +35,9 @@ Methods: - `list_org_settings(self, org_id: int = None, all: bool = False) -> List[nexla_sdk.models.genai.responses.GenAiOrgSetting]` - Source: `nexla_sdk/resources/genai.py:55` - `show_active_config(self, gen_ai_usage: str) -> nexla_sdk.models.genai.responses.ActiveConfigView` - - Source: `nexla_sdk/resources/genai.py:82` + - Source: `nexla_sdk/resources/genai.py:94` - `update_config(self, gen_ai_config_id: int, payload: nexla_sdk.models.genai.requests.GenAiConfigPayload) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:40` +- `update_org_setting(self, gen_ai_org_setting_id: int, payload: nexla_sdk.models.genai.requests.GenAiOrgSettingPayload) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` + - Source: `nexla_sdk/resources/genai.py:77` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.lookups.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.lookups.mdx index 91cb30c..720c96f 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.lookups.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.lookups.mdx @@ -19,27 +19,49 @@ Resource for managing lookups (data maps). Methods: - `create(self, data: nexla_sdk.models.lookups.requests.LookupCreate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:56` + - Source: `nexla_sdk/resources/lookups.py:63` - Create new lookup. - `delete(self, data_map_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:84` + - Source: `nexla_sdk/resources/lookups.py:91` - Delete lookup. - `delete_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:137` + - Source: `nexla_sdk/resources/lookups.py:165` - Delete specific entries from a lookup. +- `delete_entries_by_body(self, data_map_id: int, entry_keys: List[str]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:186` +- `download_map(self, data_map_id: int) -> str` + - Source: `nexla_sdk/resources/lookups.py:113` - `get(self, data_map_id: int, expand: bool = False) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:40` + - Source: `nexla_sdk/resources/lookups.py:47` - Get single lookup by ID. - `get_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:116` + - Source: `nexla_sdk/resources/lookups.py:138` - Get specific entries from a lookup. +- `get_entries_by_body(self, data_map_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/lookups.py:159` - `list(self, **kwargs) -> List[nexla_sdk.models.lookups.responses.Lookup]` - Source: `nexla_sdk/resources/lookups.py:22` - List lookups with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:44` + - List resources accessible to the current user (access_insights). +- `list_public(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:40` + - List publicly available resources for this type. +- `probe_sample(self, data_map_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:192` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:103` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:106` + - Search resources by tags. - `update(self, data_map_id: int, data: nexla_sdk.models.lookups.requests.LookupUpdate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:71` + - Source: `nexla_sdk/resources/lookups.py:78` - Update lookup. - `upsert_entries(self, data_map_id: int, entries: List[Dict[str, Any]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:96` + - Source: `nexla_sdk/resources/lookups.py:118` - Upsert entries in a lookup. +- `validate(self, data_map_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:109` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.marketplace.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.marketplace.mdx index 4f31047..fa0f1ba 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.marketplace.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.marketplace.mdx @@ -17,29 +17,45 @@ Resource for marketplace domains and items. Methods: - `add_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:91` + - Source: `nexla_sdk/resources/marketplace.py:136` - `create_domain(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:53` - `create_domain_item(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainsItemCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:66` + - Source: `nexla_sdk/resources/marketplace.py:71` - `create_domains(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:29` - `delete_domain(self, domain_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/marketplace.py:58` +- `delist_domain_item(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:94` - `get_domain(self, domain_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:40` +- `get_domain_audit_log(self, domain_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:61` +- `get_domain_item(self, domain_id: int, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:80` - `get_domains_for_org(self, org_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:34` +- `get_item(self, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:110` - `list_domain_custodians(self, domain_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:76` + - Source: `nexla_sdk/resources/marketplace.py:121` - `list_domain_items(self, domain_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:62` + - Source: `nexla_sdk/resources/marketplace.py:67` - `list_domains(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:25` +- `list_items(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:106` - `remove_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/marketplace.py:100` + - Source: `nexla_sdk/resources/marketplace.py:145` +- `request_item_access(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:99` +- `search_domain_items(self, domain_id: int, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:86` +- `search_items(self, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:114` - `update_domain(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:44` - `update_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:82` + - Source: `nexla_sdk/resources/marketplace.py:127` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.mdx index 2471d0a..c47ad73 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.mdx @@ -8,6 +8,127 @@ keywords: [Nexla, SDK, Python, API] ## Classes +### ApiKeysResource + +Defined in `nexla_sdk/resources/api_keys.py:9` + +Resource for API keys (read-only access). + +API keys provide programmatic access to specific resources like +datasets, data sources, data sinks, and users. + +Note: + This resource only supports ``list()``, ``list_grouped()``, + ``get()``, and ``search()``. Write operations inherited from + ``BaseResource`` (e.g. ``create``, ``update``, ``delete``) are + not supported by the backend and will raise ``NotImplementedError``. + +Examples: + # List all API keys (grouped by type) + all_keys = client.api_keys.list_grouped() + + # Get a specific API key + key = client.api_keys.get(123) + + # Search API keys + keys = client.api_keys.search(\{"scope": "read"\}) + +Methods: + +- `activate(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:149` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id=None, options=None)` + - Source: `nexla_sdk/resources/api_keys.py:146` + - Copy resource. +- `create(self, data=None)` + - Source: `nexla_sdk/resources/api_keys.py:137` + - Create new resource. +- `delete(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:143` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, api_key_id: Union[int, str]) -> nexla_sdk.models.api_keys.responses.ApiKey` + - Source: `nexla_sdk/resources/api_keys.py:99` + - Get API key by ID or key value. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, access_role: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.api_keys.responses.ApiKey]` + - Source: `nexla_sdk/resources/api_keys.py:47` + - List API keys. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_grouped(self, page: Optional[int] = None, per_page: Optional[int] = None) -> nexla_sdk.models.api_keys.responses.ApiKeysIndex` + - Source: `nexla_sdk/resources/api_keys.py:74` + - List API keys grouped by resource type. +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id=None)` + - Source: `nexla_sdk/resources/api_keys.py:152` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.api_keys.responses.ApiKey]` + - Source: `nexla_sdk/resources/api_keys.py:112` + - Search API keys with filters. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id=None, data=None)` + - Source: `nexla_sdk/resources/api_keys.py:140` + - Update resource. + ### ApprovalRequestsResource Defined in `nexla_sdk/resources/approval_requests.py:7` @@ -20,10 +141,18 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `approve(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:25` + - Source: `nexla_sdk/resources/approval_requests.py:60` +- `cancel(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:71` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -34,24 +163,58 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` +- `get(self, request_id: int) -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` + - Source: `nexla_sdk/resources/approval_requests.py:50` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_access_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:35` +- `list_access_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:30` +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_assigned(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:20` +- `list_listings_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:45` +- `list_listings_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:40` - `list_pending(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - Source: `nexla_sdk/resources/approval_requests.py:15` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_requested(self) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` - - Source: `nexla_sdk/resources/approval_requests.py:20` + - Source: `nexla_sdk/resources/approval_requests.py:25` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -59,10 +222,30 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `reject(self, request_id: int, reason: str = '') -> nexla_sdk.models.approval_requests.responses.ApprovalRequest` - - Source: `nexla_sdk/resources/approval_requests.py:30` + - Source: `nexla_sdk/resources/approval_requests.py:65` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `show_data_set(self, data_set_id: int) -> List[nexla_sdk.models.approval_requests.responses.ApprovalRequest]` + - Source: `nexla_sdk/resources/approval_requests.py:55` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. @@ -81,8 +264,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -93,7 +282,7 @@ Methods: - Source: `nexla_sdk/resources/async_tasks.py:50` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `download_link(self, task_id: int) -> Union[str, nexla_sdk.models.async_tasks.responses.DownloadLink]` - Source: `nexla_sdk/resources/async_tasks.py:63` @@ -102,32 +291,74 @@ Methods: - `get(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:45` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:16` - List asynchronous tasks. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_by_status(self, status: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:32` -- `list_of_type(self, task_type: str) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` +- `list_of_type(self, task_type: str, **params) -> List[nexla_sdk.models.async_tasks.responses.AsyncTask]` - Source: `nexla_sdk/resources/async_tasks.py:27` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `rerun(self, task_id: int) -> nexla_sdk.models.async_tasks.responses.AsyncTask` - Source: `nexla_sdk/resources/async_tasks.py:54` - `result(self, task_id: int) -> Optional[Dict[str, Any]]` - Source: `nexla_sdk/resources/async_tasks.py:59` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `types(self) -> List[str]` - Source: `nexla_sdk/resources/async_tasks.py:37` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` @@ -146,11 +377,17 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` - - Copy resource. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, attribute_transform_id: int) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` + - Source: `nexla_sdk/resources/attribute_transforms.py:63` + - Copy an attribute transform. - `create(self, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformCreate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:43` - Create a new attribute transform. @@ -158,20 +395,41 @@ Methods: - Source: `nexla_sdk/resources/attribute_transforms.py:53` - Delete an attribute transform by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, attribute_transform_id: int, expand: bool = False) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:37` - Get an attribute transform by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` - Source: `nexla_sdk/resources/attribute_transforms.py:19` - List attribute transforms with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` - Source: `nexla_sdk/resources/attribute_transforms.py:57` - List publicly shared attribute transforms. @@ -181,18 +439,36 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:67` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.attribute_transforms.responses.AttributeTransform]` + - Source: `nexla_sdk/resources/attribute_transforms.py:70` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, attribute_transform_id: int, data: nexla_sdk.models.attribute_transforms.requests.AttributeTransformUpdate) -> nexla_sdk.models.attribute_transforms.responses.AttributeTransform` - Source: `nexla_sdk/resources/attribute_transforms.py:47` - Update an attribute transform by ID. -### BaseResource +### AuthParametersResource -Defined in `nexla_sdk/resources/base_resource.py:15` +Defined in `nexla_sdk/resources/auth_parameters.py:11` -Base class for all Nexla resources. +Resource for managing auth parameters. Methods: @@ -200,104 +476,126 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. -- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:229` +- `create(self, data: Union[nexla_sdk.models.auth_parameters.requests.AuthParameterCreate, Dict[str, Any]]) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:25` - Create new resource. -- `delete(self, resource_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/base_resource.py:274` +- `delete(self, auth_parameter_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_parameters.py:35` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` +- `get(self, auth_parameter_id: int) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:22` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - - Source: `nexla_sdk/resources/base_resource.py:130` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.auth_parameters.responses.AuthParameter]` + - Source: `nexla_sdk/resources/auth_parameters.py:19` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:252` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, auth_parameter_id: int, data: Union[nexla_sdk.models.auth_parameters.requests.AuthParameterUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_parameters.responses.AuthParameter` + - Source: `nexla_sdk/resources/auth_parameters.py:28` - Update resource. -### CodeContainersResource +### AuthTemplatesResource -Defined in `nexla_sdk/resources/code_containers.py:11` +Defined in `nexla_sdk/resources/auth_templates.py:13` -Resource for managing code containers. +Resource for managing auth templates. -Methods: +Auth templates define authentication configurations for vendors. +Write operations (create, update, delete) require super user access. -- `activate(self, resource_id: int) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:289` - - Activate resource. -- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` - - Add access control rules. -- `copy(self, code_container_id: int) -> nexla_sdk.models.code_containers.responses.CodeContainer` - - Source: `nexla_sdk/resources/code_containers.py:67` - - Copy a code container by ID. -- `create(self, data: nexla_sdk.models.code_containers.requests.CodeContainerCreate) -> nexla_sdk.models.code_containers.responses.CodeContainer` - - Source: `nexla_sdk/resources/code_containers.py:45` - - Create a new code container. -- `delete(self, code_container_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/code_containers.py:63` - - Delete a code container by ID. -- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` - - Delete access control rules. -- `get(self, code_container_id: int, expand: bool = False) -> nexla_sdk.models.code_containers.responses.CodeContainer` - - Source: `nexla_sdk/resources/code_containers.py:37` - - Get a code container by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:380` - - Get access control rules for resource. -- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` - - Get audit log for resource. -- `list(self, **kwargs) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - - Source: `nexla_sdk/resources/code_containers.py:19` - - List code containers with optional filters. -- `list_public(self) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` - - Source: `nexla_sdk/resources/code_containers.py:71` - - List publicly shared code containers. -- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - - Source: `nexla_sdk/resources/base_resource.py:181` - - Get paginator for iterating through resources. -- `pause(self, resource_id: int) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:305` - - Pause resource. -- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` - - Replace all access control rules. -- `update(self, code_container_id: int, data: nexla_sdk.models.code_containers.requests.CodeContainerUpdate) -> nexla_sdk.models.code_containers.responses.CodeContainer` - - Source: `nexla_sdk/resources/code_containers.py:53` - - Update an existing code container. +Examples: + # List all auth templates + templates = client.auth_templates.list() -### CredentialsResource + # Get an auth template by ID + template = client.auth_templates.get(123) -Defined in `nexla_sdk/resources/credentials.py:19` + # Get an auth template by name + template = client.auth_templates.get_by_name("oauth2_standard") -Resource for managing data credentials. + # Create an auth template (super user only) + template = client.auth_templates.create(AuthTemplateCreate( + name="new_template", + vendor_id=456, + display_name="New Auth Template" + )) + + # Update an auth template (super user only) + template = client.auth_templates.update(123, AuthTemplateUpdate( + description="Updated description" + )) + + # Delete an auth template (super user only) + client.auth_templates.delete(123) Methods: @@ -305,59 +603,113 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. -- `create(self, data: nexla_sdk.models.credentials.requests.CredentialCreate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:75` - - Create new credential. -- `delete(self, credential_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:105` - - Delete credential. +- `create(self, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateCreate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:101` + - Create a new auth template (super user only). +- `delete(self, auth_template_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:145` + - Delete an auth template (super user only). - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, credential_id: int, expand: bool = False) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:59` - - Get single credential by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:172` + - Delete auth templates via collection endpoint. +- `delete_by_name(self, auth_template_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:156` + - Delete an auth template by name (super user only). +- `get(self, auth_template_id: int, expand: bool = False) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:76` + - Get auth template by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self, credentials_type: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.credentials.responses.Credential]` - - Source: `nexla_sdk/resources/credentials.py:27` - - List credentials with optional filters. +- `get_by_name(self, auth_template_name: str) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:88` + - Get auth template by name. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.auth_templates.responses.AuthTemplate]` + - Source: `nexla_sdk/resources/auth_templates.py:55` + - List auth templates. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. -- `probe(self, credential_id: int, async_mode: bool = False, request_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/credentials.py:117` - - Test credential validity. -- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` - - Source: `nexla_sdk/resources/credentials.py:183` - - Preview data content accessible by credential. -- `probe_tree(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeTreeRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeTreeResponse` - - Source: `nexla_sdk/resources/credentials.py:155` - - Preview storage structure accessible by credential. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, credential_id: int, data: nexla_sdk.models.credentials.requests.CredentialUpdate) -> nexla_sdk.models.credentials.responses.Credential` - - Source: `nexla_sdk/resources/credentials.py:92` - - Update credential. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, auth_template_id: int, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:112` + - Update an auth template (super user only). +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/auth_templates.py:168` + - Update auth templates via collection endpoint. +- `update_by_name(self, auth_template_name: str, data: Union[nexla_sdk.models.auth_templates.requests.AuthTemplateUpdate, Dict[str, Any]]) -> nexla_sdk.models.auth_templates.responses.AuthTemplate` + - Source: `nexla_sdk/resources/auth_templates.py:126` + - Update an auth template by name (super user only). -### DataSchemasResource +### BaseResource -Defined in `nexla_sdk/resources/data_schemas.py:7` +Defined in `nexla_sdk/resources/base_resource.py:15` -Resource for data schemas (accessors + audit log only). +Base class for all Nexla resources. Methods: @@ -365,8 +717,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -377,89 +735,214 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. -- `get_audit_log(self, schema_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/data_schemas.py:15` +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. -### DestinationsResource +### CatalogConfigsResource -Defined in `nexla_sdk/resources/destinations.py:12` +Defined in `nexla_sdk/resources/catalog_configs.py:11` -Resource for managing destinations (data sinks). +Resource for managing catalog configs. Methods: -- `activate(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:94` - - Activate destination. +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, sink_id: int, options: Optional[nexla_sdk.models.destinations.requests.DestinationCopyOptions] = None) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:118` - - Copy a destination. -- `create(self, data: nexla_sdk.models.destinations.requests.DestinationCreate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:54` - - Create new destination. -- `delete(self, sink_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/destinations.py:82` - - Delete destination. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `check_job_status(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:43` +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.catalog_configs.requests.CatalogConfigCreate, Dict[str, Any]]) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:29` + - Create new resource. +- `delete(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:37` + - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, sink_id: int, expand: bool = False) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:38` - - Get single destination by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get(self, catalog_config_id: int) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:26` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self, **kwargs) -> List[nexla_sdk.models.destinations.responses.Destination]` - - Source: `nexla_sdk/resources/destinations.py:20` - - List destinations with optional filters. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.catalog_configs.responses.CatalogConfig]` + - Source: `nexla_sdk/resources/catalog_configs.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.catalog_configs.responses.CatalogConfig]` + - Source: `nexla_sdk/resources/catalog_configs.py:22` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `mock_catalog_add(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:40` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. -- `pause(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:106` - - Pause destination. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, sink_id: int, data: nexla_sdk.models.destinations.requests.DestinationUpdate) -> nexla_sdk.models.destinations.responses.Destination` - - Source: `nexla_sdk/resources/destinations.py:69` - - Update destination. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `start_bulk_create_update(self, catalog_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/catalog_configs.py:47` +- `update(self, catalog_config_id: int, data: Union[nexla_sdk.models.catalog_configs.requests.CatalogConfigUpdate, Dict[str, Any]]) -> nexla_sdk.models.catalog_configs.responses.CatalogConfig` + - Source: `nexla_sdk/resources/catalog_configs.py:32` + - Update resource. -### DocContainersResource +### ClusterEndpointsResource + +Defined in `nexla_sdk/resources/cluster_endpoints.py:13` + +Resource for managing cluster endpoints. + +Cluster endpoints define individual service connections within a cluster. +Most operations require super user access. + +Examples: + # List cluster endpoints + endpoints = client.cluster_endpoints.list() + + # Get a specific endpoint + endpoint = client.cluster_endpoints.get(123) -Defined in `nexla_sdk/resources/doc_containers.py:7` + # Create an endpoint + endpoint = client.cluster_endpoints.create(ClusterEndpointCreate( + cluster_id=456, + service="data_ingestion", + protocol="https", + host="ingestion.example.com", + port=443 + )) -Resource for document containers accessors and audit logs. + # Update an endpoint + endpoint = client.cluster_endpoints.update(123, ClusterEndpointUpdate( + host="new-ingestion.example.com" + )) + + # Get audit log + audit_log = client.cluster_endpoints.get_audit_log(123) Methods: @@ -467,113 +950,1882 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. -- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:229` - - Create new resource. +- `create(self, data: Union[nexla_sdk.models.clusters.requests.ClusterEndpointCreate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:84` + - Create a new cluster endpoint. - `delete(self, resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, resource_id: int, expand: bool = False) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:199` - - Get single resource by ID. +- `get(self, endpoint_id: int) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:71` + - Get cluster endpoint by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. - `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, endpoint_id: int, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/cluster_endpoints.py:116` + - Get audit log for a cluster endpoint. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.clusters.responses.ClusterEndpoint]` + - Source: `nexla_sdk/resources/cluster_endpoints.py:54` + - List cluster endpoints. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, endpoint_id: int, data: Union[nexla_sdk.models.clusters.requests.ClusterEndpointUpdate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.ClusterEndpoint` + - Source: `nexla_sdk/resources/cluster_endpoints.py:99` + - Update a cluster endpoint. + +### ClustersResource + +Defined in `nexla_sdk/resources/clusters.py:10` + +Resource for managing clusters. + +Clusters define infrastructure endpoints for processing data flows. +This resource requires super user access for most operations. + +Examples: + # List clusters + clusters = client.clusters.list() + + # Get a specific cluster + cluster = client.clusters.get(123) + + # Create a cluster + cluster = client.clusters.create(ClusterCreate( + org_id=1, + name="Production Cluster", + region="us-west-2", + provider="aws" + )) + + # Activate a cluster + client.clusters.activate(cluster.id) + + # Set as default cluster + client.clusters.set_default(cluster.id) + +Methods: + +- `activate(self, cluster_id: int) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:117` + - Activate a cluster. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.clusters.requests.ClusterCreate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:81` + - Create a new cluster. +- `delete(self, cluster_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/clusters.py:106` + - Delete a cluster. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `delete_endpoint(self, cluster_id: int, endpoint_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/clusters.py:144` + - Delete an endpoint from a cluster. +- `get(self, cluster_id: int, expand: bool = False) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:69` + - Get cluster by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. -- `get_audit_log(self, doc_container_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/doc_containers.py:15` +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - - Source: `nexla_sdk/resources/base_resource.py:130` - - List resources with optional filters. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.clusters.responses.Cluster]` + - Source: `nexla_sdk/resources/clusters.py:48` + - List clusters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:252` - - Update resource. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_default(self, cluster_id: int) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:128` + - Set a cluster as the default. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, cluster_id: int, data: Union[nexla_sdk.models.clusters.requests.ClusterUpdate, Dict[str, Any]]) -> nexla_sdk.models.clusters.responses.Cluster` + - Source: `nexla_sdk/resources/clusters.py:92` + - Update a cluster. -### FlowsResource +### CodeContainersResource -Defined in `nexla_sdk/resources/flows.py:21` +Defined in `nexla_sdk/resources/code_containers.py:11` -Resource for managing data flows. +Resource for managing code containers. Methods: -- `activate(self, flow_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/flows.py:117` - - Activate a flow. -- `activate_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/flows.py:314` - - Activate flow by resource ID. +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. -- `copy(self, flow_id: int, options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/flows.py:171` - - Copy a flow. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, code_container_id: int) -> nexla_sdk.models.code_containers.responses.CodeContainer` + - Source: `nexla_sdk/resources/code_containers.py:67` + - Copy a code container by ID. +- `create(self, data: nexla_sdk.models.code_containers.requests.CodeContainerCreate) -> nexla_sdk.models.code_containers.responses.CodeContainer` + - Source: `nexla_sdk/resources/code_containers.py:45` + - Create a new code container. +- `delete(self, code_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:63` + - Delete a code container by ID. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `error_functions(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:84` +- `get(self, code_container_id: int, expand: bool = False) -> nexla_sdk.models.code_containers.responses.CodeContainer` + - Source: `nexla_sdk/resources/code_containers.py:37` + - Get a code container by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:19` + - List code containers with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:77` + - List resources accessible to the current user (access_insights). +- `list_public(self) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:71` + - List publicly shared code containers. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `repo(self, code_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/code_containers.py:80` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:87` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.code_containers.responses.CodeContainer]` + - Source: `nexla_sdk/resources/code_containers.py:90` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, code_container_id: int, data: nexla_sdk.models.code_containers.requests.CodeContainerUpdate) -> nexla_sdk.models.code_containers.responses.CodeContainer` + - Source: `nexla_sdk/resources/code_containers.py:53` + - Update an existing code container. + +### ConnectorsResource + +Defined in `nexla_sdk/resources/connectors.py:10` + +Resource for managing connectors. + +Connectors define connection types for data sources and destinations. +The backend only supports list, get, and update operations. + +Read access requires Nexla admin org membership. +Update operations require super user access. + +Note: + This resource only supports ``list()``, ``get()``, and ``update()``. + Other write operations inherited from ``BaseResource`` (e.g. + ``create``, ``delete``, ``copy``) are not supported by the backend + and will raise ``NotImplementedError``. + +Examples: + # List all connectors + connectors = client.connectors.list() + + # Filter by API compatibility + nexset_connectors = client.connectors.list(nexset_api_compatible=True) + + # Get a specific connector by ID + connector = client.connectors.get(123) + + # Get a connector by type + connector = client.connectors.get("s3") + + # Update a connector (super user only) + connector = client.connectors.update(123, ConnectorUpdate( + description="Updated description" + )) + +Methods: + +- `activate(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:135` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id=None, options=None)` + - Source: `nexla_sdk/resources/connectors.py:132` + - Copy resource. +- `create(self, data=None)` + - Source: `nexla_sdk/resources/connectors.py:126` + - Create new resource. +- `delete(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:129` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, connector_id: Union[int, str]) -> nexla_sdk.models.connectors.responses.Connector` + - Source: `nexla_sdk/resources/connectors.py:94` + - Get connector by ID or type. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, access_role: Optional[str] = None, nexset_api_compatible: Optional[bool] = None, sync_api_compatible: Optional[bool] = None, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.connectors.responses.Connector]` + - Source: `nexla_sdk/resources/connectors.py:59` + - List connectors. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id=None)` + - Source: `nexla_sdk/resources/connectors.py:138` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, connector_id: Union[int, str], data: Union[nexla_sdk.models.connectors.requests.ConnectorUpdate, Dict[str, Any]]) -> nexla_sdk.models.connectors.responses.Connector` + - Source: `nexla_sdk/resources/connectors.py:107` + - Update a connector (super user only). + +### CredentialsResource + +Defined in `nexla_sdk/resources/credentials.py:19` + +Resource for managing data credentials. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: nexla_sdk.models.credentials.requests.CredentialCreate) -> nexla_sdk.models.credentials.responses.Credential` + - Source: `nexla_sdk/resources/credentials.py:103` + - Create new credential. +- `credentials_schema(self, source_type: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:71` +- `db_data_types(self, source_type: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:77` +- `delete(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:133` + - Delete credential. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, credential_id: int, expand: bool = False) -> nexla_sdk.models.credentials.responses.Credential` + - Source: `nexla_sdk/resources/credentials.py:87` + - Get single credential by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `intent(self, credential_id: int, payload: Dict[str, Any], method: str = 'PUT') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:297` +- `list(self, credentials_type: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:27` + - List credentials with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:68` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:59` + - List all credentials (admin only). +- `list_public(self, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:64` + - List publicly available resources for this type. +- `migrate_iceberg(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:303` +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `probe(self, credential_id: int, async_mode: bool = False, request_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:145` + - Test credential validity. +- `probe_detect_schemas(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:209` +- `probe_file_download(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:221` +- `probe_list_buckets(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:183` +- `probe_list_files(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:191` +- `probe_read_file(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:203` +- `probe_read_sample(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:215` +- `probe_sample(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeSampleRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeSampleResponse` + - Source: `nexla_sdk/resources/credentials.py:261` + - Preview data content accessible by credential. +- `probe_search_path(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:227` +- `probe_summary(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:187` +- `probe_tree(self, credential_id: int, request: nexla_sdk.models.credentials.requests.ProbeTreeRequest, async_mode: bool = False, request_id: Optional[int] = None) -> nexla_sdk.models.credentials.responses.ProbeTreeResponse` + - Source: `nexla_sdk/resources/credentials.py:233` + - Preview storage structure accessible by credential. +- `probe_tree_request(self, credential_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:197` +- `refresh(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:289` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:81` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/credentials.py:84` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, credential_id: int, data: nexla_sdk.models.credentials.requests.CredentialUpdate) -> nexla_sdk.models.credentials.responses.Credential` + - Source: `nexla_sdk/resources/credentials.py:120` + - Update credential. +- `usage(self, credential_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/credentials.py:293` + +### CubeJsResource + +Defined in `nexla_sdk/resources/cubejs.py:6` + +Resource for Cube.js query endpoint. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, resource_id: int, expand: bool = False) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:199` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:130` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `query(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/cubejs.py:14` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. + +### CustomDataFlowsResource + +Defined in `nexla_sdk/resources/custom_data_flows.py:11` + +Resource for managing custom data flows. + +Methods: + +- `activate(self, custom_data_flow_id: int, activate: bool = True) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:48` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, custom_data_flow_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:43` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.custom_data_flows.requests.CustomDataFlowCreate, Dict[str, Any]]) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:28` + - Create new resource. +- `delete(self, custom_data_flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:40` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `edit_code_containers(self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:60` +- `edit_data_credentials(self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:68` +- `get(self, custom_data_flow_id: int, expand: bool = False) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:25` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_metrics(self, custom_data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/custom_data_flows.py:56` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:22` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:76` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.custom_data_flows.responses.CustomDataFlow]` + - Source: `nexla_sdk/resources/custom_data_flows.py:79` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, custom_data_flow_id: int, data: Union[nexla_sdk.models.custom_data_flows.requests.CustomDataFlowUpdate, Dict[str, Any]]) -> nexla_sdk.models.custom_data_flows.responses.CustomDataFlow` + - Source: `nexla_sdk/resources/custom_data_flows.py:33` + - Update resource. + +### DashboardTransformsResource + +Defined in `nexla_sdk/resources/dashboard_transforms.py:11` + +Resource for dashboard transforms (global endpoints). + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.dashboard_transforms.requests.DashboardTransformCreate, Dict[str, Any]]) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:29` + - Create new resource. +- `delete(self, dashboard_transform_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:41` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, dashboard_transform_id: int) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:26` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.dashboard_transforms.responses.DashboardTransform]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.dashboard_transforms.responses.DashboardTransform]` + - Source: `nexla_sdk/resources/dashboard_transforms.py:22` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, dashboard_transform_id: int, data: Union[nexla_sdk.models.dashboard_transforms.requests.DashboardTransformUpdate, Dict[str, Any]]) -> nexla_sdk.models.dashboard_transforms.responses.DashboardTransform` + - Source: `nexla_sdk/resources/dashboard_transforms.py:34` + - Update resource. + +### DataCredentialsGroupsResource + +Defined in `nexla_sdk/resources/data_credentials_groups.py:13` + +Resource for managing data credentials groups. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupCreate, Dict[str, Any]]) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:27` + - Create new resource. +- `delete(self, group_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:39` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, group_id: int, expand: bool = False) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:24` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:21` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_credentials(self, group_id: int, **params) -> List[nexla_sdk.models.credentials.responses.Credential]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:42` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_credentials(self, group_id: int, payload: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupRemoveCredentials, Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_credentials_groups.py:47` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, group_id: int, data: Union[nexla_sdk.models.data_credentials_groups.requests.DataCredentialsGroupUpdate, Dict[str, Any]]) -> nexla_sdk.models.data_credentials_groups.responses.DataCredentialsGroup` + - Source: `nexla_sdk/resources/data_credentials_groups.py:32` + - Update resource. + +### DataFlowsResource + +Defined in `nexla_sdk/resources/data_flows.py:6` + +Resource for legacy data_flows endpoints. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:22` + - Create new resource. +- `create_data_sink_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:48` +- `create_data_source_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:38` +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:18` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, data_flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:25` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_data_sink_audit_log(self, data_sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:59` +- `get_data_sink_flow(self, data_sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:44` +- `get_data_source_audit_log(self, data_source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:54` +- `get_data_source_flow(self, data_source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:34` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow_audit_log(self, flow_node_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_flows.py:51` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:14` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_data_sink_flows(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:41` +- `list_data_source_flows(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/data_flows.py:29` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. + +### DataSchemasResource + +Defined in `nexla_sdk/resources/data_schemas.py:8` + +Resource for data schemas. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, schema_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:56` + - Copy resource. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:33` + - Create new resource. +- `delete(self, schema_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:39` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, schema_id: int, expand: bool = False) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:30` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, schema_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` + - Source: `nexla_sdk/resources/data_schemas.py:61` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_metrics(self, schema_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/data_schemas.py:42` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:16` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:27` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:19` +- `list_public(self, **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:23` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:50` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.data_schemas.responses.DataSchema]` + - Source: `nexla_sdk/resources/data_schemas.py:53` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, schema_id: int, data: Dict[str, Any]) -> nexla_sdk.models.data_schemas.responses.DataSchema` + - Source: `nexla_sdk/resources/data_schemas.py:36` + - Update resource. + +### DestinationsResource + +Defined in `nexla_sdk/resources/destinations.py:12` + +Resource for managing destinations (data sinks). + +Methods: + +- `activate(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:173` + - Activate destination. +- `activate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:354` +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, sink_id: int, options: Optional[nexla_sdk.models.destinations.requests.DestinationCopyOptions] = None) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:197` + - Copy a destination. +- `create(self, data: nexla_sdk.models.destinations.requests.DestinationCreate) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:86` + - Create new destination. +- `create_api_key(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:340` +- `create_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:273` +- `create_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:253` +- `delete(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:114` + - Delete destination. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `delete_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:366` +- `delete_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:285` +- `delete_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:265` +- `edit_flow_triggers(self, sink_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:309` +- `get(self, sink_id: int, expand: bool = False) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:70` + - Get single destination by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:336` +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:269` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:126` +- `get_flow_dashboard(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:129` +- `get_flow_logs(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:144` +- `get_flow_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:139` +- `get_flow_status_metrics(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:134` +- `get_metrics(self, sink_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:149` +- `get_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:165` +- `get_quarantine_aggregation(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:376` +- `get_quarantine_offset(self, sink_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:157` +- `get_quarantine_settings(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:249` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:20` + - List destinations with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:60` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:44` +- `list_all_by_data_set(self, **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:54` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:48` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/destinations.py:51` +- `list_api_keys(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:326` +- `list_flow_triggers(self, sink_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/destinations.py:305` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, sink_id: int) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:185` + - Pause destination. +- `pause_all_api_keys(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:362` +- `pause_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:358` +- `probe_authenticate(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:221` +- `probe_detect_schemas(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:237` +- `probe_list_buckets(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:213` +- `probe_list_files(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:225` +- `probe_quarantine_sample(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:243` +- `probe_read_file(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:233` +- `probe_summary(self, sink_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:217` +- `probe_tree(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:229` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `rotate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:350` +- `run_analysis(self, sink_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:301` +- `run_status(self, sink_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:295` +- `script_sink_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:63` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:38` + - Search resources using filter criteria. +- `search_api_keys(self, sink_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:330` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.destinations.responses.Destination]` + - Source: `nexla_sdk/resources/destinations.py:41` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:292` +- `trigger_quarantine_aggregation(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:370` +- `update(self, sink_id: int, data: nexla_sdk.models.destinations.requests.DestinationUpdate) -> nexla_sdk.models.destinations.responses.Destination` + - Source: `nexla_sdk/resources/destinations.py:101` + - Update destination. +- `update_api_key(self, sink_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:344` +- `update_dashboard_transforms(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:279` +- `update_quarantine_settings(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:259` +- `update_runtime_status(self, sink_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:66` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/destinations.py:289` + +### DocContainersResource + +Defined in `nexla_sdk/resources/doc_containers.py:8` + +Resource for document containers. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, doc_container_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:31` + - Copy resource. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:22` + - Create new resource. +- `delete(self, doc_container_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/doc_containers.py:28` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, doc_container_id: int, expand: bool = False) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:19` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, doc_container_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` + - Source: `nexla_sdk/resources/doc_containers.py:42` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:16` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:36` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/doc_containers.py:39` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, doc_container_id: int, data: Dict[str, Any]) -> nexla_sdk.models.doc_containers.responses.DocContainer` + - Source: `nexla_sdk/resources/doc_containers.py:25` + - Update resource. + +### FlowNodesResource + +Defined in `nexla_sdk/resources/flow_nodes.py:7` + +Resource for flow nodes. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, flow_node_id: int) -> nexla_sdk.models.common.FlowNode` + - Source: `nexla_sdk/resources/flow_nodes.py:15` + - Get single resource by ID. +- `get_access_insights(self, flow_node_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:27` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:130` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_flows_minimal(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:24` +- `list_origin_nodes_condensed(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_nodes.py:21` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, flow_node_id: int, data: Dict[str, Any]) -> nexla_sdk.models.common.FlowNode` + - Source: `nexla_sdk/resources/flow_nodes.py:18` + - Update resource. + +### FlowTriggersResource + +Defined in `nexla_sdk/resources/flow_triggers.py:10` + +Resource for managing flow triggers (orchestration events). + +Flow triggers define when one flow should trigger based on events +from another flow. They are immutable once created - to change a +trigger, delete and recreate it. + +Examples: + # List flow triggers + triggers = client.flow_triggers.list() + + # List all triggers (super user only) + all_triggers = client.flow_triggers.list_all() + + # Create a trigger: start data source when sink completes + trigger = client.flow_triggers.create(FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + data_sink_id=123, # Triggering sink + data_source_id=456 # Triggered source + )) + + # Pause a trigger + client.flow_triggers.pause(trigger.id) + + # Activate a trigger + client.flow_triggers.activate(trigger.id) + + # Delete a trigger + client.flow_triggers.delete(trigger.id) + +Methods: + +- `activate(self, trigger_id: int) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:139` + - Activate a flow trigger. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.flow_triggers.requests.FlowTriggerCreate, Dict[str, Any]]) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:111` + - Create a new flow trigger. +- `delete(self, trigger_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flow_triggers.py:128` + - Delete a flow trigger. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, trigger_id: int, expand: bool = False) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:99` + - Get flow trigger by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.flow_triggers.responses.FlowTrigger]` + - Source: `nexla_sdk/resources/flow_triggers.py:52` + - List flow triggers accessible by current user. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.flow_triggers.responses.FlowTrigger]` + - Source: `nexla_sdk/resources/flow_triggers.py:73` + - List all flow triggers (super user only). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, trigger_id: int) -> nexla_sdk.models.flow_triggers.responses.FlowTrigger` + - Source: `nexla_sdk/resources/flow_triggers.py:150` + - Pause a flow trigger. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id=None, data=None)` + - Source: `nexla_sdk/resources/flow_triggers.py:161` + - Flow triggers are immutable. To change a trigger, delete and recreate it. + +### FlowsResource + +Defined in `nexla_sdk/resources/flows.py:21` + +Resource for managing data flows. + +Methods: + +- `accessors_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:395` +- `activate(self, flow_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:117` + - Activate a flow. +- `activate_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:314` + - Activate flow by resource ID. +- `active_flows_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:527` +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `bulk_assign_project(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:512` +- `copy(self, flow_id: int, options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:171` + - Copy a flow. - `copy_and_replace_credentials(self, flow_id: int, resource_credential_mapping: Dict[int, int], copy_options: Optional[nexla_sdk.models.flows.requests.FlowCopyOptions] = None, target_project_id: Optional[int] = None) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:186` - Copy a flow and replace credentials on specified resources. +- `copy_by_resource(self, resource_type: str, resource_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:385` - `create(self, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:229` - Create new resource. +- `create_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:453` +- `daily_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:521` - `delete(self, flow_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:282` - Delete flow. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_all_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:471` - `delete_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/flows.py:294` - Delete flow by resource ID. +- `delete_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:465` +- `docs_by_resource(self, resource_type: str, resource_id: int, mode: str = 'list', payload: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:407` - `docs_recommendation(self, flow_id: int) -> Union[nexla_sdk.models.flows.responses.DocsRecommendation, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:378` + - Source: `nexla_sdk/resources/flows.py:535` - Generate AI suggestion for flow documentation. +- `flow_logs(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:435` +- `flow_logs_v2(self, flow_id: int, payload: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:439` +- `flow_metrics(self, flow_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:445` - `get(self, flow_id: int, flows_only: bool = False, include_run_metrics: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:67` - Get flow by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_active_flows_metrics(self, from_date: str = None, to_date: str = None, org_id: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:475` + - Source: `nexla_sdk/resources/flows.py:632` - Get metrics for currently active flows. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, flows_only: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:90` - Get flow by resource ID. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_logs(self, flow_id: int, from_date: str = None, to_date: str = None, severity: str = None, run_id: int = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:397` + - Source: `nexla_sdk/resources/flows.py:554` - Get execution logs for a specific flow. -- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:529` +- `get_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:686` - Get flow execution logs for a specific run id of a flow. -- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/flows.py:581` +- `get_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.flows.responses.FlowMetricsApiResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/flows.py:738` - Get flow metrics for a flow node keyed by resource id. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resources_access(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:532` - `get_run_status(self, flow_id: int, run_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:499` + - Source: `nexla_sdk/resources/flows.py:656` - Get status of a specific flow run. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `import_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:515` +- `insert_flow_node(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:475` - `list(self, flows_only: bool = False, include_run_metrics: bool = False, access_role: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.flows.responses.FlowResponse]` - Source: `nexla_sdk/resources/flows.py:29` - List flows with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_linked_flows(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:449` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -583,15 +2835,59 @@ Methods: - `pause_by_resource(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, all: bool = False, full_tree: bool = False) -> nexla_sdk.models.flows.responses.FlowResponse` - Source: `nexla_sdk/resources/flows.py:346` - Pause flow by resource ID. +- `publish_rag(self, flow_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:489` +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:518` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_flow_node(self, flow_id: int, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:479` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `restore_archival(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:499` +- `run_now(self, flow_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:431` +- `run_profiles_activate(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:425` +- `run_status(self, flow_id: int, run_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:503` +- `run_status_by_resource(self, resource_type: str, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:419` +- `search(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:509` + - Search resources using filter criteria. - `search_flow_logs(self, flow_id: int, run_ids: str = None, severity: str = None, search_string: str = None, from_date: str = None, to_date: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/flows.py:438` + - Source: `nexla_sdk/resources/flows.py:595` - Advanced search for flow execution logs. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `total_metrics(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:524` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. +- `update_archival_status(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:493` +- `update_by_resource(self, resource_type: str, resource_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.flows.responses.FlowResponse` + - Source: `nexla_sdk/resources/flows.py:378` +- `update_linked_flows(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:459` +- `update_samples(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/flows.py:485` ### GenAIResource @@ -605,8 +2901,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -621,48 +2923,94 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_config(self, gen_ai_config_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/genai.py:49` - `delete_org_setting(self, gen_ai_org_setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/genai.py:77` + - Source: `nexla_sdk/resources/genai.py:86` +- `delete_org_settings(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/genai.py:91` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_config(self, gen_ai_config_id: int) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:34` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_org_setting(self, gen_ai_org_setting_id: int) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` - Source: `nexla_sdk/resources/genai.py:71` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_configs(self) -> List[nexla_sdk.models.genai.responses.GenAiConfig]` - Source: `nexla_sdk/resources/genai.py:25` - `list_org_settings(self, org_id: int = None, all: bool = False) -> List[nexla_sdk.models.genai.responses.GenAiOrgSetting]` - Source: `nexla_sdk/resources/genai.py:55` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `show_active_config(self, gen_ai_usage: str) -> nexla_sdk.models.genai.responses.ActiveConfigView` - - Source: `nexla_sdk/resources/genai.py:82` + - Source: `nexla_sdk/resources/genai.py:94` - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_config(self, gen_ai_config_id: int, payload: nexla_sdk.models.genai.requests.GenAiConfigPayload) -> nexla_sdk.models.genai.responses.GenAiConfig` - Source: `nexla_sdk/resources/genai.py:40` +- `update_org_setting(self, gen_ai_org_setting_id: int, payload: nexla_sdk.models.genai.requests.GenAiOrgSettingPayload) -> nexla_sdk.models.genai.responses.GenAiOrgSetting` + - Source: `nexla_sdk/resources/genai.py:77` ### LookupsResource @@ -676,53 +3024,111 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.lookups.requests.LookupCreate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:56` + - Source: `nexla_sdk/resources/lookups.py:63` - Create new lookup. - `delete(self, data_map_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:84` + - Source: `nexla_sdk/resources/lookups.py:91` - Delete lookup. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/lookups.py:137` + - Source: `nexla_sdk/resources/lookups.py:165` - Delete specific entries from a lookup. +- `delete_entries_by_body(self, data_map_id: int, entry_keys: List[str]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:186` +- `download_map(self, data_map_id: int) -> str` + - Source: `nexla_sdk/resources/lookups.py:113` - `get(self, data_map_id: int, expand: bool = False) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:40` + - Source: `nexla_sdk/resources/lookups.py:47` - Get single lookup by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_entries(self, data_map_id: int, entry_keys: Union[str, List[str]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:116` + - Source: `nexla_sdk/resources/lookups.py:138` - Get specific entries from a lookup. +- `get_entries_by_body(self, data_map_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/lookups.py:159` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.lookups.responses.Lookup]` - Source: `nexla_sdk/resources/lookups.py:22` - List lookups with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:44` + - List resources accessible to the current user (access_insights). +- `list_public(self, **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:40` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `probe_sample(self, data_map_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:192` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:103` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.lookups.responses.Lookup]` + - Source: `nexla_sdk/resources/lookups.py:106` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, data_map_id: int, data: nexla_sdk.models.lookups.requests.LookupUpdate) -> nexla_sdk.models.lookups.responses.Lookup` - - Source: `nexla_sdk/resources/lookups.py:71` + - Source: `nexla_sdk/resources/lookups.py:78` - Update lookup. - `upsert_entries(self, data_map_id: int, entries: List[Dict[str, Any]]) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/lookups.py:96` + - Source: `nexla_sdk/resources/lookups.py:118` - Upsert entries in a lookup. +- `validate(self, data_map_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/lookups.py:109` ### MarketplaceResource @@ -736,10 +3142,16 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:91` + - Source: `nexla_sdk/resources/marketplace.py:136` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -749,57 +3161,115 @@ Methods: - `create_domain(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:53` - `create_domain_item(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainsItemCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:66` + - Source: `nexla_sdk/resources/marketplace.py:71` - `create_domains(self, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:29` - `delete(self, resource_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_domain(self, domain_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/marketplace.py:58` +- `delist_domain_item(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:94` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_domain(self, domain_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:40` +- `get_domain_audit_log(self, domain_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:61` +- `get_domain_item(self, domain_id: int, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:80` - `get_domains_for_org(self, org_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:34` +- `get_item(self, item_id: int) -> nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem` + - Source: `nexla_sdk/resources/marketplace.py:110` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_domain_custodians(self, domain_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:76` + - Source: `nexla_sdk/resources/marketplace.py:121` - `list_domain_items(self, domain_id: int) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` - - Source: `nexla_sdk/resources/marketplace.py:62` + - Source: `nexla_sdk/resources/marketplace.py:67` - `list_domains(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomain]` - Source: `nexla_sdk/resources/marketplace.py:25` +- `list_items(self) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:106` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/marketplace.py:100` + - Source: `nexla_sdk/resources/marketplace.py:145` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `request_item_access(self, domain_id: int, item_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/marketplace.py:99` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_domain_items(self, domain_id: int, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:86` +- `search_items(self, payload: Dict[str, Any]) -> List[nexla_sdk.models.marketplace.responses.MarketplaceDomainsItem]` + - Source: `nexla_sdk/resources/marketplace.py:114` +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_domain(self, domain_id: int, data: nexla_sdk.models.marketplace.requests.MarketplaceDomainCreate) -> nexla_sdk.models.marketplace.responses.MarketplaceDomain` - Source: `nexla_sdk/resources/marketplace.py:44` - `update_domain_custodians(self, domain_id: int, payload: nexla_sdk.models.marketplace.requests.CustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/marketplace.py:82` + - Source: `nexla_sdk/resources/marketplace.py:127` ### MetricsResource @@ -817,8 +3287,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -829,110 +3305,680 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:216` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:220` - Get flow logs for a flow run keyed by resource ID. -- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:162` +- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:166` - Get flow metrics for a flow node keyed by resource ID. - `get_flow_metrics_summary(self, period: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:148` + - Source: `nexla_sdk/resources/metrics.py:152` - Get flow metrics summary for a given period. - `get_rate_limits(self) -> Dict[str, Any]` - Source: `nexla_sdk/resources/metrics.py:111` - Get current rate limit and usage. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_daily_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None) -> nexla_sdk.models.metrics.responses.MetricsResponse` - Source: `nexla_sdk/resources/metrics.py:39` - Get daily metrics for a resource. - `get_resource_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, metric_type: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:121` + - Source: `nexla_sdk/resources/metrics.py:125` - Get flow metrics for a specific resource. - `get_resource_metrics_by_run(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, size: Optional[int] = None) -> nexla_sdk.models.metrics.responses.MetricsByRunResponse` - Source: `nexla_sdk/resources/metrics.py:70` - Get metrics by run for a resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/metrics.py:121` + - Publish raw metrics (super user only). +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. ### NexsetsResource -Defined in `nexla_sdk/resources/nexsets.py:12` +Defined in `nexla_sdk/resources/nexsets.py:14` Resource for managing nexsets (data sets). Methods: - `activate(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:94` + - Source: `nexla_sdk/resources/nexsets.py:146` - Activate nexset. +- `activate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:430` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_samples(self, set_id: int, samples: Any) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:209` +- `add_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:321` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `bulk_update_catalog_refs(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:399` +- `catalog_add(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:261` - `copy(self, set_id: int, options: Optional[nexla_sdk.models.nexsets.requests.NexsetCopyOptions] = None) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:147` + - Source: `nexla_sdk/resources/nexsets.py:216` - Copy a nexset. +- `copy_docs(self, src_id: int, dst_id: int) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:536` + - Copy all documentation entries from one nexset to another. - `create(self, data: nexla_sdk.models.nexsets.requests.NexsetCreate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:54` + - Source: `nexla_sdk/resources/nexsets.py:106` - Create new nexset. +- `create_api_key(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:416` +- `create_catalog_ref(self, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:385` +- `create_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:297` +- `create_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:277` - `delete(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:82` + - Source: `nexla_sdk/resources/nexsets.py:134` - Delete nexset. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:442` +- `delete_catalog_ref(self, ref_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:395` +- `delete_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:309` +- `delete_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:289` - `docs_recommendation(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:161` + - Source: `nexla_sdk/resources/nexsets.py:456` - Generate AI suggestion for Nexset documentation. - `get(self, set_id: int, expand: bool = False) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:38` + - Source: `nexla_sdk/resources/nexsets.py:90` - Get single nexset by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:412` - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_catalog_ref(self, ref_id: int) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:380` +- `get_characteristics(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:353` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:293` +- `get_data_update_time(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:349` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:234` +- `get_flow_dashboard(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:237` +- `get_flow_logs(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:249` +- `get_flow_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:245` +- `get_flow_status_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:241` +- `get_metrics(self, set_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:253` +- `get_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:345` +- `get_quarantine_aggregation(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:452` +- `get_quarantine_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:341` +- `get_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:273` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_samples(self, set_id: int, count: int = 10, include_metadata: bool = False, live: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` - - Source: `nexla_sdk/resources/nexsets.py:118` + - Source: `nexla_sdk/resources/nexsets.py:170` - Get sample records from a nexset. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.nexsets.responses.Nexset]` - - Source: `nexla_sdk/resources/nexsets.py:20` + - Source: `nexla_sdk/resources/nexsets.py:22` - List nexsets with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:40` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:44` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/nexsets.py:47` +- `list_api_keys(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:402` +- `list_available(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:50` +- `list_catalog_refs(self, **params) -> List[nexla_sdk.models.catalog_refs.responses.CatalogRef]` + - Source: `nexla_sdk/resources/nexsets.py:375` +- `list_characteristics_search(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:72` +- `list_docs(self, set_id: int, expand: bool = True) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:461` + - List documentation entries attached to a nexset. +- `list_nexset_api_compatible(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:80` +- `list_public(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:63` + - List publicly available resources for this type. +- `list_shared(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:59` +- `list_sharers(self, set_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:313` +- `list_summary(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:77` +- `mark_shared(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:331` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:106` + - Source: `nexla_sdk/resources/nexsets.py:158` - Pause nexset. +- `pause_all_api_keys(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:438` +- `pause_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:434` +- `probe_quarantine_sample(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:335` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:325` +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `rotate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:426` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:361` + - Search resources using filter criteria. +- `search_api_keys(self, set_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:406` +- `search_available(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:54` +- `search_public_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:67` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:364` + - Search resources by tags. +- `semantic_schemas(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:265` +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:317` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `summary(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:357` +- `sync_with_catalog(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:230` +- `transform(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:269` +- `trigger_quarantine_aggregation(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:446` +- `unvote(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:371` - `update(self, set_id: int, data: nexla_sdk.models.nexsets.requests.NexsetUpdate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:69` + - Source: `nexla_sdk/resources/nexsets.py:121` - Update nexset. +- `update_api_key(self, set_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:420` +- `update_catalog_ref(self, ref_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:390` +- `update_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:303` +- `update_docs(self, set_id: int, docs: List[Union[nexla_sdk.models.doc_containers.requests.DocContainerInput, Dict[str, Any]]]) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:491` + - Replace all documentation entries on a nexset. +- `update_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:283` +- `update_runtime_status(self, set_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:86` +- `update_samples(self, set_id: int, samples: Any, replace: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:199` +- `vote(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:367` + +### NotificationChannelSettingsResource + +Defined in `nexla_sdk/resources/notification_channel_settings.py:13` + +Resource for managing notification channel settings. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.notification_channel_settings.requests.NotificationChannelSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:27` + - Create new resource. +- `delete(self, setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_channel_settings.py:39` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, setting_id: int) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:24` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting]` + - Source: `nexla_sdk/resources/notification_channel_settings.py:21` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, setting_id: int, data: Union[nexla_sdk.models.notification_channel_settings.requests.NotificationChannelSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:32` + - Update resource. + +### NotificationSettingsResource + +Defined in `nexla_sdk/resources/notification_settings.py:13` + +Resource for managing notification settings. + +Notification settings control how and when users receive notifications +for different events and resources. + +Examples: + # List notification settings + settings = client.notification_settings.list() + + # Get a specific setting + setting = client.notification_settings.get(123) + + # Create a new notification setting + setting = client.notification_settings.create(NotificationSettingCreate( + notification_type_id=1, + channel="email", + priority=5 + )) + + # Update a setting + setting = client.notification_settings.update(123, NotificationSettingUpdate( + priority=10 + )) + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:137` + - Create a new notification setting. +- `delete(self, setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_settings.py:166` + - Delete a notification setting. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, setting_id: int, expand: bool = False) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:125` + - Get notification setting by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, notification_resource_type: Optional[str] = None, resource_id: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:49` + - List notification settings for the current user. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, page: Optional[int] = None, per_page: Optional[int] = None, resource_type: Optional[str] = None, event_type: Optional[str] = None, status: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:90` + - List all notification settings (super user only). +- `list_by(self, payload: Dict[str, Any], method: str = 'POST') -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:247` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `org_create(self, org_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:288` + - Create a notification setting for an organization. +- `org_delete(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_settings.py:326` + - Delete an organization notification setting. +- `org_index(self, org_id: int, page: Optional[int] = None, per_page: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:254` + - List notification settings for an organization. +- `org_update(self, org_id: int, notification_settings_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:305` + - Update an organization notification setting. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `show_resource_settings(self, resource_type: str, resource_id: int, notification_type_id: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None, filter_overridden_settings: bool = False) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:177` + - Get notification settings for a specific resource. +- `show_type_settings(self, notification_type_id: int, page: Optional[int] = None, per_page: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:213` + - Get notification settings for a specific notification type. +- `update(self, setting_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:150` + - Update a notification setting. + +### NotificationTypesResource + +Defined in `nexla_sdk/resources/notification_types.py:7` + +Resource for listing notification types. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, resource_id: int, expand: bool = False) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:199` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self) -> List[nexla_sdk.models.notification_types.responses.NotificationType]` + - Source: `nexla_sdk/resources/notification_types.py:15` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self) -> List[nexla_sdk.models.notification_types.responses.NotificationType]` + - Source: `nexla_sdk/resources/notification_types.py:19` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. ### NotificationsResource @@ -946,8 +3992,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -955,95 +4007,254 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:229` - Create new resource. - `create_channel_setting(self, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:195` + - Source: `nexla_sdk/resources/notifications.py:221` - Create notification channel setting. - `create_setting(self, data: nexla_sdk.models.notifications.requests.NotificationSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:285` + - Source: `nexla_sdk/resources/notifications.py:311` - Create notification setting. - `delete(self, notification_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/notifications.py:40` - Delete notification. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `delete_all(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:90` +- `delete_all(self, payload: Optional[Dict[str, Any]] = None, async_mode: bool = False) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:96` - Delete all notifications. - `delete_channel_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:242` + - Source: `nexla_sdk/resources/notifications.py:268` - Delete notification channel setting. - `delete_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:330` + - Source: `nexla_sdk/resources/notifications.py:356` - Delete notification setting. - `get(self, notification_id: int, expand: bool = False) -> nexla_sdk.models.notifications.responses.Notification` - Source: `nexla_sdk/resources/notifications.py:27` - Get single notification by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. - `get_channel_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:211` + - Source: `nexla_sdk/resources/notifications.py:237` - Get notification channel setting. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. - `get_count(self, read: Optional[int] = None) -> nexla_sdk.models.notifications.responses.NotificationCount` - - Source: `nexla_sdk/resources/notifications.py:100` + - Source: `nexla_sdk/resources/notifications.py:111` - Get notification count. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_settings(self, resource_type: str, resource_id: int, expand: bool = False, filter_overridden: bool = False, notification_type_id: Optional[int] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:361` + - Source: `nexla_sdk/resources/notifications.py:387` - Get notification settings for a resource. - `get_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:299` + - Source: `nexla_sdk/resources/notifications.py:325` - Get notification setting. - `get_settings_by_type(self, notification_type_id: int, expand: bool = False) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:343` + - Source: `nexla_sdk/resources/notifications.py:369` - Get notification settings for a type. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. - `get_type(self, event_type: str, resource_type: str) -> nexla_sdk.models.notifications.responses.NotificationType` - - Source: `nexla_sdk/resources/notifications.py:167` + - Source: `nexla_sdk/resources/notifications.py:193` - Get specific notification type. - `get_types(self, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationType]` - - Source: `nexla_sdk/resources/notifications.py:152` + - Source: `nexla_sdk/resources/notifications.py:178` - Get all notification types. -- `list(self, read: Optional[int] = None, level: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, read: Optional[int] = None, level: Optional[str] = None, resource_id: Optional[int] = None, resource_type: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` - Source: `nexla_sdk/resources/notifications.py:52` - List notifications with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_channel_settings(self) -> List[nexla_sdk.models.notifications.responses.NotificationChannelSetting]` - - Source: `nexla_sdk/resources/notifications.py:184` + - Source: `nexla_sdk/resources/notifications.py:210` - List notification channel settings. +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_settings(self, event_type: Optional[str] = None, resource_type: Optional[str] = None, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:256` + - Source: `nexla_sdk/resources/notifications.py:282` - List notification settings. - `mark_read(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:115` + - Source: `nexla_sdk/resources/notifications.py:126` - Mark notifications as read. +- `mark_read_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:162` - `mark_unread(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:133` + - Source: `nexla_sdk/resources/notifications.py:144` - Mark notifications as unread. +- `mark_unread_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:168` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:174` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:252` - Update resource. - `update_channel_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:225` + - Source: `nexla_sdk/resources/notifications.py:251` - Update notification channel setting. - `update_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:313` + - Source: `nexla_sdk/resources/notifications.py:339` - Update notification setting. -### OrgAuthConfigsResource +### OrgAuthConfigsResource + +Defined in `nexla_sdk/resources/org_auth_configs.py:8` + +Resource for organization authentication configurations (/api_auth_configs). + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `client_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:30` + - Get client config for API auth. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` + - Source: `nexla_sdk/resources/org_auth_configs.py:43` + - Create a new authentication configuration. +- `delete(self, auth_config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:57` + - Delete an authentication configuration by ID. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, auth_config_id: int) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` + - Source: `nexla_sdk/resources/org_auth_configs.py:38` + - Get a specific authentication configuration by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `info(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:34` + - Get API auth info. +- `list(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` + - Source: `nexla_sdk/resources/org_auth_configs.py:16` + - List authentication configurations for the current organization. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` + - Source: `nexla_sdk/resources/org_auth_configs.py:21` + - List all authentication configurations (admin only). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_sign_on_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:26` + - List sign-on options (public). +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, auth_config_id: int, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` + - Source: `nexla_sdk/resources/org_auth_configs.py:49` + - Update an existing authentication configuration. + +### OrgTiersResource -Defined in `nexla_sdk/resources/org_auth_configs.py:8` +Defined in `nexla_sdk/resources/org_tiers.py:7` -Resource for organization authentication configurations (/api_auth_configs). +Resource for organization tiers. Methods: @@ -1051,47 +4262,92 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. -- `create(self, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:31` - - Create a new authentication configuration. -- `delete(self, auth_config_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/org_auth_configs.py:45` - - Delete an authentication configuration by ID. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:21` + - Create new resource. +- `delete(self, org_tier_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_tiers.py:27` + - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. -- `get(self, auth_config_id: int) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:26` - - Get a specific authentication configuration by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get(self, org_tier_id: int) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:18` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. -- `list(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - - Source: `nexla_sdk/resources/org_auth_configs.py:16` - - List authentication configurations for the current organization. -- `list_all(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - - Source: `nexla_sdk/resources/org_auth_configs.py:21` - - List all authentication configurations (admin only). +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.org_tiers.responses.OrgTier]` + - Source: `nexla_sdk/resources/org_tiers.py:15` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `update(self, auth_config_id: int, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:37` - - Update an existing authentication configuration. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, org_tier_id: int, data: Dict[str, Any]) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:24` + - Update resource. ### OrganizationsResource @@ -1104,67 +4360,141 @@ Methods: - `activate(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. +- `activate_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:273` - `activate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:173` + - Source: `nexla_sdk/resources/organizations.py:190` - Activate members in an organization. +- `activate_org(self, org_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:245` +- `activate_rate_limited_sources(self, org_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:236` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:365` + - Source: `nexla_sdk/resources/organizations.py:501` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.organizations.requests.OrganizationCreate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:61` + - Source: `nexla_sdk/resources/organizations.py:65` - Create a new organization. Note: This is an admin-only operation. +- `create_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:335` +- `create_notification_settings(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:285` - `deactivate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:156` + - Source: `nexla_sdk/resources/organizations.py:173` - Deactivate members in an organization. - `delete(self, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:86` + - Source: `nexla_sdk/resources/organizations.py:90` - Delete organization. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:347` - `delete_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberDelete) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:142` + - Source: `nexla_sdk/resources/organizations.py:159` - Remove members from organization. +- `delete_notification_settings(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:297` +- `disable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:315` +- `enable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:311` - `get(self, org_id: int, expand: bool = False) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:48` + - Source: `nexla_sdk/resources/organizations.py:52` - Get single organization by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_account_rate_limited(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:232` - `get_account_summary(self, org_id: int) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:190` + - Source: `nexla_sdk/resources/organizations.py:207` - Get account summary statistics for an organization. - `get_audit_log(self, org_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:227` + - Source: `nexla_sdk/resources/organizations.py:363` - Get audit log for an organization. - `get_auth_settings(self, org_id: int) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/organizations.py:316` + - Source: `nexla_sdk/resources/organizations.py:452` - Get authentication settings for organization. +- `get_clusters(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:265` +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. - `get_current_account_summary(self) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:204` + - Source: `nexla_sdk/resources/organizations.py:221` - Get account summary for the current organization based on auth token. - `get_custodians(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:348` + - Source: `nexla_sdk/resources/organizations.py:484` +- `get_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:331` +- `get_data_sets_catalog_config(self, config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:307` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_status_metrics(self, org_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:269` + - Source: `nexla_sdk/resources/organizations.py:405` - Get flow status metrics for an organization. +- `get_flows_account_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:359` +- `get_flows_dashboard(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:351` +- `get_flows_report(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:261` +- `get_flows_status_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:355` +- `get_login_history(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:102` - `get_members(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:98` + - Source: `nexla_sdk/resources/organizations.py:115` - Get all members in organization. +- `get_metrics(self, org_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:107` - `get_org_flow_account_metrics(self, org_id: int, from_date: str, to_date: str = None, aggregate: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:215` + - Source: `nexla_sdk/resources/organizations.py:319` - Get total account metrics for an organization (flows). +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. - `get_resource_audit_log(self, org_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:294` + - Source: `nexla_sdk/resources/organizations.py:430` - Get audit log for a specific resource type within an organization. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.organizations.responses.Organization]` - Source: `nexla_sdk/resources/organizations.py:30` - List organizations with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.organizations.responses.Organization]` + - Source: `nexla_sdk/resources/organizations.py:48` +- `list_data_sets_catalog_configs(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:303` +- `list_notification_settings(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:281` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -1172,24 +4502,54 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `remove_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:375` + - Source: `nexla_sdk/resources/organizations.py:511` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:127` + - Source: `nexla_sdk/resources/organizations.py:144` - Replace all members in organization. +- `revert_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:277` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_rate_limits(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:253` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `throttle(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:257` - `update(self, org_id: int, data: nexla_sdk.models.organizations.requests.OrganizationUpdate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:73` + - Source: `nexla_sdk/resources/organizations.py:77` - Update organization. - `update_auth_setting(self, org_id: int, auth_setting_id: int, enabled: bool) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:329` + - Source: `nexla_sdk/resources/organizations.py:465` - Enable/disable authentication configuration. +- `update_cluster(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:269` - `update_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:355` + - Source: `nexla_sdk/resources/organizations.py:491` +- `update_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:341` - `update_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:112` + - Source: `nexla_sdk/resources/organizations.py:129` - Add or update members in organization. +- `update_notification_settings(self, org_id: int, notification_settings_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:291` ### ProjectsResource @@ -1203,16 +4563,25 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:170` + - Source: `nexla_sdk/resources/projects.py:184` - Backward-compatible alias for adding flows to a project. +- `add_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:215` + - Legacy add endpoint: '/projects/\{id\}/data_flows'. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:113` + - Source: `nexla_sdk/resources/projects.py:127` - Add flows to project. -- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:321` +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, project_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.projects.responses.Project` + - Source: `nexla_sdk/resources/projects.py:99` - Copy resource. - `create(self, data: nexla_sdk.models.projects.requests.ProjectCreate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:59` @@ -1221,23 +4590,52 @@ Methods: - Source: `nexla_sdk/resources/projects.py:87` - Delete project. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, project_id: int, expand: bool = False) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:43` - Get single project by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_data_flows_legacy(self, project_id: int) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:194` + - Legacy project flow listing endpoint. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flows(self, project_id: int) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:99` + - Source: `nexla_sdk/resources/projects.py:113` - Get flows in project. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resources_access(self, project_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/projects.py:110` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.projects.responses.Project]` - Source: `nexla_sdk/resources/projects.py:21` - List projects with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. @@ -1245,27 +4643,251 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. - `remove_data_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:190` + - Source: `nexla_sdk/resources/projects.py:233` - Backward-compatible alias for removing flows from a project. +- `remove_data_flows_legacy(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:243` + - Legacy remove endpoint: '/projects/\{id\}/data_flows'. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:151` + - Source: `nexla_sdk/resources/projects.py:165` - Remove flows from project. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:180` + - Source: `nexla_sdk/resources/projects.py:205` - Backward-compatible alias for replacing all flows in a project. +- `replace_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:224` + - Legacy replace endpoint: '/projects/\{id\}/data_flows'. - `replace_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:132` + - Source: `nexla_sdk/resources/projects.py:146` - Replace all flows in project. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:104` + - Search resources using filter criteria. - `search_flows(self, project_id: int, filters: List[Dict[str, Any]]) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:200` + - Source: `nexla_sdk/resources/projects.py:252` - Search flows in a project using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:107` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, project_id: int, data: nexla_sdk.models.projects.requests.ProjectUpdate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:74` - Update project. +### QuarantineSettingsResource + +Defined in `nexla_sdk/resources/quarantine_settings.py:7` + +Resource for listing quarantine settings (global endpoints). + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, quarantine_setting_id: int) -> nexla_sdk.models.quarantine_settings.responses.QuarantineSetting` + - Source: `nexla_sdk/resources/quarantine_settings.py:18` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.quarantine_settings.responses.QuarantineSetting]` + - Source: `nexla_sdk/resources/quarantine_settings.py:15` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.quarantine_settings.responses.QuarantineSetting]` + - Source: `nexla_sdk/resources/quarantine_settings.py:21` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. + +### ResourceParametersResource + +Defined in `nexla_sdk/resources/resource_parameters.py:11` + +Resource for managing resource parameters. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.resource_parameters.requests.ResourceParameterCreate, Dict[str, Any]]) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:25` + - Create new resource. +- `delete(self, resource_parameter_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/resource_parameters.py:37` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, resource_parameter_id: int) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:22` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.resource_parameters.responses.ResourceParameter]` + - Source: `nexla_sdk/resources/resource_parameters.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_parameter_id: int, data: Union[nexla_sdk.models.resource_parameters.requests.ResourceParameterUpdate, Dict[str, Any]]) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:30` + - Update resource. + ### RuntimesResource Defined in `nexla_sdk/resources/runtimes.py:8` @@ -1278,8 +4900,14 @@ Methods: - Source: `nexla_sdk/resources/runtimes.py:45` - Activate a custom runtime. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. @@ -1290,33 +4918,275 @@ Methods: - Source: `nexla_sdk/resources/runtimes.py:40` - Delete a custom runtime by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, runtime_id: int) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:27` - Get a custom runtime by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self) -> List[nexla_sdk.models.runtimes.responses.Runtime]` - Source: `nexla_sdk/resources/runtimes.py:16` - List custom runtimes. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, runtime_id: int) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:51` - Pause a custom runtime. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, runtime_id: int, data: nexla_sdk.models.runtimes.requests.RuntimeUpdate) -> nexla_sdk.models.runtimes.responses.Runtime` - Source: `nexla_sdk/resources/runtimes.py:33` - Update a custom runtime by ID. +### SearchHealthResource + +Defined in `nexla_sdk/resources/search_health.py:6` + +Resource for search health endpoints. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/search_health.py:14` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:130` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `test(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/search_health.py:17` +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. + +### SelfSignupBlockedDomainsResource + +Defined in `nexla_sdk/resources/self_signup_blocked_domains.py:6` + +Resource for self-signup blocked domains. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:17` + - Create new resource. +- `delete(self, domain_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:23` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, resource_id: int, expand: bool = False) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:199` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:14` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, domain_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:20` + - Update resource. + ### SelfSignupResource Defined in `nexla_sdk/resources/self_signup.py:7` @@ -1329,10 +5199,16 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. - `add_blocked_domain(self, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:39` + - Source: `nexla_sdk/resources/self_signup.py:40` +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `approve_request(self, request_id: str) -> nexla_sdk.models.self_signup.responses.SelfSignupRequest` - Source: `nexla_sdk/resources/self_signup.py:29` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` @@ -1345,44 +5221,211 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:274` - Delete resource. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `delete_blocked_domain(self, domain_id: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/self_signup.py:51` + - Source: `nexla_sdk/resources/self_signup.py:52` - `get(self, resource_id: int, expand: bool = False) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:199` - Get single resource by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` - Source: `nexla_sdk/resources/base_resource.py:130` - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_blocked_domains(self) -> List[nexla_sdk.models.self_signup.responses.BlockedDomain]` - - Source: `nexla_sdk/resources/self_signup.py:35` + - Source: `nexla_sdk/resources/self_signup.py:36` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `list_requests(self) -> List[nexla_sdk.models.self_signup.responses.SelfSignupRequest]` - Source: `nexla_sdk/resources/self_signup.py:25` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. -- `pause(self, resource_id: int) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:305` - - Pause resource. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `signup(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup.py:16` +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. +- `update_blocked_domain(self, domain_id: str, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` + - Source: `nexla_sdk/resources/self_signup.py:46` +- `verify_email(self, token: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup.py:19` + +### ServiceKeysResource + +Defined in `nexla_sdk/resources/service_keys.py:10` + +Resource for managing service keys. + +Service keys are long-lived credentials for programmatic API access. +Unlike session tokens, service keys don't expire but can be rotated +and have lifecycle management (activate/pause). + +Examples: + # List service keys + keys = client.service_keys.list() + + # List all keys in org (admin only) + all_keys = client.service_keys.list(all_keys=True) + + # Create a service key + key = client.service_keys.create(ServiceKeyCreate( + name="My Service Key", + description="For automated pipelines" + )) + + # Rotate a key + rotated_key = client.service_keys.rotate(key.id) + + # Pause a key + client.service_keys.pause(key.id) + +Methods: + +- `activate(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:151` + - Activate a paused service key. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.service_keys.requests.ServiceKeyCreate, Dict[str, Any]]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:92` + - Create a new service key. +- `delete(self, key_id: Union[int, str]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/service_keys.py:120` + - Delete a service key. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:79` + - Get service key by ID or key value. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, access_role: Optional[str] = None, all_keys: bool = False, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.service_keys.responses.ServiceKey]` + - Source: `nexla_sdk/resources/service_keys.py:47` + - List service keys. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:164` + - Pause a service key (temporarily disable). +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. -- `signup(self, payload: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/self_signup.py:16` -- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` - - Source: `nexla_sdk/resources/base_resource.py:252` - - Update resource. -- `update_blocked_domain(self, domain_id: str, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:45` -- `verify_email(self, token: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/self_signup.py:19` +- `rotate(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:135` + - Rotate a service key to generate a new key value. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, key_id: Union[int, str], data: Union[nexla_sdk.models.service_keys.requests.ServiceKeyUpdate, Dict[str, Any]]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:103` + - Update a service key. ### SourcesResource @@ -1393,51 +5436,203 @@ Resource for managing data sources. Methods: - `activate(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:98` + - Source: `nexla_sdk/resources/sources.py:171` - Activate source. +- `activate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:374` - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, source_id: int, options: Optional[nexla_sdk.models.sources.requests.SourceCopyOptions] = None) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:122` + - Source: `nexla_sdk/resources/sources.py:195` - Copy a source. - `create(self, data: nexla_sdk.models.sources.requests.SourceCreate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:58` + - Source: `nexla_sdk/resources/sources.py:84` - Create new source. +- `create_api_key(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:360` +- `create_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:287` +- `create_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:267` - `delete(self, source_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/sources.py:86` + - Source: `nexla_sdk/resources/sources.py:112` - Delete source. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:386` +- `delete_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:299` +- `delete_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:279` +- `edit_flow_triggers(self, source_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:329` - `get(self, source_id: int, expand: bool = False) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:42` + - Source: `nexla_sdk/resources/sources.py:68` - Get single source by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. +- `get_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:356` - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:283` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_flow(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:124` +- `get_flow_dashboard(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:127` +- `get_flow_logs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:142` +- `get_flow_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:137` +- `get_flow_status_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:132` +- `get_metrics(self, source_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:147` +- `get_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:163` +- `get_quarantine_aggregation(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:396` +- `get_quarantine_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:155` +- `get_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:263` +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_reingested_files(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:255` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.sources.responses.Source]` - Source: `nexla_sdk/resources/sources.py:20` - List sources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:58` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:48` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:52` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/sources.py:55` +- `list_api_keys(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:346` +- `list_data_sinks(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:309` +- `list_flow_triggers(self, source_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:325` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_runs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:321` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:110` + - Source: `nexla_sdk/resources/sources.py:183` - Pause source. +- `pause_all_api_keys(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:382` +- `pause_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:378` +- `probe_authenticate(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:219` +- `probe_detect_schemas(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:239` +- `probe_list_buckets(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:211` +- `probe_list_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:223` +- `probe_quarantine_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:245` +- `probe_read_file(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:233` +- `probe_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:251` +- `probe_summary(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:215` +- `probe_tree(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:229` +- `ready(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:317` +- `reingest_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:259` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `rotate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:370` +- `run_now(self, source_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:313` +- `script_source_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:61` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:42` + - Search resources using filter criteria. +- `search_api_keys(self, source_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:350` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:45` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:306` +- `trigger_quarantine_aggregation(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:390` - `update(self, source_id: int, data: nexla_sdk.models.sources.requests.SourceUpdate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:73` + - Source: `nexla_sdk/resources/sources.py:99` - Update source. +- `update_api_key(self, source_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:364` +- `update_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:293` +- `update_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:273` +- `update_runtime_status(self, source_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:64` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:303` ### TeamsResource -Defined in `nexla_sdk/resources/teams.py:8` +Defined in `nexla_sdk/resources/teams.py:9` Resource for managing teams. @@ -1447,57 +5642,222 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. - `add_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:104` + - Source: `nexla_sdk/resources/teams.py:105` - Add members to team. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.teams.requests.TeamCreate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:50` + - Source: `nexla_sdk/resources/teams.py:51` - Create new team. - `delete(self, team_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/teams.py:78` + - Source: `nexla_sdk/resources/teams.py:79` - Delete team. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, team_id: int, expand: bool = False) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:34` + - Source: `nexla_sdk/resources/teams.py:35` - Get single team by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. -- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` +- `get_audit_log(self, team_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` + - Source: `nexla_sdk/resources/teams.py:155` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_members(self, team_id: int) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:90` + - Source: `nexla_sdk/resources/teams.py:91` - Get team members. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.teams.responses.Team]` - - Source: `nexla_sdk/resources/teams.py:16` + - Source: `nexla_sdk/resources/teams.py:17` - List teams with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. - `remove_members(self, team_id: int, members: Optional[nexla_sdk.models.teams.requests.TeamMemberList] = None) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:136` + - Source: `nexla_sdk/resources/teams.py:137` - Remove members from team. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. - `replace_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:119` + - Source: `nexla_sdk/resources/teams.py:120` - Replace all team members. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `update(self, team_id: int, data: nexla_sdk.models.teams.requests.TeamUpdate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:65` + - Source: `nexla_sdk/resources/teams.py:66` - Update team. +### TokensResource + +Defined in `nexla_sdk/resources/tokens.py:6` + +Resource for auth/token endpoints. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `aws_marketplace_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:39` +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:229` + - Create new resource. +- `create_google_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:20` +- `create_idp_token(self, uid: Optional[str], payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:29` +- `create_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:14` +- `delete(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:274` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, resource_id: int, expand: bool = False) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:199` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:130` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `logout(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:26` +- `metadata(self, uid: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:35` +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `refresh_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:23` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `resource_authorize(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:42` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, resource_id: int, data: Union[Dict[str, Any], Any]) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:252` + - Update resource. +- `update_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:17` + ### TransformsResource Defined in `nexla_sdk/resources/transforms.py:8` @@ -1510,8 +5870,14 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. - `copy(self, transform_id: int) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:50` - Copy a transform by ID. @@ -1522,20 +5888,41 @@ Methods: - Source: `nexla_sdk/resources/transforms.py:46` - Delete a transform by ID. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. - `get(self, transform_id: int, expand: bool = False) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:34` - Get a transform by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/base_resource.py:339` + - Source: `nexla_sdk/resources/base_resource.py:577` - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, **kwargs) -> List[nexla_sdk.models.transforms.responses.Transform]` - Source: `nexla_sdk/resources/transforms.py:16` - List transforms with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). - `list_public(self) -> List[nexla_sdk.models.transforms.responses.Transform]` - Source: `nexla_sdk/resources/transforms.py:54` - List publicly shared transforms. @@ -1545,18 +5932,141 @@ Methods: - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:60` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:63` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `transform(self, transform_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:66` +- `transform_data(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:73` +- `transform_features(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:70` - `update(self, transform_id: int, data: nexla_sdk.models.transforms.requests.TransformUpdate) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:42` - Update an existing transform. -### UsersResource +### UserSettingsResource -Defined in `nexla_sdk/resources/users.py:9` +Defined in `nexla_sdk/resources/user_settings.py:8` -Resource for managing users. +Resource for managing user settings. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.user_settings.requests.UserSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:27` + - Create new resource. +- `delete(self, user_setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/user_settings.py:37` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, user_setting_id: int) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:24` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.user_settings.responses.UserSetting]` + - Source: `nexla_sdk/resources/user_settings.py:16` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.user_settings.responses.UserSetting]` + - Source: `nexla_sdk/resources/user_settings.py:19` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, user_setting_id: int, data: Union[nexla_sdk.models.user_settings.requests.UserSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:30` + - Update resource. + +### UserTiersResource + +Defined in `nexla_sdk/resources/user_tiers.py:7` + +Resource for user tiers. Methods: @@ -1564,78 +6074,687 @@ Methods: - Source: `nexla_sdk/resources/base_resource.py:289` - Activate resource. - `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:398` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:21` + - Create new resource. +- `delete(self, user_tier_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/user_tiers.py:27` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, user_tier_id: int) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:18` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.user_tiers.responses.UserTier]` + - Source: `nexla_sdk/resources/user_tiers.py:15` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, user_tier_id: int, data: Dict[str, Any]) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:24` + - Update resource. + +### UsersResource + +Defined in `nexla_sdk/resources/users.py:10` + +Resource for managing users. + +Methods: + +- `activate(self, user_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:332` + - Activate resource. +- `activate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:462` +- `activate_rate_limited_sources(self, user_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:345` +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `change_password(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:132` - `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:321` - Copy resource. - `create(self, data: nexla_sdk.models.users.requests.UserCreate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:65` + - Source: `nexla_sdk/resources/users.py:69` - Create new user. +- `create_api_key(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:448` +- `create_credit(self, user_id: int, payload: nexla_sdk.models.users.credits.UserCreditCreate) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:398` +- `create_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:302` - `create_quarantine_settings(self, user_id: int, data_credentials_id: int, config: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:134` + - Source: `nexla_sdk/resources/users.py:206` - Create quarantine data export settings. - `delete(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:93` + - Source: `nexla_sdk/resources/users.py:97` - Delete user. - `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:450` + - Source: `nexla_sdk/resources/base_resource.py:688` - Delete access control rules. +- `delete_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:474` +- `delete_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:429` +- `delete_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:314` - `delete_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:168` + - Source: `nexla_sdk/resources/users.py:240` - Delete quarantine data export settings. +- `expire_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:425` - `get(self, user_id: int, expand: bool = False) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:43` + - Source: `nexla_sdk/resources/users.py:47` - Get user by ID. -- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` - Get access control rules for resource. - `get_account_metrics(self, user_id: int, from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None, aggregate: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:258` + - Source: `nexla_sdk/resources/users.py:479` - Get total account metrics for user. +- `get_account_rate_limited(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:354` +- `get_account_summary(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:110` + - Get current user's account summary. +- `get_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:444` +- `get_api_key_events(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:168` +- `get_audit_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:160` - `get_audit_log(self, user_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/users.py:181` + - Source: `nexla_sdk/resources/users.py:258` - Get audit log for a user. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_credit(self, user_id: int, credit_id: int) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:404` - `get_current(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:116` + - Source: `nexla_sdk/resources/users.py:154` - Get info on current user (includes org memberships and current org info). - `get_daily_metrics(self, user_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.UserMetricResourceType, str], from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:339` + - Source: `nexla_sdk/resources/users.py:560` - Get daily data processing metrics for a user. - `get_dashboard_metrics(self, user_id: int, access_role: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:319` + - Source: `nexla_sdk/resources/users.py:540` - Get 24 hour flow stats for user. +- `get_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:254` +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. - `get_flow_status_metrics(self, user_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:290` + - Source: `nexla_sdk/resources/users.py:511` - Get flow status metrics for a user. +- `get_flows_account_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:327` +- `get_flows_dashboard(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:319` +- `get_flows_status_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:323` +- `get_login_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:164` +- `get_metrics(self, user_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:180` +- `get_orgs(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:188` - `get_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:121` + - Source: `nexla_sdk/resources/users.py:193` - Get quarantine data export settings for user. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_resource_audit_log(self, user_id: int, resource_type: str, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:172` - `get_settings(self) -> List[nexla_sdk.models.users.responses.UserSettings]` - - Source: `nexla_sdk/resources/users.py:105` + - Source: `nexla_sdk/resources/users.py:143` - Get current user's settings. +- `get_sso_options(self, email: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:136` +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. - `get_transferable_resources(self, user_id: int, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:225` + - Source: `nexla_sdk/resources/users.py:359` - Get a list of resources owned by a user that can be transferred. +- `get_user_account_summary(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:114` + - Get account summary for a specific user. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.users.responses.User]` - - Source: `nexla_sdk/resources/users.py:17` + - Source: `nexla_sdk/resources/users.py:18` - List users with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_api_keys(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:434` +- `list_credits(self, user_id: int, **params) -> List[nexla_sdk.models.users.credits.UserCredit]` + - Source: `nexla_sdk/resources/users.py:393` +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `list_sso_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:44` +- `lock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:337` - `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` - Source: `nexla_sdk/resources/base_resource.py:181` - Get paginator for iterating through resources. +- `password_entropy(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:126` - `pause(self, resource_id: int) -> ~T` - Source: `nexla_sdk/resources/base_resource.py:305` - Pause resource. +- `pause_all_api_keys(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:470` +- `pause_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:466` +- `refresh_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:421` + - Alias for refresh_credits. +- `refresh_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:417` +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. - `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` - - Source: `nexla_sdk/resources/base_resource.py:424` + - Source: `nexla_sdk/resources/base_resource.py:662` - Replace all access control rules. +- `reset_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:120` +- `rotate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:458` +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_api_keys(self, user_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:438` +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `send_invite(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:129` +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:123` +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. - `transfer_resources(self, user_id: int, org_id: int, delegate_owner_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:240` + - Source: `nexla_sdk/resources/users.py:374` - Transfer a user's resources to another user within an organization. +- `unlock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:341` - `update(self, user_id: int, data: nexla_sdk.models.users.requests.UserUpdate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:80` + - Source: `nexla_sdk/resources/users.py:84` - Update user. +- `update_api_key(self, user_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:452` +- `update_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:308` - `update_quarantine_settings(self, user_id: int, data: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:152` + - Source: `nexla_sdk/resources/users.py:224` - Update quarantine data export settings. +- `use_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:413` + - Alias for use_credits. +- `use_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:409` + +### ValidatorsResource + +Defined in `nexla_sdk/resources/validators.py:14` + +Resource for managing validators (data validation rules). + +Validators are code containers used to validate data within flows. +They support various code types including Python, JavaScript, and Jolt. + +Examples: + # List validators + validators = client.validators.list() + + # Get a specific validator + validator = client.validators.get(123) + + # Create a Python validator + validator = client.validators.create(ValidatorCreate( + name="My Validator", + code_type="python", + code="def validate(record): return record['value'] > 0" + )) + + # List public validators + public_validators = client.validators.list_public() + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, validator_id: int, options: Union[nexla_sdk.models.validators.requests.ValidatorCopyOptions, Dict[str, Any], NoneType] = None) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:145` + - Copy a validator. +- `create(self, data: Union[nexla_sdk.models.validators.requests.ValidatorCreate, Dict[str, Any]]) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:109` + - Create a new validator. +- `delete(self, validator_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/validators.py:134` + - Delete a validator. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `get(self, validator_id: int, expand: bool = False) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:97` + - Get validator by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, expand: bool = False, **kwargs) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:48` + - List validators with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:74` + - List publicly available validators. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any]) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:174` + - Search validators (alias to search_tags endpoint). +- `search_tags(self, tags: List[str]) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:161` + - Search validators by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, validator_id: int, data: Union[nexla_sdk.models.validators.requests.ValidatorUpdate, Dict[str, Any]]) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:120` + - Update a validator. + +### VendorEndpointsResource + +Defined in `nexla_sdk/resources/vendor_endpoints.py:11` + +Resource for managing vendor endpoints. + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.vendor_endpoints.requests.VendorEndpointCreate, Dict[str, Any]]) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:25` + - Create new resource. +- `delete(self, vendor_endpoint_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:37` + - Delete resource. +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:43` +- `get(self, vendor_endpoint_id: int) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:22` + - Get single resource by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, **kwargs) -> List[nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:19` + - List resources with optional filters. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, vendor_endpoint_id: int, data: Union[nexla_sdk.models.vendor_endpoints.requests.VendorEndpointUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:30` + - Update resource. +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:40` + +### VendorsResource + +Defined in `nexla_sdk/resources/vendors.py:10` + +Resource for managing vendors. + +Vendors represent third-party service providers that can be +connected via auth templates and endpoints. + +Write operations (create, update, delete) require super user access. + +Examples: + # List all vendors + vendors = client.vendors.list() + + # Get a vendor by ID + vendor = client.vendors.get(123) + + # Get a vendor by name + vendor = client.vendors.get_by_name("salesforce") + + # Create a vendor (super user only) + vendor = client.vendors.create(VendorCreate( + name="new_vendor", + display_name="New Vendor" + )) + + # Update a vendor (super user only) + vendor = client.vendors.update(123, VendorUpdate( + description="Updated description" + )) + + # Delete a vendor (super user only) + client.vendors.delete(123) + +Methods: + +- `activate(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:289` + - Activate resource. +- `add_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:636` + - Add access control rules. +- `add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:465` + - Add documentation entries for a resource. +- `add_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:549` + - Add tags to a resource. +- `copy(self, resource_id: int, options: Union[Dict[str, Any], Any, NoneType] = None) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:321` + - Copy resource. +- `create(self, data: Union[nexla_sdk.models.vendors.requests.VendorCreate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:111` + - Create a new vendor (super user only). +- `delete(self, vendor_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:155` + - Delete a vendor (super user only). +- `delete_accessors(self, resource_id: int, accessors: Optional[List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]] = None) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:688` + - Delete access control rules. +- `delete_all(self, payload: Dict[str, Any] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:182` + - Delete vendors via collection endpoint. +- `delete_auth_template(self, vendor_id: int, auth_template_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:186` + - Delete an auth template from a vendor (super user only). +- `delete_by_name(self, vendor_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:166` + - Delete a vendor by name (super user only). +- `get(self, vendor_id: int, expand: bool = False) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:80` + - Get vendor by ID. +- `get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:380` + - Explain why the current user can access a resource. +- `get_accessors(self, resource_id: int) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:618` + - Get access control rules for resource. +- `get_audit_log(self, resource_id: int, from_date: Optional[str] = None, to_date: Optional[str] = None, event_filter: Optional[str] = None, change_filter: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/base_resource.py:577` + - Get audit log for resource. +- `get_by_name(self, vendor_name: str, expand: bool = False) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:95` + - Get vendor by name. +- `get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:508` + - Get control event info for a resource. +- `get_docs(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:438` + - Get documentation entries for a resource. +- `get_referenced_by(self, resource_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:495` + - Get resources that reference this resource. +- `get_tags(self, resource_id: int) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:522` + - Get tags for a resource. +- `get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:394` + - Get access insights for all users with access to a resource. +- `list(self, expand: bool = False, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.vendors.responses.Vendor]` + - Source: `nexla_sdk/resources/vendors.py:53` + - List vendors. +- `list_accessible(self, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:366` + - List resources accessible to the current user (access_insights). +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None, **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:339` + - List publicly available resources for this type. +- `paginate(self, per_page: int = 20, access_role: Optional[str] = None, **params) -> nexla_sdk.utils.pagination.Paginator[~T]` + - Source: `nexla_sdk/resources/base_resource.py:181` + - Get paginator for iterating through resources. +- `pause(self, resource_id: int) -> ~T` + - Source: `nexla_sdk/resources/base_resource.py:305` + - Pause resource. +- `remove_docs(self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:479` + - Remove documentation entries for a resource. +- `remove_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:563` + - Remove tags from a resource. +- `replace_accessors(self, resource_id: int, accessors: List[Union[nexla_sdk.models.access.requests.UserAccessorRequest, nexla_sdk.models.access.requests.TeamAccessorRequest, nexla_sdk.models.access.requests.OrgAccessorRequest]]) -> List[Union[nexla_sdk.models.access.responses.UserAccessorResponse, nexla_sdk.models.access.responses.TeamAccessorResponse, nexla_sdk.models.access.responses.OrgAccessorResponse]]` + - Source: `nexla_sdk/resources/base_resource.py:662` + - Replace all access control rules. +- `search(self, filters: Dict[str, Any], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:408` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[~T]` + - Source: `nexla_sdk/resources/base_resource.py:423` + - Search resources by tags. +- `set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/base_resource.py:451` + - Replace documentation entries for a resource. +- `set_tags(self, resource_id: int, tags: List[str]) -> List[str]` + - Source: `nexla_sdk/resources/base_resource.py:535` + - Replace all tags for a resource. +- `update(self, vendor_id: int, data: Union[nexla_sdk.models.vendors.requests.VendorUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:122` + - Update a vendor (super user only). +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:178` + - Update vendors via collection endpoint. +- `update_by_name(self, vendor_name: str, data: Union[nexla_sdk.models.vendors.requests.VendorUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:136` + - Update a vendor by name (super user only). diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.metrics.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.metrics.mdx index 7e492a4..66b72b2 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.metrics.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.metrics.mdx @@ -20,14 +20,14 @@ so no additional typed overrides are needed. Methods: -- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: int = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:216` +- `get_flow_logs(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, run_id: int, from_ts: int, to_ts: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowLogsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:220` - Get flow logs for a flow run keyed by resource ID. -- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: str = None, groupby: str = None, orderby: str = None, page: int = None, per_page: int = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` - - Source: `nexla_sdk/resources/metrics.py:162` +- `get_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, from_date: str, to_date: Optional[str] = None, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None) -> Union[nexla_sdk.models.metrics.responses.ResourceFlowMetricsResponse, Dict[str, Any]]` + - Source: `nexla_sdk/resources/metrics.py:166` - Get flow metrics for a flow node keyed by resource ID. - `get_flow_metrics_summary(self, period: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:148` + - Source: `nexla_sdk/resources/metrics.py:152` - Get flow metrics summary for a given period. - `get_rate_limits(self) -> Dict[str, Any]` - Source: `nexla_sdk/resources/metrics.py:111` @@ -36,9 +36,12 @@ Methods: - Source: `nexla_sdk/resources/metrics.py:39` - Get daily metrics for a resource. - `get_resource_flow_metrics(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, metric_type: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/metrics.py:121` + - Source: `nexla_sdk/resources/metrics.py:125` - Get flow metrics for a specific resource. - `get_resource_metrics_by_run(self, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], resource_id: int, groupby: Optional[str] = None, orderby: Optional[str] = None, page: Optional[int] = None, size: Optional[int] = None) -> nexla_sdk.models.metrics.responses.MetricsByRunResponse` - Source: `nexla_sdk/resources/metrics.py:70` - Get metrics by run for a resource. +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/metrics.py:121` + - Publish raw metrics (super user only). diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.nexsets.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.nexsets.mdx index 470c15b..e617d6e 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.nexsets.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.nexsets.mdx @@ -10,40 +10,182 @@ keywords: [Nexla, SDK, Python, API] ### NexsetsResource -Defined in `nexla_sdk/resources/nexsets.py:12` +Defined in `nexla_sdk/resources/nexsets.py:14` Resource for managing nexsets (data sets). Methods: - `activate(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:94` + - Source: `nexla_sdk/resources/nexsets.py:146` - Activate nexset. +- `activate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:430` +- `add_samples(self, set_id: int, samples: Any) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:209` +- `add_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:321` +- `bulk_update_catalog_refs(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:399` +- `catalog_add(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:261` - `copy(self, set_id: int, options: Optional[nexla_sdk.models.nexsets.requests.NexsetCopyOptions] = None) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:147` + - Source: `nexla_sdk/resources/nexsets.py:216` - Copy a nexset. +- `copy_docs(self, src_id: int, dst_id: int) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:536` + - Copy all documentation entries from one nexset to another. - `create(self, data: nexla_sdk.models.nexsets.requests.NexsetCreate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:54` + - Source: `nexla_sdk/resources/nexsets.py:106` - Create new nexset. +- `create_api_key(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:416` +- `create_catalog_ref(self, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:385` +- `create_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:297` +- `create_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:277` - `delete(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:82` + - Source: `nexla_sdk/resources/nexsets.py:134` - Delete nexset. +- `delete_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:442` +- `delete_catalog_ref(self, ref_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:395` +- `delete_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:309` +- `delete_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:289` - `docs_recommendation(self, set_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/nexsets.py:161` + - Source: `nexla_sdk/resources/nexsets.py:456` - Generate AI suggestion for Nexset documentation. - `get(self, set_id: int, expand: bool = False) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:38` + - Source: `nexla_sdk/resources/nexsets.py:90` - Get single nexset by ID. +- `get_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:412` +- `get_catalog_ref(self, ref_id: int) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:380` +- `get_characteristics(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:353` +- `get_dashboard_transforms(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:293` +- `get_data_update_time(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:349` +- `get_flow(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:234` +- `get_flow_dashboard(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:237` +- `get_flow_logs(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:249` +- `get_flow_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:245` +- `get_flow_status_metrics(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:241` +- `get_metrics(self, set_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:253` +- `get_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:345` +- `get_quarantine_aggregation(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:452` +- `get_quarantine_offset(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:341` +- `get_quarantine_settings(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:273` - `get_samples(self, set_id: int, count: int = 10, include_metadata: bool = False, live: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` - - Source: `nexla_sdk/resources/nexsets.py:118` + - Source: `nexla_sdk/resources/nexsets.py:170` - Get sample records from a nexset. - `list(self, **kwargs) -> List[nexla_sdk.models.nexsets.responses.Nexset]` - - Source: `nexla_sdk/resources/nexsets.py:20` + - Source: `nexla_sdk/resources/nexsets.py:22` - List nexsets with optional filters. +- `list_all(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:40` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:44` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/nexsets.py:47` +- `list_api_keys(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:402` +- `list_available(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:50` +- `list_catalog_refs(self, **params) -> List[nexla_sdk.models.catalog_refs.responses.CatalogRef]` + - Source: `nexla_sdk/resources/nexsets.py:375` +- `list_characteristics_search(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:72` +- `list_docs(self, set_id: int, expand: bool = True) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:461` + - List documentation entries attached to a nexset. +- `list_nexset_api_compatible(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:80` +- `list_public(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:63` + - List publicly available resources for this type. +- `list_shared(self, **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:59` +- `list_sharers(self, set_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:313` +- `list_summary(self, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:77` +- `mark_shared(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:331` - `pause(self, set_id: int) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:106` + - Source: `nexla_sdk/resources/nexsets.py:158` - Pause nexset. +- `pause_all_api_keys(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:438` +- `pause_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:434` +- `probe_quarantine_sample(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:335` +- `remove_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:325` +- `rotate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:426` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:361` + - Search resources using filter criteria. +- `search_api_keys(self, set_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:406` +- `search_available(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:54` +- `search_public_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:67` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.nexsets.responses.Nexset]` + - Source: `nexla_sdk/resources/nexsets.py:364` + - Search resources by tags. +- `semantic_schemas(self, set_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:265` +- `set_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/nexsets.py:317` +- `summary(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:357` +- `sync_with_catalog(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:230` +- `transform(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:269` +- `trigger_quarantine_aggregation(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:446` +- `unvote(self, set_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:371` - `update(self, set_id: int, data: nexla_sdk.models.nexsets.requests.NexsetUpdate) -> nexla_sdk.models.nexsets.responses.Nexset` - - Source: `nexla_sdk/resources/nexsets.py:69` + - Source: `nexla_sdk/resources/nexsets.py:121` - Update nexset. +- `update_api_key(self, set_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:420` +- `update_catalog_ref(self, ref_id: int, payload: Dict[str, Any]) -> nexla_sdk.models.catalog_refs.responses.CatalogRef` + - Source: `nexla_sdk/resources/nexsets.py:390` +- `update_dashboard_transforms(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:303` +- `update_docs(self, set_id: int, docs: List[Union[nexla_sdk.models.doc_containers.requests.DocContainerInput, Dict[str, Any]]]) -> List[nexla_sdk.models.doc_containers.responses.DocContainer]` + - Source: `nexla_sdk/resources/nexsets.py:491` + - Replace all documentation entries on a nexset. +- `update_quarantine_settings(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:283` +- `update_runtime_status(self, set_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:86` +- `update_samples(self, set_id: int, samples: Any, replace: bool = False) -> List[nexla_sdk.models.nexsets.responses.NexsetSample]` + - Source: `nexla_sdk/resources/nexsets.py:199` +- `vote(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/nexsets.py:367` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_channel_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_channel_settings.mdx new file mode 100644 index 0000000..d90e7d6 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_channel_settings.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.resources.notification_channel_settings +title: nexla_sdk.resources.notification_channel_settings +slug: /api/python/modules/nexla_sdk/resources/notification_channel_settings +description: API for nexla_sdk.resources.notification_channel_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationChannelSettingsResource + +Defined in `nexla_sdk/resources/notification_channel_settings.py:13` + +Resource for managing notification channel settings. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.notification_channel_settings.requests.NotificationChannelSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:27` + - Create new resource. +- `delete(self, setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_channel_settings.py:39` + - Delete resource. +- `get(self, setting_id: int) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:24` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting]` + - Source: `nexla_sdk/resources/notification_channel_settings.py:21` + - List resources with optional filters. +- `update(self, setting_id: int, data: Union[nexla_sdk.models.notification_channel_settings.requests.NotificationChannelSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_channel_settings.responses.NotificationChannelSetting` + - Source: `nexla_sdk/resources/notification_channel_settings.py:32` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_settings.mdx new file mode 100644 index 0000000..3d7b9da --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_settings.mdx @@ -0,0 +1,81 @@ +--- +id: nexla_sdk.resources.notification_settings +title: nexla_sdk.resources.notification_settings +slug: /api/python/modules/nexla_sdk/resources/notification_settings +description: API for nexla_sdk.resources.notification_settings +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing notification settings. + +## Classes + +### NotificationSettingsResource + +Defined in `nexla_sdk/resources/notification_settings.py:13` + +Resource for managing notification settings. + +Notification settings control how and when users receive notifications +for different events and resources. + +Examples: + # List notification settings + settings = client.notification_settings.list() + + # Get a specific setting + setting = client.notification_settings.get(123) + + # Create a new notification setting + setting = client.notification_settings.create(NotificationSettingCreate( + notification_type_id=1, + channel="email", + priority=5 + )) + + # Update a setting + setting = client.notification_settings.update(123, NotificationSettingUpdate( + priority=10 + )) + +Methods: + +- `create(self, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:137` + - Create a new notification setting. +- `delete(self, setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_settings.py:166` + - Delete a notification setting. +- `get(self, setting_id: int, expand: bool = False) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:125` + - Get notification setting by ID. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, notification_resource_type: Optional[str] = None, resource_id: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None, **kwargs) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:49` + - List notification settings for the current user. +- `list_all(self, page: Optional[int] = None, per_page: Optional[int] = None, resource_type: Optional[str] = None, event_type: Optional[str] = None, status: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:90` + - List all notification settings (super user only). +- `list_by(self, payload: Dict[str, Any], method: str = 'POST') -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:247` +- `org_create(self, org_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:288` + - Create a notification setting for an organization. +- `org_delete(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notification_settings.py:326` + - Delete an organization notification setting. +- `org_index(self, org_id: int, page: Optional[int] = None, per_page: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:254` + - List notification settings for an organization. +- `org_update(self, org_id: int, notification_settings_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:305` + - Update an organization notification setting. +- `show_resource_settings(self, resource_type: str, resource_id: int, notification_type_id: Optional[int] = None, page: Optional[int] = None, per_page: Optional[int] = None, filter_overridden_settings: bool = False) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:177` + - Get notification settings for a specific resource. +- `show_type_settings(self, notification_type_id: int, page: Optional[int] = None, per_page: Optional[int] = None, sort_by: Optional[str] = None, sort_order: Optional[str] = None) -> List[nexla_sdk.models.notification_settings.responses.NotificationSetting]` + - Source: `nexla_sdk/resources/notification_settings.py:213` + - Get notification settings for a specific notification type. +- `update(self, setting_id: int, data: Union[nexla_sdk.models.notification_settings.requests.NotificationSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.notification_settings.responses.NotificationSetting` + - Source: `nexla_sdk/resources/notification_settings.py:150` + - Update a notification setting. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_types.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_types.mdx new file mode 100644 index 0000000..f6ff9cd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.notification_types.mdx @@ -0,0 +1,24 @@ +--- +id: nexla_sdk.resources.notification_types +title: nexla_sdk.resources.notification_types +slug: /api/python/modules/nexla_sdk/resources/notification_types +description: API for nexla_sdk.resources.notification_types +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### NotificationTypesResource + +Defined in `nexla_sdk/resources/notification_types.py:7` + +Resource for listing notification types. + +Methods: + +- `list(self) -> List[nexla_sdk.models.notification_types.responses.NotificationType]` + - Source: `nexla_sdk/resources/notification_types.py:15` + - List resources with optional filters. +- `list_all(self) -> List[nexla_sdk.models.notification_types.responses.NotificationType]` + - Source: `nexla_sdk/resources/notification_types.py:19` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.notifications.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.notifications.mdx index cfe3b02..3cab429 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.notifications.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.notifications.mdx @@ -17,66 +17,72 @@ Resource for managing notifications. Methods: - `create_channel_setting(self, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:195` + - Source: `nexla_sdk/resources/notifications.py:221` - Create notification channel setting. - `create_setting(self, data: nexla_sdk.models.notifications.requests.NotificationSettingCreate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:285` + - Source: `nexla_sdk/resources/notifications.py:311` - Create notification setting. - `delete(self, notification_id: int) -> Dict[str, Any]` - Source: `nexla_sdk/resources/notifications.py:40` - Delete notification. -- `delete_all(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:90` +- `delete_all(self, payload: Optional[Dict[str, Any]] = None, async_mode: bool = False) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:96` - Delete all notifications. - `delete_channel_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:242` + - Source: `nexla_sdk/resources/notifications.py:268` - Delete notification channel setting. - `delete_setting(self, setting_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:330` + - Source: `nexla_sdk/resources/notifications.py:356` - Delete notification setting. - `get(self, notification_id: int, expand: bool = False) -> nexla_sdk.models.notifications.responses.Notification` - Source: `nexla_sdk/resources/notifications.py:27` - Get single notification by ID. - `get_channel_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:211` + - Source: `nexla_sdk/resources/notifications.py:237` - Get notification channel setting. - `get_count(self, read: Optional[int] = None) -> nexla_sdk.models.notifications.responses.NotificationCount` - - Source: `nexla_sdk/resources/notifications.py:100` + - Source: `nexla_sdk/resources/notifications.py:111` - Get notification count. - `get_resource_settings(self, resource_type: str, resource_id: int, expand: bool = False, filter_overridden: bool = False, notification_type_id: Optional[int] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:361` + - Source: `nexla_sdk/resources/notifications.py:387` - Get notification settings for a resource. - `get_setting(self, setting_id: int) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:299` + - Source: `nexla_sdk/resources/notifications.py:325` - Get notification setting. - `get_settings_by_type(self, notification_type_id: int, expand: bool = False) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:343` + - Source: `nexla_sdk/resources/notifications.py:369` - Get notification settings for a type. - `get_type(self, event_type: str, resource_type: str) -> nexla_sdk.models.notifications.responses.NotificationType` - - Source: `nexla_sdk/resources/notifications.py:167` + - Source: `nexla_sdk/resources/notifications.py:193` - Get specific notification type. - `get_types(self, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationType]` - - Source: `nexla_sdk/resources/notifications.py:152` + - Source: `nexla_sdk/resources/notifications.py:178` - Get all notification types. -- `list(self, read: Optional[int] = None, level: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` +- `list(self, read: Optional[int] = None, level: Optional[str] = None, resource_id: Optional[int] = None, resource_type: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.notifications.responses.Notification]` - Source: `nexla_sdk/resources/notifications.py:52` - List notifications with optional filters. - `list_channel_settings(self) -> List[nexla_sdk.models.notifications.responses.NotificationChannelSetting]` - - Source: `nexla_sdk/resources/notifications.py:184` + - Source: `nexla_sdk/resources/notifications.py:210` - List notification channel settings. - `list_settings(self, event_type: Optional[str] = None, resource_type: Optional[str] = None, status: Optional[str] = None) -> List[nexla_sdk.models.notifications.responses.NotificationSetting]` - - Source: `nexla_sdk/resources/notifications.py:256` + - Source: `nexla_sdk/resources/notifications.py:282` - List notification settings. - `mark_read(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:115` + - Source: `nexla_sdk/resources/notifications.py:126` - Mark notifications as read. +- `mark_read_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:162` - `mark_unread(self, notification_ids: Union[List[int], str]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/notifications.py:133` + - Source: `nexla_sdk/resources/notifications.py:144` - Mark notifications as unread. +- `mark_unread_for(self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:168` +- `publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/notifications.py:174` - `update_channel_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationChannelSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationChannelSetting` - - Source: `nexla_sdk/resources/notifications.py:225` + - Source: `nexla_sdk/resources/notifications.py:251` - Update notification channel setting. - `update_setting(self, setting_id: int, data: nexla_sdk.models.notifications.requests.NotificationSettingUpdate) -> nexla_sdk.models.notifications.responses.NotificationSetting` - - Source: `nexla_sdk/resources/notifications.py:313` + - Source: `nexla_sdk/resources/notifications.py:339` - Update notification setting. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.org_auth_configs.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.org_auth_configs.mdx index 97c87da..dd9ac46 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.org_auth_configs.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.org_auth_configs.mdx @@ -16,22 +16,31 @@ Resource for organization authentication configurations (/api_auth_configs). Methods: +- `client_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:30` + - Get client config for API auth. - `create(self, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:31` + - Source: `nexla_sdk/resources/org_auth_configs.py:43` - Create a new authentication configuration. - `delete(self, auth_config_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/org_auth_configs.py:45` + - Source: `nexla_sdk/resources/org_auth_configs.py:57` - Delete an authentication configuration by ID. - `get(self, auth_config_id: int) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:26` + - Source: `nexla_sdk/resources/org_auth_configs.py:38` - Get a specific authentication configuration by ID. +- `info(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:34` + - Get API auth info. - `list(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - Source: `nexla_sdk/resources/org_auth_configs.py:16` - List authentication configurations for the current organization. - `list_all(self) -> List[nexla_sdk.models.org_auth_configs.responses.AuthConfig]` - Source: `nexla_sdk/resources/org_auth_configs.py:21` - List all authentication configurations (admin only). +- `list_sign_on_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_auth_configs.py:26` + - List sign-on options (public). - `update(self, auth_config_id: int, payload: nexla_sdk.models.org_auth_configs.requests.AuthConfigPayload) -> nexla_sdk.models.org_auth_configs.responses.AuthConfig` - - Source: `nexla_sdk/resources/org_auth_configs.py:37` + - Source: `nexla_sdk/resources/org_auth_configs.py:49` - Update an existing authentication configuration. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.org_tiers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.org_tiers.mdx new file mode 100644 index 0000000..53e27fd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.org_tiers.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.resources.org_tiers +title: nexla_sdk.resources.org_tiers +slug: /api/python/modules/nexla_sdk/resources/org_tiers +description: API for nexla_sdk.resources.org_tiers +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### OrgTiersResource + +Defined in `nexla_sdk/resources/org_tiers.py:7` + +Resource for organization tiers. + +Methods: + +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:21` + - Create new resource. +- `delete(self, org_tier_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/org_tiers.py:27` + - Delete resource. +- `get(self, org_tier_id: int) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:18` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.org_tiers.responses.OrgTier]` + - Source: `nexla_sdk/resources/org_tiers.py:15` + - List resources with optional filters. +- `update(self, org_tier_id: int, data: Dict[str, Any]) -> nexla_sdk.models.org_tiers.responses.OrgTier` + - Source: `nexla_sdk/resources/org_tiers.py:24` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.organizations.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.organizations.mdx index 6407785..6b41c79 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.organizations.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.organizations.mdx @@ -16,69 +16,125 @@ Resource for managing organizations. Methods: +- `activate_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:273` - `activate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:173` + - Source: `nexla_sdk/resources/organizations.py:190` - Activate members in an organization. +- `activate_org(self, org_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:245` +- `activate_rate_limited_sources(self, org_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:236` - `add_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:365` + - Source: `nexla_sdk/resources/organizations.py:501` - `create(self, data: nexla_sdk.models.organizations.requests.OrganizationCreate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:61` + - Source: `nexla_sdk/resources/organizations.py:65` - Create a new organization. Note: This is an admin-only operation. +- `create_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:335` +- `create_notification_settings(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:285` - `deactivate_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberActivateDeactivateRequest) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:156` + - Source: `nexla_sdk/resources/organizations.py:173` - Deactivate members in an organization. - `delete(self, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:86` + - Source: `nexla_sdk/resources/organizations.py:90` - Delete organization. +- `delete_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:347` - `delete_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberDelete) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:142` + - Source: `nexla_sdk/resources/organizations.py:159` - Remove members from organization. +- `delete_notification_settings(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:297` +- `disable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:315` +- `enable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:311` - `get(self, org_id: int, expand: bool = False) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:48` + - Source: `nexla_sdk/resources/organizations.py:52` - Get single organization by ID. +- `get_account_rate_limited(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:232` - `get_account_summary(self, org_id: int) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:190` + - Source: `nexla_sdk/resources/organizations.py:207` - Get account summary statistics for an organization. - `get_audit_log(self, org_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:227` + - Source: `nexla_sdk/resources/organizations.py:363` - Get audit log for an organization. - `get_auth_settings(self, org_id: int) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/organizations.py:316` + - Source: `nexla_sdk/resources/organizations.py:452` - Get authentication settings for organization. +- `get_clusters(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:265` - `get_current_account_summary(self) -> nexla_sdk.models.organizations.responses.AccountSummary` - - Source: `nexla_sdk/resources/organizations.py:204` + - Source: `nexla_sdk/resources/organizations.py:221` - Get account summary for the current organization based on auth token. - `get_custodians(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:348` + - Source: `nexla_sdk/resources/organizations.py:484` +- `get_dashboard_transforms(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:331` +- `get_data_sets_catalog_config(self, config_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:307` - `get_flow_status_metrics(self, org_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:269` + - Source: `nexla_sdk/resources/organizations.py:405` - Get flow status metrics for an organization. +- `get_flows_account_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:359` +- `get_flows_dashboard(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:351` +- `get_flows_report(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:261` +- `get_flows_status_metrics(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:355` +- `get_login_history(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:102` - `get_members(self, org_id: int) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:98` + - Source: `nexla_sdk/resources/organizations.py:115` - Get all members in organization. +- `get_metrics(self, org_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:107` - `get_org_flow_account_metrics(self, org_id: int, from_date: str, to_date: str = None, aggregate: str = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:215` + - Source: `nexla_sdk/resources/organizations.py:319` - Get total account metrics for an organization (flows). - `get_resource_audit_log(self, org_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.ResourceType, str], **params) -> List[nexla_sdk.models.common.LogEntry]` - - Source: `nexla_sdk/resources/organizations.py:294` + - Source: `nexla_sdk/resources/organizations.py:430` - Get audit log for a specific resource type within an organization. - `list(self, **kwargs) -> List[nexla_sdk.models.organizations.responses.Organization]` - Source: `nexla_sdk/resources/organizations.py:30` - List organizations with optional filters. +- `list_all(self, **params) -> List[nexla_sdk.models.organizations.responses.Organization]` + - Source: `nexla_sdk/resources/organizations.py:48` +- `list_data_sets_catalog_configs(self, org_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:303` +- `list_notification_settings(self, org_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/organizations.py:281` - `remove_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:375` + - Source: `nexla_sdk/resources/organizations.py:511` - `replace_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:127` + - Source: `nexla_sdk/resources/organizations.py:144` - Replace all members in organization. +- `revert_cluster(self, org_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:277` +- `set_rate_limits(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:253` +- `throttle(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:257` - `update(self, org_id: int, data: nexla_sdk.models.organizations.requests.OrganizationUpdate) -> nexla_sdk.models.organizations.responses.Organization` - - Source: `nexla_sdk/resources/organizations.py:73` + - Source: `nexla_sdk/resources/organizations.py:77` - Update organization. - `update_auth_setting(self, org_id: int, auth_setting_id: int, enabled: bool) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/organizations.py:329` + - Source: `nexla_sdk/resources/organizations.py:465` - Enable/disable authentication configuration. +- `update_cluster(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:269` - `update_custodians(self, org_id: int, payload: nexla_sdk.models.organizations.custodians.OrgCustodiansPayload) -> List[nexla_sdk.models.organizations.responses.CustodianUser]` - - Source: `nexla_sdk/resources/organizations.py:355` + - Source: `nexla_sdk/resources/organizations.py:491` +- `update_dashboard_transforms(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:341` - `update_members(self, org_id: int, members: nexla_sdk.models.organizations.requests.OrgMemberList) -> List[nexla_sdk.models.organizations.responses.OrgMember]` - - Source: `nexla_sdk/resources/organizations.py:112` + - Source: `nexla_sdk/resources/organizations.py:129` - Add or update members in organization. +- `update_notification_settings(self, org_id: int, notification_settings_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/organizations.py:291` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.projects.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.projects.mdx index 09350d8..920badb 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.projects.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.projects.mdx @@ -17,11 +17,17 @@ Resource for managing projects. Methods: - `add_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:170` + - Source: `nexla_sdk/resources/projects.py:184` - Backward-compatible alias for adding flows to a project. +- `add_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:215` + - Legacy add endpoint: '/projects/\{id\}/data_flows'. - `add_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:113` + - Source: `nexla_sdk/resources/projects.py:127` - Add flows to project. +- `copy(self, project_id: int, payload: Optional[Dict[str, Any]] = None) -> nexla_sdk.models.projects.responses.Project` + - Source: `nexla_sdk/resources/projects.py:99` + - Copy resource. - `create(self, data: nexla_sdk.models.projects.requests.ProjectCreate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:59` - Create new project. @@ -31,27 +37,44 @@ Methods: - `get(self, project_id: int, expand: bool = False) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:43` - Get single project by ID. +- `get_data_flows_legacy(self, project_id: int) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:194` + - Legacy project flow listing endpoint. - `get_flows(self, project_id: int) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:99` + - Source: `nexla_sdk/resources/projects.py:113` - Get flows in project. +- `get_resources_access(self, project_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/projects.py:110` - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.projects.responses.Project]` - Source: `nexla_sdk/resources/projects.py:21` - List projects with optional filters. - `remove_data_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:190` + - Source: `nexla_sdk/resources/projects.py:233` - Backward-compatible alias for removing flows from a project. +- `remove_data_flows_legacy(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:243` + - Legacy remove endpoint: '/projects/\{id\}/data_flows'. - `remove_flows(self, project_id: int, flows: Optional[nexla_sdk.models.projects.requests.ProjectFlowList] = None) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:151` + - Source: `nexla_sdk/resources/projects.py:165` - Remove flows from project. - `replace_data_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:180` + - Source: `nexla_sdk/resources/projects.py:205` - Backward-compatible alias for replacing all flows in a project. +- `replace_data_flows_legacy(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` + - Source: `nexla_sdk/resources/projects.py:224` + - Legacy replace endpoint: '/projects/\{id\}/data_flows'. - `replace_flows(self, project_id: int, flows: nexla_sdk.models.projects.requests.ProjectFlowList) -> List[nexla_sdk.models.projects.responses.ProjectDataFlow]` - - Source: `nexla_sdk/resources/projects.py:132` + - Source: `nexla_sdk/resources/projects.py:146` - Replace all flows in project. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:104` + - Search resources using filter criteria. - `search_flows(self, project_id: int, filters: List[Dict[str, Any]]) -> nexla_sdk.models.flows.responses.FlowResponse` - - Source: `nexla_sdk/resources/projects.py:200` + - Source: `nexla_sdk/resources/projects.py:252` - Search flows in a project using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.projects.responses.Project]` + - Source: `nexla_sdk/resources/projects.py:107` + - Search resources by tags. - `update(self, project_id: int, data: nexla_sdk.models.projects.requests.ProjectUpdate) -> nexla_sdk.models.projects.responses.Project` - Source: `nexla_sdk/resources/projects.py:74` - Update project. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.quarantine_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.quarantine_settings.mdx new file mode 100644 index 0000000..edb4964 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.quarantine_settings.mdx @@ -0,0 +1,27 @@ +--- +id: nexla_sdk.resources.quarantine_settings +title: nexla_sdk.resources.quarantine_settings +slug: /api/python/modules/nexla_sdk/resources/quarantine_settings +description: API for nexla_sdk.resources.quarantine_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### QuarantineSettingsResource + +Defined in `nexla_sdk/resources/quarantine_settings.py:7` + +Resource for listing quarantine settings (global endpoints). + +Methods: + +- `get(self, quarantine_setting_id: int) -> nexla_sdk.models.quarantine_settings.responses.QuarantineSetting` + - Source: `nexla_sdk/resources/quarantine_settings.py:18` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.quarantine_settings.responses.QuarantineSetting]` + - Source: `nexla_sdk/resources/quarantine_settings.py:15` + - List resources with optional filters. +- `list_all(self, **params) -> List[nexla_sdk.models.quarantine_settings.responses.QuarantineSetting]` + - Source: `nexla_sdk/resources/quarantine_settings.py:21` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.resource_parameters.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.resource_parameters.mdx new file mode 100644 index 0000000..3432e60 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.resource_parameters.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.resources.resource_parameters +title: nexla_sdk.resources.resource_parameters +slug: /api/python/modules/nexla_sdk/resources/resource_parameters +description: API for nexla_sdk.resources.resource_parameters +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### ResourceParametersResource + +Defined in `nexla_sdk/resources/resource_parameters.py:11` + +Resource for managing resource parameters. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.resource_parameters.requests.ResourceParameterCreate, Dict[str, Any]]) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:25` + - Create new resource. +- `delete(self, resource_parameter_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/resource_parameters.py:37` + - Delete resource. +- `get(self, resource_parameter_id: int) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:22` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.resource_parameters.responses.ResourceParameter]` + - Source: `nexla_sdk/resources/resource_parameters.py:19` + - List resources with optional filters. +- `update(self, resource_parameter_id: int, data: Union[nexla_sdk.models.resource_parameters.requests.ResourceParameterUpdate, Dict[str, Any]]) -> nexla_sdk.models.resource_parameters.responses.ResourceParameter` + - Source: `nexla_sdk/resources/resource_parameters.py:30` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.search_health.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.search_health.mdx new file mode 100644 index 0000000..feb3011 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.search_health.mdx @@ -0,0 +1,24 @@ +--- +id: nexla_sdk.resources.search_health +title: nexla_sdk.resources.search_health +slug: /api/python/modules/nexla_sdk/resources/search_health +description: API for nexla_sdk.resources.search_health +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### SearchHealthResource + +Defined in `nexla_sdk/resources/search_health.py:6` + +Resource for search health endpoints. + +Methods: + +- `get(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/search_health.py:14` + - Get single resource by ID. +- `test(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/search_health.py:17` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup.mdx index 4f77c91..c9a6e1f 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup.mdx @@ -17,19 +17,19 @@ Resource for self sign-up and admin endpoints. Methods: - `add_blocked_domain(self, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:39` + - Source: `nexla_sdk/resources/self_signup.py:40` - `approve_request(self, request_id: str) -> nexla_sdk.models.self_signup.responses.SelfSignupRequest` - Source: `nexla_sdk/resources/self_signup.py:29` - `delete_blocked_domain(self, domain_id: str) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/self_signup.py:51` + - Source: `nexla_sdk/resources/self_signup.py:52` - `list_blocked_domains(self) -> List[nexla_sdk.models.self_signup.responses.BlockedDomain]` - - Source: `nexla_sdk/resources/self_signup.py:35` + - Source: `nexla_sdk/resources/self_signup.py:36` - `list_requests(self) -> List[nexla_sdk.models.self_signup.responses.SelfSignupRequest]` - Source: `nexla_sdk/resources/self_signup.py:25` - `signup(self, payload: Dict[str, Any]) -> Dict[str, Any]` - Source: `nexla_sdk/resources/self_signup.py:16` - `update_blocked_domain(self, domain_id: str, domain: str) -> nexla_sdk.models.self_signup.responses.BlockedDomain` - - Source: `nexla_sdk/resources/self_signup.py:45` + - Source: `nexla_sdk/resources/self_signup.py:46` - `verify_email(self, token: str) -> Dict[str, Any]` - Source: `nexla_sdk/resources/self_signup.py:19` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup_blocked_domains.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup_blocked_domains.mdx new file mode 100644 index 0000000..df77188 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.self_signup_blocked_domains.mdx @@ -0,0 +1,31 @@ +--- +id: nexla_sdk.resources.self_signup_blocked_domains +title: nexla_sdk.resources.self_signup_blocked_domains +slug: /api/python/modules/nexla_sdk/resources/self_signup_blocked_domains +description: API for nexla_sdk.resources.self_signup_blocked_domains +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### SelfSignupBlockedDomainsResource + +Defined in `nexla_sdk/resources/self_signup_blocked_domains.py:6` + +Resource for self-signup blocked domains. + +Methods: + +- `create(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:17` + - Create new resource. +- `delete(self, domain_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:23` + - Delete resource. +- `list(self, **kwargs) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:14` + - List resources with optional filters. +- `update(self, domain_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/self_signup_blocked_domains.py:20` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.service_keys.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.service_keys.mdx new file mode 100644 index 0000000..a15e69d --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.service_keys.mdx @@ -0,0 +1,68 @@ +--- +id: nexla_sdk.resources.service_keys +title: nexla_sdk.resources.service_keys +slug: /api/python/modules/nexla_sdk/resources/service_keys +description: API for nexla_sdk.resources.service_keys +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing service keys. + +## Classes + +### ServiceKeysResource + +Defined in `nexla_sdk/resources/service_keys.py:10` + +Resource for managing service keys. + +Service keys are long-lived credentials for programmatic API access. +Unlike session tokens, service keys don't expire but can be rotated +and have lifecycle management (activate/pause). + +Examples: + # List service keys + keys = client.service_keys.list() + + # List all keys in org (admin only) + all_keys = client.service_keys.list(all_keys=True) + + # Create a service key + key = client.service_keys.create(ServiceKeyCreate( + name="My Service Key", + description="For automated pipelines" + )) + + # Rotate a key + rotated_key = client.service_keys.rotate(key.id) + + # Pause a key + client.service_keys.pause(key.id) + +Methods: + +- `activate(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:151` + - Activate a paused service key. +- `create(self, data: Union[nexla_sdk.models.service_keys.requests.ServiceKeyCreate, Dict[str, Any]]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:92` + - Create a new service key. +- `delete(self, key_id: Union[int, str]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/service_keys.py:120` + - Delete a service key. +- `get(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:79` + - Get service key by ID or key value. +- `list(self, access_role: Optional[str] = None, all_keys: bool = False, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.service_keys.responses.ServiceKey]` + - Source: `nexla_sdk/resources/service_keys.py:47` + - List service keys. +- `pause(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:164` + - Pause a service key (temporarily disable). +- `rotate(self, key_id: Union[int, str]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:135` + - Rotate a service key to generate a new key value. +- `update(self, key_id: Union[int, str], data: Union[nexla_sdk.models.service_keys.requests.ServiceKeyUpdate, Dict[str, Any]]) -> nexla_sdk.models.service_keys.responses.ServiceKey` + - Source: `nexla_sdk/resources/service_keys.py:103` + - Update a service key. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.sources.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.sources.mdx index bdc066f..b7befc7 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.sources.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.sources.mdx @@ -17,27 +17,140 @@ Resource for managing data sources. Methods: - `activate(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:98` + - Source: `nexla_sdk/resources/sources.py:171` - Activate source. +- `activate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:374` - `copy(self, source_id: int, options: Optional[nexla_sdk.models.sources.requests.SourceCopyOptions] = None) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:122` + - Source: `nexla_sdk/resources/sources.py:195` - Copy a source. - `create(self, data: nexla_sdk.models.sources.requests.SourceCreate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:58` + - Source: `nexla_sdk/resources/sources.py:84` - Create new source. +- `create_api_key(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:360` +- `create_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:287` +- `create_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:267` - `delete(self, source_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/sources.py:86` + - Source: `nexla_sdk/resources/sources.py:112` - Delete source. +- `delete_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:386` +- `delete_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:299` +- `delete_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:279` +- `edit_flow_triggers(self, source_id: int, payload: Dict[str, Any], mode: str, all_triggers: bool = False) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:329` - `get(self, source_id: int, expand: bool = False) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:42` + - Source: `nexla_sdk/resources/sources.py:68` - Get single source by ID. +- `get_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:356` +- `get_dashboard_transforms(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:283` +- `get_flow(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:124` +- `get_flow_dashboard(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:127` +- `get_flow_logs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:142` +- `get_flow_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:137` +- `get_flow_status_metrics(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:132` +- `get_metrics(self, source_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:147` +- `get_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:163` +- `get_quarantine_aggregation(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:396` +- `get_quarantine_offset(self, source_id: int, data_set_id: Optional[int] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:155` +- `get_quarantine_settings(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:263` +- `get_reingested_files(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:255` - `list(self, **kwargs) -> List[nexla_sdk.models.sources.responses.Source]` - Source: `nexla_sdk/resources/sources.py:20` - List sources with optional filters. +- `list_accessible(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:58` + - List resources accessible to the current user (access_insights). +- `list_all(self, **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:48` +- `list_all_condensed(self, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:52` +- `list_all_ids(self, **params) -> List[int]` + - Source: `nexla_sdk/resources/sources.py:55` +- `list_api_keys(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:346` +- `list_data_sinks(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:309` +- `list_flow_triggers(self, source_id: int) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/sources.py:325` +- `list_runs(self, source_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:321` - `pause(self, source_id: int) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:110` + - Source: `nexla_sdk/resources/sources.py:183` - Pause source. +- `pause_all_api_keys(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:382` +- `pause_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:378` +- `probe_authenticate(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:219` +- `probe_detect_schemas(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:239` +- `probe_list_buckets(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:211` +- `probe_list_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:223` +- `probe_quarantine_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:245` +- `probe_read_file(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:233` +- `probe_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:251` +- `probe_summary(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:215` +- `probe_tree(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:229` +- `ready(self, source_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:317` +- `reingest_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:259` +- `rotate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:370` +- `run_now(self, source_id: int, method: str = 'POST') -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:313` +- `script_source_config(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:61` +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:42` + - Search resources using filter criteria. +- `search_api_keys(self, source_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:350` +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.sources.responses.Source]` + - Source: `nexla_sdk/resources/sources.py:45` + - Search resources by tags. +- `test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:306` +- `trigger_quarantine_aggregation(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:390` - `update(self, source_id: int, data: nexla_sdk.models.sources.requests.SourceUpdate) -> nexla_sdk.models.sources.responses.Source` - - Source: `nexla_sdk/resources/sources.py:73` + - Source: `nexla_sdk/resources/sources.py:99` - Update source. +- `update_api_key(self, source_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:364` +- `update_dashboard_transforms(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:293` +- `update_quarantine_settings(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:273` +- `update_runtime_status(self, source_id: int, status: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:64` +- `validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/sources.py:303` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.teams.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.teams.mdx index 9212270..252d23f 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.teams.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.teams.mdx @@ -10,37 +10,40 @@ keywords: [Nexla, SDK, Python, API] ### TeamsResource -Defined in `nexla_sdk/resources/teams.py:8` +Defined in `nexla_sdk/resources/teams.py:9` Resource for managing teams. Methods: - `add_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:104` + - Source: `nexla_sdk/resources/teams.py:105` - Add members to team. - `create(self, data: nexla_sdk.models.teams.requests.TeamCreate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:50` + - Source: `nexla_sdk/resources/teams.py:51` - Create new team. - `delete(self, team_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/teams.py:78` + - Source: `nexla_sdk/resources/teams.py:79` - Delete team. - `get(self, team_id: int, expand: bool = False) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:34` + - Source: `nexla_sdk/resources/teams.py:35` - Get single team by ID. +- `get_audit_log(self, team_id: int, **params) -> List[nexla_sdk.models.common.LogEntry]` + - Source: `nexla_sdk/resources/teams.py:155` + - Get audit log for resource. - `get_members(self, team_id: int) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:90` + - Source: `nexla_sdk/resources/teams.py:91` - Get team members. - `list(self, **kwargs) -> List[nexla_sdk.models.teams.responses.Team]` - - Source: `nexla_sdk/resources/teams.py:16` + - Source: `nexla_sdk/resources/teams.py:17` - List teams with optional filters. - `remove_members(self, team_id: int, members: Optional[nexla_sdk.models.teams.requests.TeamMemberList] = None) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:136` + - Source: `nexla_sdk/resources/teams.py:137` - Remove members from team. - `replace_members(self, team_id: int, members: nexla_sdk.models.teams.requests.TeamMemberList) -> List[nexla_sdk.models.teams.responses.TeamMember]` - - Source: `nexla_sdk/resources/teams.py:119` + - Source: `nexla_sdk/resources/teams.py:120` - Replace all team members. - `update(self, team_id: int, data: nexla_sdk.models.teams.requests.TeamUpdate) -> nexla_sdk.models.teams.responses.Team` - - Source: `nexla_sdk/resources/teams.py:65` + - Source: `nexla_sdk/resources/teams.py:66` - Update team. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.tokens.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.tokens.mdx new file mode 100644 index 0000000..b85a581 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.tokens.mdx @@ -0,0 +1,37 @@ +--- +id: nexla_sdk.resources.tokens +title: nexla_sdk.resources.tokens +slug: /api/python/modules/nexla_sdk/resources/tokens +description: API for nexla_sdk.resources.tokens +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### TokensResource + +Defined in `nexla_sdk/resources/tokens.py:6` + +Resource for auth/token endpoints. + +Methods: + +- `aws_marketplace_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:39` +- `create_google_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:20` +- `create_idp_token(self, uid: Optional[str], payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:29` +- `create_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:14` +- `logout(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:26` +- `metadata(self, uid: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:35` +- `refresh_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:23` +- `resource_authorize(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:42` +- `update_token(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/tokens.py:17` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.transforms.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.transforms.mdx index d78c78e..006dee0 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.transforms.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.transforms.mdx @@ -34,6 +34,18 @@ Methods: - `list_public(self) -> List[nexla_sdk.models.transforms.responses.Transform]` - Source: `nexla_sdk/resources/transforms.py:54` - List publicly shared transforms. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:60` + - Search resources using filter criteria. +- `search_tags(self, tags: List[str], **params) -> List[nexla_sdk.models.transforms.responses.Transform]` + - Source: `nexla_sdk/resources/transforms.py:63` + - Search resources by tags. +- `transform(self, transform_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:66` +- `transform_data(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:73` +- `transform_features(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/transforms.py:70` - `update(self, transform_id: int, data: nexla_sdk.models.transforms.requests.TransformUpdate) -> nexla_sdk.models.transforms.responses.Transform` - Source: `nexla_sdk/resources/transforms.py:42` - Update an existing transform. diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.user_settings.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.user_settings.mdx new file mode 100644 index 0000000..371f53f --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.user_settings.mdx @@ -0,0 +1,37 @@ +--- +id: nexla_sdk.resources.user_settings +title: nexla_sdk.resources.user_settings +slug: /api/python/modules/nexla_sdk/resources/user_settings +description: API for nexla_sdk.resources.user_settings +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserSettingsResource + +Defined in `nexla_sdk/resources/user_settings.py:8` + +Resource for managing user settings. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.user_settings.requests.UserSettingCreate, Dict[str, Any]]) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:27` + - Create new resource. +- `delete(self, user_setting_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/user_settings.py:37` + - Delete resource. +- `get(self, user_setting_id: int) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:24` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.user_settings.responses.UserSetting]` + - Source: `nexla_sdk/resources/user_settings.py:16` + - List resources with optional filters. +- `search(self, filters: Dict[str, Any], **params) -> List[nexla_sdk.models.user_settings.responses.UserSetting]` + - Source: `nexla_sdk/resources/user_settings.py:19` + - Search resources using filter criteria. +- `update(self, user_setting_id: int, data: Union[nexla_sdk.models.user_settings.requests.UserSettingUpdate, Dict[str, Any]]) -> nexla_sdk.models.user_settings.responses.UserSetting` + - Source: `nexla_sdk/resources/user_settings.py:30` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.user_tiers.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.user_tiers.mdx new file mode 100644 index 0000000..e63c6cd --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.user_tiers.mdx @@ -0,0 +1,34 @@ +--- +id: nexla_sdk.resources.user_tiers +title: nexla_sdk.resources.user_tiers +slug: /api/python/modules/nexla_sdk/resources/user_tiers +description: API for nexla_sdk.resources.user_tiers +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### UserTiersResource + +Defined in `nexla_sdk/resources/user_tiers.py:7` + +Resource for user tiers. + +Methods: + +- `create(self, data: Dict[str, Any]) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:21` + - Create new resource. +- `delete(self, user_tier_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/user_tiers.py:27` + - Delete resource. +- `get(self, user_tier_id: int) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:18` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.user_tiers.responses.UserTier]` + - Source: `nexla_sdk/resources/user_tiers.py:15` + - List resources with optional filters. +- `update(self, user_tier_id: int, data: Dict[str, Any]) -> nexla_sdk.models.user_tiers.responses.UserTier` + - Source: `nexla_sdk/resources/user_tiers.py:24` + - Update resource. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.users.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.users.mdx index 116cd21..7a972fd 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.resources.users.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.users.mdx @@ -10,64 +10,161 @@ keywords: [Nexla, SDK, Python, API] ### UsersResource -Defined in `nexla_sdk/resources/users.py:9` +Defined in `nexla_sdk/resources/users.py:10` Resource for managing users. Methods: +- `activate(self, user_id: int, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:332` + - Activate resource. +- `activate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:462` +- `activate_rate_limited_sources(self, user_id: int, status: Optional[str] = None, activate: bool = True) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:345` +- `change_password(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:132` - `create(self, data: nexla_sdk.models.users.requests.UserCreate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:65` + - Source: `nexla_sdk/resources/users.py:69` - Create new user. +- `create_api_key(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:448` +- `create_credit(self, user_id: int, payload: nexla_sdk.models.users.credits.UserCreditCreate) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:398` +- `create_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:302` - `create_quarantine_settings(self, user_id: int, data_credentials_id: int, config: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:134` + - Source: `nexla_sdk/resources/users.py:206` - Create quarantine data export settings. - `delete(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:93` + - Source: `nexla_sdk/resources/users.py:97` - Delete user. +- `delete_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:474` +- `delete_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:429` +- `delete_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:314` - `delete_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:168` + - Source: `nexla_sdk/resources/users.py:240` - Delete quarantine data export settings. +- `expire_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:425` - `get(self, user_id: int, expand: bool = False) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:43` + - Source: `nexla_sdk/resources/users.py:47` - Get user by ID. - `get_account_metrics(self, user_id: int, from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None, aggregate: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:258` + - Source: `nexla_sdk/resources/users.py:479` - Get total account metrics for user. +- `get_account_rate_limited(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:354` +- `get_account_summary(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:110` + - Get current user's account summary. +- `get_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:444` +- `get_api_key_events(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:168` +- `get_audit_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:160` - `get_audit_log(self, user_id: int, from_date: str = None, to_date: str = None, event_filter: str = None, change_filter: str = None, page: int = None, per_page: int = None) -> List[Dict[str, Any]]` - - Source: `nexla_sdk/resources/users.py:181` + - Source: `nexla_sdk/resources/users.py:258` - Get audit log for a user. +- `get_credit(self, user_id: int, credit_id: int) -> nexla_sdk.models.users.credits.UserCredit` + - Source: `nexla_sdk/resources/users.py:404` - `get_current(self) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:116` + - Source: `nexla_sdk/resources/users.py:154` - Get info on current user (includes org memberships and current org info). - `get_daily_metrics(self, user_id: int, resource_type: Union[nexla_sdk.models.metrics.enums.UserMetricResourceType, str], from_date: str, to_date: Optional[str] = None, org_id: Optional[int] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:339` + - Source: `nexla_sdk/resources/users.py:560` - Get daily data processing metrics for a user. - `get_dashboard_metrics(self, user_id: int, access_role: Optional[str] = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:319` + - Source: `nexla_sdk/resources/users.py:540` - Get 24 hour flow stats for user. +- `get_dashboard_transforms(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:254` - `get_flow_status_metrics(self, user_id: int, from_date: str = None, page: int = None, per_page: int = None) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:290` + - Source: `nexla_sdk/resources/users.py:511` - Get flow status metrics for a user. +- `get_flows_account_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:327` +- `get_flows_dashboard(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:319` +- `get_flows_status_metrics(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:323` +- `get_login_history(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:164` +- `get_metrics(self, user_id: int, metrics_name: Optional[str] = None, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:180` +- `get_orgs(self, user_id: int, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:188` - `get_quarantine_settings(self, user_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:121` + - Source: `nexla_sdk/resources/users.py:193` - Get quarantine data export settings for user. +- `get_resource_audit_log(self, user_id: int, resource_type: str, **params) -> List[Dict[str, Any]]` + - Source: `nexla_sdk/resources/users.py:172` - `get_settings(self) -> List[nexla_sdk.models.users.responses.UserSettings]` - - Source: `nexla_sdk/resources/users.py:105` + - Source: `nexla_sdk/resources/users.py:143` - Get current user's settings. +- `get_sso_options(self, email: Optional[str] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:136` - `get_transferable_resources(self, user_id: int, org_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:225` + - Source: `nexla_sdk/resources/users.py:359` - Get a list of resources owned by a user that can be transferred. +- `get_user_account_summary(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:114` + - Get account summary for a specific user. - `list(self, expand: bool = False, **kwargs) -> List[nexla_sdk.models.users.responses.User]` - - Source: `nexla_sdk/resources/users.py:17` + - Source: `nexla_sdk/resources/users.py:18` - List users with optional filters. +- `list_api_keys(self, user_id: int, **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:434` +- `list_credits(self, user_id: int, **params) -> List[nexla_sdk.models.users.credits.UserCredit]` + - Source: `nexla_sdk/resources/users.py:393` +- `list_sso_options(self) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:44` +- `lock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:337` +- `password_entropy(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:126` +- `pause_all_api_keys(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:470` +- `pause_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:466` +- `refresh_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:421` + - Alias for refresh_credits. +- `refresh_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:417` +- `reset_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:120` +- `rotate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:458` +- `search_api_keys(self, user_id: int, filters: Dict[str, Any], **params) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:438` +- `send_invite(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:129` +- `set_password(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:123` - `transfer_resources(self, user_id: int, org_id: int, delegate_owner_id: int) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:240` + - Source: `nexla_sdk/resources/users.py:374` - Transfer a user's resources to another user within an organization. +- `unlock_account(self, user_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:341` - `update(self, user_id: int, data: nexla_sdk.models.users.requests.UserUpdate) -> nexla_sdk.models.users.responses.User` - - Source: `nexla_sdk/resources/users.py:80` + - Source: `nexla_sdk/resources/users.py:84` - Update user. +- `update_api_key(self, user_id: int, api_key_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:452` +- `update_dashboard_transforms(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:308` - `update_quarantine_settings(self, user_id: int, data: Dict[str, Any]) -> Dict[str, Any]` - - Source: `nexla_sdk/resources/users.py:152` + - Source: `nexla_sdk/resources/users.py:224` - Update quarantine data export settings. +- `use_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:413` + - Alias for use_credits. +- `use_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/users.py:409` diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.validators.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.validators.mdx new file mode 100644 index 0000000..6c1a0d2 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.validators.mdx @@ -0,0 +1,68 @@ +--- +id: nexla_sdk.resources.validators +title: nexla_sdk.resources.validators +slug: /api/python/modules/nexla_sdk/resources/validators +description: API for nexla_sdk.resources.validators +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing validators (data validation rules). + +## Classes + +### ValidatorsResource + +Defined in `nexla_sdk/resources/validators.py:14` + +Resource for managing validators (data validation rules). + +Validators are code containers used to validate data within flows. +They support various code types including Python, JavaScript, and Jolt. + +Examples: + # List validators + validators = client.validators.list() + + # Get a specific validator + validator = client.validators.get(123) + + # Create a Python validator + validator = client.validators.create(ValidatorCreate( + name="My Validator", + code_type="python", + code="def validate(record): return record['value'] > 0" + )) + + # List public validators + public_validators = client.validators.list_public() + +Methods: + +- `copy(self, validator_id: int, options: Union[nexla_sdk.models.validators.requests.ValidatorCopyOptions, Dict[str, Any], NoneType] = None) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:145` + - Copy a validator. +- `create(self, data: Union[nexla_sdk.models.validators.requests.ValidatorCreate, Dict[str, Any]]) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:109` + - Create a new validator. +- `delete(self, validator_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/validators.py:134` + - Delete a validator. +- `get(self, validator_id: int, expand: bool = False) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:97` + - Get validator by ID. +- `list(self, page: Optional[int] = None, per_page: Optional[int] = None, access_role: Optional[str] = None, expand: bool = False, **kwargs) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:48` + - List validators with optional filters. +- `list_public(self, page: Optional[int] = None, per_page: Optional[int] = None) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:74` + - List publicly available validators. +- `search(self, filters: Dict[str, Any]) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:174` + - Search validators (alias to search_tags endpoint). +- `search_tags(self, tags: List[str]) -> List[nexla_sdk.models.validators.responses.Validator]` + - Source: `nexla_sdk/resources/validators.py:161` + - Search validators by tags. +- `update(self, validator_id: int, data: Union[nexla_sdk.models.validators.requests.ValidatorUpdate, Dict[str, Any]]) -> nexla_sdk.models.validators.responses.Validator` + - Source: `nexla_sdk/resources/validators.py:120` + - Update a validator. + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.vendor_endpoints.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.vendor_endpoints.mdx new file mode 100644 index 0000000..0d709ef --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.vendor_endpoints.mdx @@ -0,0 +1,38 @@ +--- +id: nexla_sdk.resources.vendor_endpoints +title: nexla_sdk.resources.vendor_endpoints +slug: /api/python/modules/nexla_sdk/resources/vendor_endpoints +description: API for nexla_sdk.resources.vendor_endpoints +keywords: [Nexla, SDK, Python, API] +--- + +## Classes + +### VendorEndpointsResource + +Defined in `nexla_sdk/resources/vendor_endpoints.py:11` + +Resource for managing vendor endpoints. + +Methods: + +- `create(self, data: Union[nexla_sdk.models.vendor_endpoints.requests.VendorEndpointCreate, Dict[str, Any]]) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:25` + - Create new resource. +- `delete(self, vendor_endpoint_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:37` + - Delete resource. +- `delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:43` +- `get(self, vendor_endpoint_id: int) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:22` + - Get single resource by ID. +- `list(self, **kwargs) -> List[nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:19` + - List resources with optional filters. +- `update(self, vendor_endpoint_id: int, data: Union[nexla_sdk.models.vendor_endpoints.requests.VendorEndpointUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendor_endpoints.responses.VendorEndpoint` + - Source: `nexla_sdk/resources/vendor_endpoints.py:30` + - Update resource. +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendor_endpoints.py:40` + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.resources.vendors.mdx b/docs-site/docs/api/python/modules/nexla_sdk.resources.vendors.mdx new file mode 100644 index 0000000..087fa02 --- /dev/null +++ b/docs-site/docs/api/python/modules/nexla_sdk.resources.vendors.mdx @@ -0,0 +1,83 @@ +--- +id: nexla_sdk.resources.vendors +title: nexla_sdk.resources.vendors +slug: /api/python/modules/nexla_sdk/resources/vendors +description: API for nexla_sdk.resources.vendors +keywords: [Nexla, SDK, Python, API] +--- + +Resource for managing vendors. + +## Classes + +### VendorsResource + +Defined in `nexla_sdk/resources/vendors.py:10` + +Resource for managing vendors. + +Vendors represent third-party service providers that can be +connected via auth templates and endpoints. + +Write operations (create, update, delete) require super user access. + +Examples: + # List all vendors + vendors = client.vendors.list() + + # Get a vendor by ID + vendor = client.vendors.get(123) + + # Get a vendor by name + vendor = client.vendors.get_by_name("salesforce") + + # Create a vendor (super user only) + vendor = client.vendors.create(VendorCreate( + name="new_vendor", + display_name="New Vendor" + )) + + # Update a vendor (super user only) + vendor = client.vendors.update(123, VendorUpdate( + description="Updated description" + )) + + # Delete a vendor (super user only) + client.vendors.delete(123) + +Methods: + +- `create(self, data: Union[nexla_sdk.models.vendors.requests.VendorCreate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:111` + - Create a new vendor (super user only). +- `delete(self, vendor_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:155` + - Delete a vendor (super user only). +- `delete_all(self, payload: Dict[str, Any] = None) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:182` + - Delete vendors via collection endpoint. +- `delete_auth_template(self, vendor_id: int, auth_template_id: int) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:186` + - Delete an auth template from a vendor (super user only). +- `delete_by_name(self, vendor_name: str) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:166` + - Delete a vendor by name (super user only). +- `get(self, vendor_id: int, expand: bool = False) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:80` + - Get vendor by ID. +- `get_by_name(self, vendor_name: str, expand: bool = False) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:95` + - Get vendor by name. +- `list(self, expand: bool = False, page: Optional[int] = None, per_page: Optional[int] = None, **kwargs) -> List[nexla_sdk.models.vendors.responses.Vendor]` + - Source: `nexla_sdk/resources/vendors.py:53` + - List vendors. +- `update(self, vendor_id: int, data: Union[nexla_sdk.models.vendors.requests.VendorUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:122` + - Update a vendor (super user only). +- `update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]` + - Source: `nexla_sdk/resources/vendors.py:178` + - Update vendors via collection endpoint. +- `update_by_name(self, vendor_name: str, data: Union[nexla_sdk.models.vendors.requests.VendorUpdate, Dict[str, Any]]) -> nexla_sdk.models.vendors.responses.Vendor` + - Source: `nexla_sdk/resources/vendors.py:136` + - Update a vendor by name (super user only). + diff --git a/docs-site/docs/api/python/modules/nexla_sdk.telemetry.mdx b/docs-site/docs/api/python/modules/nexla_sdk.telemetry.mdx index 2f6ca4d..b11d312 100644 --- a/docs-site/docs/api/python/modules/nexla_sdk.telemetry.mdx +++ b/docs-site/docs/api/python/modules/nexla_sdk.telemetry.mdx @@ -16,13 +16,13 @@ or OpenTelemetry isn't available, a no-op tracer is provided. ### `get_tracer(trace_enabled: bool)` -Source: `nexla_sdk/telemetry.py:58` +Source: `nexla_sdk/telemetry.py:56` Return an OpenTelemetry tracer if available and enabled, otherwise a no-op tracer. ### `is_tracing_configured() -> bool` -Source: `nexla_sdk/telemetry.py:84` +Source: `nexla_sdk/telemetry.py:82` Heuristically detect if OpenTelemetry tracing is configured globally. diff --git a/nexla_sdk/__init__.py b/nexla_sdk/__init__.py index 010e8f0..b33a08e 100644 --- a/nexla_sdk/__init__.py +++ b/nexla_sdk/__init__.py @@ -52,6 +52,7 @@ UserStatus, UserTier, ) +from nexla_sdk.raw_operations import RawOperationsClient # Import resources from nexla_sdk.resources import ( @@ -84,6 +85,7 @@ __all__ = [ # Client "NexlaClient", + "RawOperationsClient", # Resources "CredentialsResource", "FlowsResource", diff --git a/nexla_sdk/client.py b/nexla_sdk/client.py index 156c407..f194093 100644 --- a/nexla_sdk/client.py +++ b/nexla_sdk/client.py @@ -18,30 +18,60 @@ ValidationError, ) from .http_client import HttpClientError, HttpClientInterface, RequestsHttpClient +from .raw_operations import RawOperationsClient +from .resources.api_keys import ApiKeysResource from .resources.approval_requests import ApprovalRequestsResource from .resources.async_tasks import AsyncTasksResource from .resources.attribute_transforms import AttributeTransformsResource +from .resources.auth_parameters import AuthParametersResource +from .resources.auth_templates import AuthTemplatesResource +from .resources.catalog_configs import CatalogConfigsResource +from .resources.cluster_endpoints import ClusterEndpointsResource +from .resources.clusters import ClustersResource from .resources.code_containers import CodeContainersResource +from .resources.connectors import ConnectorsResource from .resources.credentials import CredentialsResource +from .resources.cubejs import CubeJsResource +from .resources.custom_data_flows import CustomDataFlowsResource +from .resources.dashboard_transforms import DashboardTransformsResource +from .resources.data_credentials_groups import DataCredentialsGroupsResource +from .resources.data_flows import DataFlowsResource from .resources.data_schemas import DataSchemasResource from .resources.destinations import DestinationsResource from .resources.doc_containers import DocContainersResource +from .resources.flow_nodes import FlowNodesResource +from .resources.flow_triggers import FlowTriggersResource from .resources.flows import FlowsResource from .resources.genai import GenAIResource from .resources.lookups import LookupsResource from .resources.marketplace import MarketplaceResource from .resources.metrics import MetricsResource from .resources.nexsets import NexsetsResource +from .resources.notification_channel_settings import NotificationChannelSettingsResource +from .resources.notification_settings import NotificationSettingsResource +from .resources.notification_types import NotificationTypesResource from .resources.notifications import NotificationsResource from .resources.org_auth_configs import OrgAuthConfigsResource +from .resources.org_tiers import OrgTiersResource from .resources.organizations import OrganizationsResource from .resources.projects import ProjectsResource +from .resources.quarantine_settings import QuarantineSettingsResource +from .resources.resource_parameters import ResourceParametersResource from .resources.runtimes import RuntimesResource +from .resources.search_health import SearchHealthResource from .resources.self_signup import SelfSignupResource +from .resources.self_signup_blocked_domains import SelfSignupBlockedDomainsResource +from .resources.service_keys import ServiceKeysResource from .resources.sources import SourcesResource from .resources.teams import TeamsResource +from .resources.tokens import TokensResource from .resources.transforms import TransformsResource +from .resources.user_settings import UserSettingsResource +from .resources.user_tiers import UserTiersResource from .resources.users import UsersResource +from .resources.validators import ValidatorsResource +from .resources.vendor_endpoints import VendorEndpointsResource +from .resources.vendors import VendorsResource from .resources.webhooks import WebhooksResource logger = logging.getLogger(__name__) @@ -98,7 +128,7 @@ def __init__( access_token: Nexla access token for direct authentication (mutually exclusive with service_key) base_url: Nexla API base URL (defaults to environment variable or standard URL) api_version: API version to use - token_refresh_margin: Seconds before token expiry to trigger refresh (default: 5 minutes) + token_refresh_margin: Seconds before token expiry to trigger refresh (default: 1 hour) http_client: HTTP client implementation (defaults to RequestsHttpClient) trace_enabled: Explicitly enable/disable OpenTelemetry tracing. If None, tracing auto-enables when a global OTEL config is detected. @@ -164,18 +194,32 @@ def __init__( http_client=self.http_client, ) + # Full operation-level API access (OpenAPI operation_id based) + self.raw: RawOperationsClient = RawOperationsClient(self) + # Initialize API endpoints self.flows = FlowsResource(self) + self.flow_nodes = FlowNodesResource(self) + self.data_flows = DataFlowsResource(self) self.sources = SourcesResource(self) self.destinations = DestinationsResource(self) self.credentials = CredentialsResource(self) + self.custom_data_flows = CustomDataFlowsResource(self) + self.data_credentials_groups = DataCredentialsGroupsResource(self) self.lookups = LookupsResource(self) self.nexsets = NexsetsResource(self) self.users = UsersResource(self) + self.user_settings = UserSettingsResource(self) + self.user_tiers = UserTiersResource(self) self.organizations = OrganizationsResource(self) self.teams = TeamsResource(self) self.projects = ProjectsResource(self) self.notifications = NotificationsResource(self) + self.notification_settings = NotificationSettingsResource(self) + self.notification_channel_settings = NotificationChannelSettingsResource(self) + self.notification_types = NotificationTypesResource(self) + self.quarantine_settings = QuarantineSettingsResource(self) + self.dashboard_transforms = DashboardTransformsResource(self) self.metrics = MetricsResource(self) self.code_containers = CodeContainersResource(self) self.transforms = TransformsResource(self) @@ -185,10 +229,34 @@ def __init__( self.runtimes = RuntimesResource(self) self.marketplace = MarketplaceResource(self) self.org_auth_configs = OrgAuthConfigsResource(self) + self.org_tiers = OrgTiersResource(self) + self.auth_parameters = AuthParametersResource(self) + self.resource_parameters = ResourceParametersResource(self) + self.catalog_configs = CatalogConfigsResource(self) + self.vendor_endpoints = VendorEndpointsResource(self) self.genai = GenAIResource(self) self.self_signup = SelfSignupResource(self) + self.self_signup_blocked_domains = SelfSignupBlockedDomainsResource(self) self.doc_containers = DocContainersResource(self) self.data_schemas = DataSchemasResource(self) + self.tokens = TokensResource(self) + self.search_health = SearchHealthResource(self) + self.cubejs = CubeJsResource(self) + + # Phase 1 resources + self.validators = ValidatorsResource(self) + self.service_keys = ServiceKeysResource(self) + self.flow_triggers = FlowTriggersResource(self) + + # Phase 3 resources + self.clusters = ClustersResource(self) + self.cluster_endpoints = ClusterEndpointsResource(self) + + # Phase 4 resources + self.api_keys = ApiKeysResource(self) + self.connectors = ConnectorsResource(self) + self.vendors = VendorsResource(self) + self.auth_templates = AuthTemplatesResource(self) def get_access_token(self) -> str: """ @@ -425,7 +493,7 @@ def _handle_http_error( } # Map status codes to specific exceptions - if status_code == 400: + if status_code in (400, 422): raise ValidationError( error_msg, status_code=status_code, diff --git a/nexla_sdk/generated/__init__.py b/nexla_sdk/generated/__init__.py new file mode 100644 index 0000000..af49ba7 --- /dev/null +++ b/nexla_sdk/generated/__init__.py @@ -0,0 +1,14 @@ +"""Generated OpenAPI metadata for Nexla SDK.""" + +from .operation_map import OPERATION_MAP, OperationId, OperationSpec +from .schema import JSONObject, JSONValue, RawRequest, RawResponse + +__all__ = [ + "OPERATION_MAP", + "OperationId", + "OperationSpec", + "JSONValue", + "JSONObject", + "RawRequest", + "RawResponse", +] diff --git a/nexla_sdk/generated/operation_map.py b/nexla_sdk/generated/operation_map.py new file mode 100644 index 0000000..f748966 --- /dev/null +++ b/nexla_sdk/generated/operation_map.py @@ -0,0 +1,2211 @@ +"""Auto-generated operation map from OpenAPI. Do not edit manually.""" + +from typing import Dict, List, Literal, TypedDict + + +class OperationSpec(TypedDict): + method: str + path: str + tags: List[str] + summary: str + path_params: List[str] + + +OperationId = Literal[ + "acknowledge_async_task", + "activate_data_sink", + "activate_nexset", + "activate_runtime", + "activate_source", + "add_code_container_accessors", + "add_data_credential_accessors", + "add_data_map_accessors", + "add_data_schema_accessors", + "add_data_sink_accessors", + "add_data_source_accessors", + "add_doc_container_accessors", + "add_domain_custodians", + "add_flow_accessors", + "add_flow_accessors__deprecated", + "add_nexset_accessors", + "add_org_custodians", + "add_project_accessors", + "add_project_flows", + "add_project_flows__deprecated", + "add_self_signup_blocked_domain", + "add_team_accessors", + "add_team_members", + "approve_approval_request", + "approve_self_sign_up_request", + "check_data_map_entries", + "copy_code_container", + "copy_data_sink_source", + "copy_nexset", + "copy_source", + "copy_transform", + "create_api_auth_config", + "create_async_task", + "create_attribute_transform", + "create_code_container", + "create_data_credential", + "create_data_sink", + "create_data_source", + "create_domain", + "create_domain_item", + "create_domains", + "create_gen_ai_config", + "create_gen_ai_org_setting", + "create_nexset", + "create_notification_channel_setting", + "create_notification_setting", + "create_project", + "create_quarantine_data_export_settings", + "create_reusable_record_transform", + "create_runtime", + "create_static_data_map", + "create_team", + "create_user", + "data_credential_probe", + "data_set_docs_recommendation", + "delete_all_notifications", + "delete_api_auth_config", + "delete_async_task", + "delete_attribute_transform", + "delete_code_container", + "delete_code_container_accessors", + "delete_data_credential", + "delete_data_credential_accessors", + "delete_data_map", + "delete_data_map_accessors", + "delete_data_map_entries", + "delete_data_schema_accessors", + "delete_data_sink", + "delete_data_sink_accessors", + "delete_data_source", + "delete_data_source_accessors", + "delete_doc_container_accessors", + "delete_domain", + "delete_flow", + "delete_flow_accessors", + "delete_flow_accessors__deprecated", + "delete_flow_by_resource_id", + "delete_gen_ai_integration_config", + "delete_gen_ai_org_setting", + "delete_nexset", + "delete_nexset_accessors", + "delete_notification_channel_setting", + "delete_notification_setting", + "delete_notifications", + "delete_org_members", + "delete_project", + "delete_project_accessors", + "delete_reusable_record_transform", + "delete_runtime", + "delete_self_signup_blocked_domain", + "delete_team", + "delete_team_accessors", + "delete_team_members", + "delete_user_quarantine_data_export_settings", + "flow_activate_with_flow_id", + "flow_activate_with_resource_id", + "flow_copy_with_flow_id", + "flow_docs_recommendation", + "flow_pause_with_flow_id", + "flow_pause_with_resource_id", + "gen_ai_org_settings_show_active", + "get_all_api_auth_configs", + "get_api_auth_configs", + "get_api_auth_configs_2", + "get_api_auth_settings", + "get_async_task", + "get_async_task_download_link", + "get_async_task_result", + "get_async_task_types", + "get_async_tasks", + "get_async_tasks_by_status", + "get_async_tasks_explain_arguments", + "get_async_tasks_of_type", + "get_attribute_transform", + "get_attribute_transforms", + "get_code_container", + "get_code_container_accessors", + "get_code_container_audit_log", + "get_code_containers", + "get_current_user", + "get_data_credential", + "get_data_credential_accessors", + "get_data_credential_audit_log", + "get_data_credential_expanded", + "get_data_credentials", + "get_data_map", + "get_data_map_accessors", + "get_data_map_audit_log", + "get_data_maps", + "get_data_schema_accessors", + "get_data_schema_audit_log", + "get_data_sink", + "get_data_sink_accessors", + "get_data_sink_audit_log", + "get_data_sink_expanded", + "get_data_sinks", + "get_data_source", + "get_data_source_accessors", + "get_data_source_audit_log", + "get_data_source_expanded", + "get_data_sources", + "get_doc_container_accessors", + "get_doc_container_audit_log", + "get_domain", + "get_domain_custodians", + "get_domain_items", + "get_domains", + "get_domains_for_org", + "get_flow_accessors", + "get_flow_accessors__deprecated", + "get_flow_by_id", + "get_flow_by_resource_id", + "get_flow_logs_for_run_id", + "get_flow_metrics", + "get_flows", + "get_gen_ai_configs", + "get_gen_ai_integration_config", + "get_gen_ai_org_setting", + "get_gen_ai_org_settings", + "get_nexset", + "get_nexset_accessors", + "get_nexset_audit_log", + "get_nexset_samples", + "get_nexsets", + "get_notification", + "get_notification_channel_setting", + "get_notification_count", + "get_notification_setting", + "get_notification_types", + "get_notifications", + "get_org", + "get_org_audit_log", + "get_org_custodians", + "get_org_members", + "get_orgs", + "get_pending_approval_requests", + "get_project", + "get_project_accessors", + "get_project_audit_log", + "get_project_flows", + "get_project_flows__deprecated", + "get_projects", + "get_public_attribute_transforms", + "get_public_code_containers", + "get_public_reusable_record_transforms", + "get_requested_approval_requests", + "get_resource_metrics_by_run", + "get_resource_metrics_daily", + "get_reusable_record_transform", + "get_reusable_record_transforms", + "get_runtime", + "get_runtimes", + "get_self_signup_blocked_domains", + "get_self_signup_requests", + "get_team", + "get_team_accessors", + "get_team_audit_log", + "get_team_members", + "get_teams", + "get_user", + "get_user_audit_log", + "get_user_expand", + "get_user_quarantine_data_export_settings", + "get_user_settings", + "get_users", + "get_users_expand", + "limits", + "list_notification_channel_settings", + "list_notification_settings", + "list_notification_settings_by_type", + "list_notification_type", + "list_resource_notification_settings", + "login_with_basic_auth", + "logout", + "notifications_mark_read", + "notifications_mark_unread", + "org_account_metrics_total", + "pause_data_sink", + "pause_nexset", + "pause_runtime", + "pause_source", + "preview_connector_content", + "preview_storage_structure", + "reject_approval_request", + "remove_domain_custodians", + "remove_org_custodians", + "remove_project_flows", + "remove_project_flows__deprecated", + "replace_code_container_accessors", + "replace_data_credential_accessors", + "replace_data_map_accessors", + "replace_data_schema_accessors", + "replace_data_sink_accessors", + "replace_data_source_accessors", + "replace_doc_container_accessors", + "replace_flow_accessors", + "replace_flow_accessors__deprecated", + "replace_nexset_accessors", + "replace_project_accessors", + "replace_project_flows", + "replace_project_flows__deprecated", + "replace_team_accessors", + "replace_team_members", + "rerun_async_task", + "self_sign_up", + "update_api_auth_config", + "update_api_auth_config_2", + "update_attribute_transform", + "update_code_container", + "update_data_credential", + "update_data_map_metadata", + "update_data_sink", + "update_data_source", + "update_domain", + "update_domain_custodians", + "update_gen_ai_integration_config", + "update_nexset", + "update_notification_channel_setting", + "update_notification_setting", + "update_org", + "update_org_custodians", + "update_org_members", + "update_project", + "update_reusable_record_transform", + "update_runtime", + "update_self_signup_blocked_domain", + "update_team", + "update_user", + "update_user_quarantine_data_export_settings", + "upsert_data_map_entries", + "user_24_hour_flow_stats", + "user_account_metrics_total", + "user_metrics_daily", + "verify_email", +] + + +OPERATION_MAP: Dict[str, OperationSpec] = { + "acknowledge_async_task": { + "method": "POST", + "path": "/async_tasks/{task_id}/acknowledge", + "tags": ["Async Tasks"], + "summary": "Acknowledge async operation", + "path_params": ["task_id"], + }, + "activate_data_sink": { + "method": "PUT", + "path": "/data_sinks/{sink_id}/activate", + "tags": ["Destinations (Data Sinks)"], + "summary": "Activate a Sink", + "path_params": ["sink_id"], + }, + "activate_nexset": { + "method": "PUT", + "path": "/data_sets/{set_id}/activate", + "tags": ["Nexsets (Data Sets)"], + "summary": "Activate Nexset", + "path_params": ["set_id"], + }, + "activate_runtime": { + "method": "PUT", + "path": "/runtimes/{runtime_id}/activate", + "tags": ["Custom Runtimes"], + "summary": "Activate a Custom Runtime", + "path_params": ["runtime_id"], + }, + "activate_source": { + "method": "PUT", + "path": "/data_sources/{source_id}/activate", + "tags": ["Sources"], + "summary": "Activate a Source", + "path_params": ["source_id"], + }, + "add_code_container_accessors": { + "method": "PUT", + "path": "/code_containers/{code_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Code Container", + "path_params": ["code_container_id"], + }, + "add_data_credential_accessors": { + "method": "PUT", + "path": "/data_credentials/{data_credential_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Data Credential", + "path_params": ["data_credential_id"], + }, + "add_data_map_accessors": { + "method": "PUT", + "path": "/data_maps/{data_map_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Data Map", + "path_params": ["data_map_id"], + }, + "add_data_schema_accessors": { + "method": "PUT", + "path": "/data_schemas/{data_schema_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Data Schema", + "path_params": ["data_schema_id"], + }, + "add_data_sink_accessors": { + "method": "PUT", + "path": "/data_sinks/{data_sink_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Data Sink", + "path_params": ["data_sink_id"], + }, + "add_data_source_accessors": { + "method": "PUT", + "path": "/data_sources/{data_source_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Data Source", + "path_params": ["data_source_id"], + }, + "add_doc_container_accessors": { + "method": "PUT", + "path": "/doc_containers/{doc_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Document", + "path_params": ["doc_container_id"], + }, + "add_domain_custodians": { + "method": "POST", + "path": "/marketplace/domains/{domain_id}/custodians", + "tags": ["Marketplace"], + "summary": "Add custodians to a marketplace domain.", + "path_params": ["domain_id"], + }, + "add_flow_accessors": { + "method": "PUT", + "path": "/flows/{flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Flow", + "path_params": ["flow_id"], + }, + "add_flow_accessors__deprecated": { + "method": "PUT", + "path": "/data_flows/{data_flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Flow (Deprecated)", + "path_params": ["data_flow_id"], + }, + "add_nexset_accessors": { + "method": "PUT", + "path": "/data_sets/{data_set_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Access Rules on Nexset", + "path_params": ["data_set_id"], + }, + "add_org_custodians": { + "method": "POST", + "path": "/orgs/{org_id}/custodians", + "tags": ["Organizations"], + "summary": "Add organization custodians.", + "path_params": ["org_id"], + }, + "add_project_accessors": { + "method": "PUT", + "path": "/projects/{project_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Project Accessors", + "path_params": ["project_id"], + }, + "add_project_flows": { + "method": "PUT", + "path": "/projects/{project_id}/flows", + "tags": ["Projects"], + "summary": "Add Flows to Project", + "path_params": ["project_id"], + }, + "add_project_flows__deprecated": { + "method": "PUT", + "path": "/projects/{project_id}/data_flows", + "tags": ["Projects"], + "summary": "Add Flows to Project (Deprecated)", + "path_params": ["project_id"], + }, + "add_self_signup_blocked_domain": { + "method": "POST", + "path": "/self_signup_blocked_domains", + "tags": ["Self Sign-Up Admin"], + "summary": "Add self-sign-up blocked domain for admins.", + "path_params": [], + }, + "add_team_accessors": { + "method": "PUT", + "path": "/teams/{team_id}/accessors", + "tags": ["Access Control"], + "summary": "Add Team Accessors", + "path_params": ["team_id"], + }, + "add_team_members": { + "method": "PUT", + "path": "/teams/{team_id}/members", + "tags": ["Teams"], + "summary": "Add Members to A Team", + "path_params": ["team_id"], + }, + "approve_approval_request": { + "method": "PUT", + "path": "/approval_requests/{request_id}/approve", + "tags": ["Approval Requests"], + "summary": "Approve pending approval requests", + "path_params": ["request_id"], + }, + "approve_self_sign_up_request": { + "method": "PUT", + "path": "/self_signup_requests/{request_id}/approve", + "tags": ["Self Sign-Up Admin"], + "summary": "Approve Self Sign Up Request", + "path_params": ["request_id"], + }, + "check_data_map_entries": { + "method": "GET", + "path": "/data_maps/{data_map_id}/entries/{entry_keys}", + "tags": ["Data Maps"], + "summary": "Check Data Map Entries", + "path_params": ["data_map_id", "entry_keys"], + }, + "copy_code_container": { + "method": "POST", + "path": "/code_containers/{code_container_id}/copy", + "tags": ["Code Containers"], + "summary": "Copy a Code Container", + "path_params": ["code_container_id"], + }, + "copy_data_sink_source": { + "method": "POST", + "path": "/data_sinks/{sink_id}/copy", + "tags": ["Destinations (Data Sinks)"], + "summary": "Copy a Sink", + "path_params": ["sink_id"], + }, + "copy_nexset": { + "method": "POST", + "path": "/data_sets/{set_id}/copy", + "tags": ["Nexsets (Data Sets)"], + "summary": "Copy Nexset", + "path_params": ["set_id"], + }, + "copy_source": { + "method": "POST", + "path": "/data_sources/{source_id}/copy", + "tags": ["Sources"], + "summary": "Copy a Source", + "path_params": ["source_id"], + }, + "copy_transform": { + "method": "POST", + "path": "/transforms/{transform_id}/copy", + "tags": ["Transforms"], + "summary": "Copy a Reusable Record Transform", + "path_params": ["transform_id"], + }, + "create_api_auth_config": { + "method": "POST", + "path": "/api_auth_configs", + "tags": ["Org authentication configs"], + "summary": "Create auth config.", + "path_params": [], + }, + "create_async_task": { + "method": "POST", + "path": "/async_tasks", + "tags": ["Async Tasks"], + "summary": "Create an async operation.", + "path_params": [], + }, + "create_attribute_transform": { + "method": "POST", + "path": "/attribute_transforms", + "tags": ["Transforms"], + "summary": "Create an Attribute Transform", + "path_params": [], + }, + "create_code_container": { + "method": "POST", + "path": "/code_containers", + "tags": ["Code Containers"], + "summary": "Create a Code Container", + "path_params": [], + }, + "create_data_credential": { + "method": "POST", + "path": "/data_credentials", + "tags": ["Credentials"], + "summary": "Create a Credential", + "path_params": [], + }, + "create_data_sink": { + "method": "POST", + "path": "/data_sinks", + "tags": ["Destinations (Data Sinks)"], + "summary": "Create a Sink", + "path_params": [], + }, + "create_data_source": { + "method": "POST", + "path": "/data_sources", + "tags": ["Sources"], + "summary": "Create a Source", + "path_params": [], + }, + "create_domain": { + "method": "POST", + "path": "/marketplace/domains/{domain_id}", + "tags": ["Marketplace"], + "summary": "Create a single marketplace domain.", + "path_params": ["domain_id"], + }, + "create_domain_item": { + "method": "POST", + "path": "/marketplace/domains/{domain_id}/items", + "tags": ["Marketplace"], + "summary": "Create a marketplace item for a domain.", + "path_params": ["domain_id"], + }, + "create_domains": { + "method": "POST", + "path": "/marketplace/domains", + "tags": ["Marketplace"], + "summary": "Create marketplace domains.", + "path_params": [], + }, + "create_gen_ai_config": { + "method": "POST", + "path": "/gen_ai_integration_configs", + "tags": ["GenAI Configurations"], + "summary": "Create a GenAI config", + "path_params": [], + }, + "create_gen_ai_org_setting": { + "method": "POST", + "path": "/gen_ai_org_settings", + "tags": ["GenAI Configurations"], + "summary": "Create a binding of GenAI config for the org for specific usage.", + "path_params": [], + }, + "create_nexset": { + "method": "POST", + "path": "/data_sets", + "tags": ["Nexsets (Data Sets)"], + "summary": "Create a Nexset", + "path_params": [], + }, + "create_notification_channel_setting": { + "method": "POST", + "path": "/notification_channel_settings", + "tags": ["Notifications"], + "summary": "Create a Notification Channel Setting", + "path_params": [], + }, + "create_notification_setting": { + "method": "POST", + "path": "/notification_settings", + "tags": ["Notifications"], + "summary": "Create a Notification Setting", + "path_params": [], + }, + "create_project": { + "method": "POST", + "path": "/projects", + "tags": ["Projects"], + "summary": "Create a project", + "path_params": [], + }, + "create_quarantine_data_export_settings": { + "method": "POST", + "path": "/users/{user_id}/quarantine_settings", + "tags": ["Quarantine Settings"], + "summary": "Set Quarantine Data Export Settings for A User", + "path_params": ["user_id"], + }, + "create_reusable_record_transform": { + "method": "POST", + "path": "/transforms", + "tags": ["Transforms"], + "summary": "Create a Reusable Record Transform", + "path_params": [], + }, + "create_runtime": { + "method": "POST", + "path": "/runtimes", + "tags": ["Custom Runtimes"], + "summary": "Create a Custom Runtime", + "path_params": [], + }, + "create_static_data_map": { + "method": "POST", + "path": "/data_maps", + "tags": ["Data Maps"], + "summary": "Create a Static Data Map", + "path_params": [], + }, + "create_team": { + "method": "POST", + "path": "/teams", + "tags": ["Teams"], + "summary": "Create a team", + "path_params": [], + }, + "create_user": { + "method": "POST", + "path": "/users", + "tags": ["Users"], + "summary": "Create a User", + "path_params": [], + }, + "data_credential_probe": { + "method": "GET", + "path": "/data_credentials/{credential_id}/probe", + "tags": ["Credentials"], + "summary": "Test credential validity", + "path_params": ["credential_id"], + }, + "data_set_docs_recommendation": { + "method": "POST", + "path": "/data_sets/{data_set_id}/docs/recommendation", + "tags": ["Nexsets (Data Sets)", "Gen AI Recommendations"], + "summary": "Generate an AI suggestion for Nexset documentation", + "path_params": ["data_set_id"], + }, + "delete_all_notifications": { + "method": "DELETE", + "path": "/notifications/all", + "tags": ["Notifications"], + "summary": "Delete All Notifications", + "path_params": [], + }, + "delete_api_auth_config": { + "method": "DELETE", + "path": "/api_auth_configs/{auth_config_id}", + "tags": ["Org authentication configs"], + "summary": "Delete auth config.", + "path_params": ["auth_config_id"], + }, + "delete_async_task": { + "method": "DELETE", + "path": "/async_tasks/{task_id}", + "tags": ["Async Tasks"], + "summary": "Delete async operation by ID", + "path_params": ["task_id"], + }, + "delete_attribute_transform": { + "method": "DELETE", + "path": "/attribute_transforms/{attribute_transform_id}", + "tags": ["Transforms"], + "summary": "Delete an Attribute Transform", + "path_params": ["attribute_transform_id"], + }, + "delete_code_container": { + "method": "DELETE", + "path": "/code_containers/{code_container_id}", + "tags": ["Code Containers"], + "summary": "Delete a Code Container", + "path_params": ["code_container_id"], + }, + "delete_code_container_accessors": { + "method": "DELETE", + "path": "/code_containers/{code_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Code Container", + "path_params": ["code_container_id"], + }, + "delete_data_credential": { + "method": "DELETE", + "path": "/data_credentials/{credential_id}", + "tags": ["Credentials"], + "summary": "Delete a Credential", + "path_params": ["credential_id"], + }, + "delete_data_credential_accessors": { + "method": "DELETE", + "path": "/data_credentials/{data_credential_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Data Credential", + "path_params": ["data_credential_id"], + }, + "delete_data_map": { + "method": "DELETE", + "path": "/data_maps/{data_map_id}", + "tags": ["Data Maps"], + "summary": "Delete a Data Map", + "path_params": ["data_map_id"], + }, + "delete_data_map_accessors": { + "method": "DELETE", + "path": "/data_maps/{data_map_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Data Map", + "path_params": ["data_map_id"], + }, + "delete_data_map_entries": { + "method": "DELETE", + "path": "/data_maps/{data_map_id}/entries/{entry_keys}", + "tags": ["Data Maps"], + "summary": "Delete Data Map Entries", + "path_params": ["data_map_id", "entry_keys"], + }, + "delete_data_schema_accessors": { + "method": "DELETE", + "path": "/data_schemas/{data_schema_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Data Schema", + "path_params": ["data_schema_id"], + }, + "delete_data_sink": { + "method": "DELETE", + "path": "/data_sinks/{sink_id}", + "tags": ["Destinations (Data Sinks)"], + "summary": "Delete a Sink", + "path_params": ["sink_id"], + }, + "delete_data_sink_accessors": { + "method": "DELETE", + "path": "/data_sinks/{data_sink_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Data Sink", + "path_params": ["data_sink_id"], + }, + "delete_data_source": { + "method": "DELETE", + "path": "/data_sources/{source_id}", + "tags": ["Sources"], + "summary": "Delete a Source", + "path_params": ["source_id"], + }, + "delete_data_source_accessors": { + "method": "DELETE", + "path": "/data_sources/{data_source_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Data Source", + "path_params": ["data_source_id"], + }, + "delete_doc_container_accessors": { + "method": "DELETE", + "path": "/doc_containers/{doc_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Document", + "path_params": ["doc_container_id"], + }, + "delete_domain": { + "method": "DELETE", + "path": "/marketplace/domains/{domain_id}", + "tags": ["Marketplace"], + "summary": "Delete a single marketplace domain.", + "path_params": ["domain_id"], + }, + "delete_flow": { + "method": "DELETE", + "path": "/flows/{flow_id}", + "tags": ["Flows"], + "summary": "Delete a Flow", + "path_params": ["flow_id"], + }, + "delete_flow_accessors": { + "method": "DELETE", + "path": "/flows/{flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Flow", + "path_params": ["flow_id"], + }, + "delete_flow_accessors__deprecated": { + "method": "DELETE", + "path": "/data_flows/{data_flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Flow (Deprecated)", + "path_params": ["data_flow_id"], + }, + "delete_flow_by_resource_id": { + "method": "DELETE", + "path": "/{resource_type}/{resource_id}/flow", + "tags": ["Flows"], + "summary": "Delete a Flow (by Resource ID)", + "path_params": ["resource_id", "resource_type"], + }, + "delete_gen_ai_integration_config": { + "method": "DELETE", + "path": "/gen_ai_integration_configs/{gen_ai_config_id}", + "tags": ["GenAI Configs"], + "summary": "Delete GenAI Integration Config", + "path_params": ["gen_ai_config_id"], + }, + "delete_gen_ai_org_setting": { + "method": "DELETE", + "path": "/gen_ai_org_settings/{gen_ai_org_setting_id}", + "tags": ["GenAI Configurations"], + "summary": "Delete GenAI Config binding for org.", + "path_params": ["gen_ai_org_setting_id"], + }, + "delete_nexset": { + "method": "DELETE", + "path": "/data_sets/{set_id}", + "tags": ["Nexsets (Data Sets)"], + "summary": "Delete a Nexset", + "path_params": ["set_id"], + }, + "delete_nexset_accessors": { + "method": "DELETE", + "path": "/data_sets/{data_set_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Access Rules on Nexset", + "path_params": ["data_set_id"], + }, + "delete_notification_channel_setting": { + "method": "DELETE", + "path": "/notification_channel_settings/{notification_channel_setting_id}", + "tags": ["Notifications"], + "summary": "Delete a Notification Channel Setting", + "path_params": ["notification_channel_setting_id"], + }, + "delete_notification_setting": { + "method": "DELETE", + "path": "/notification_settings/{notification_setting_id}", + "tags": ["Notifications"], + "summary": "Delete a Notification Setting", + "path_params": ["notification_setting_id"], + }, + "delete_notifications": { + "method": "DELETE", + "path": "/notifications/{notification_id}", + "tags": ["Notifications"], + "summary": "Delete a Notification", + "path_params": ["notification_id"], + }, + "delete_org_members": { + "method": "DELETE", + "path": "/orgs/{org_id}/members", + "tags": ["Organizations"], + "summary": "Remove Members from an Organization.", + "path_params": ["org_id"], + }, + "delete_project": { + "method": "DELETE", + "path": "/projects/{project_id}", + "tags": ["Projects"], + "summary": "Delete Project by ID", + "path_params": ["project_id"], + }, + "delete_project_accessors": { + "method": "DELETE", + "path": "/projects/{project_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Project Accessors", + "path_params": ["project_id"], + }, + "delete_reusable_record_transform": { + "method": "DELETE", + "path": "/transforms/{transform_id}", + "tags": ["Transforms"], + "summary": "Delete a Reusable Record Transform", + "path_params": ["transform_id"], + }, + "delete_runtime": { + "method": "DELETE", + "path": "/runtimes/{runtime_id}", + "tags": ["Custom Runtimes"], + "summary": "Delete a Custom Runtime", + "path_params": ["runtime_id"], + }, + "delete_self_signup_blocked_domain": { + "method": "DELETE", + "path": "/self_signup_blocked_domains/{domain_id}", + "tags": ["Self Sign-Up Admin"], + "summary": "Delete self-sign-up blocked domain for admins.", + "path_params": ["domain_id"], + }, + "delete_team": { + "method": "DELETE", + "path": "/teams/{team_id}", + "tags": ["Teams"], + "summary": "Delete Team by ID", + "path_params": ["team_id"], + }, + "delete_team_accessors": { + "method": "DELETE", + "path": "/teams/{team_id}/accessors", + "tags": ["Access Control"], + "summary": "Delete Team Accessors", + "path_params": ["team_id"], + }, + "delete_team_members": { + "method": "DELETE", + "path": "/teams/{team_id}/members", + "tags": ["Teams"], + "summary": "Remove Team Members", + "path_params": ["team_id"], + }, + "delete_user_quarantine_data_export_settings": { + "method": "DELETE", + "path": "/users/{user_id}/quarantine_settings", + "tags": ["Quarantine Settings"], + "summary": "Delete Quarantine Data Export Settings for A User", + "path_params": ["user_id"], + }, + "flow_activate_with_flow_id": { + "method": "PUT", + "path": "/flows/{flow_id}/activate", + "tags": ["Flows"], + "summary": "Activate a Flow", + "path_params": ["flow_id"], + }, + "flow_activate_with_resource_id": { + "method": "PUT", + "path": "/{resource_type}/{resource_id}/activate", + "tags": ["Flows"], + "summary": "Activate a Flow (with Resource ID)", + "path_params": ["resource_id", "resource_type"], + }, + "flow_copy_with_flow_id": { + "method": "POST", + "path": "/flows/{flow_id}/copy", + "tags": ["Flows"], + "summary": "Copy a Flow", + "path_params": ["flow_id"], + }, + "flow_docs_recommendation": { + "method": "POST", + "path": "/flows/{flow_id}/docs/recommendation", + "tags": ["Flows", "Gen AI Recommendations"], + "summary": "Generate an AI suggestion for flow documentation", + "path_params": ["flow_id"], + }, + "flow_pause_with_flow_id": { + "method": "PUT", + "path": "/flows/{flow_id}/pause", + "tags": ["Flows"], + "summary": "Pause a Flow", + "path_params": ["flow_id"], + }, + "flow_pause_with_resource_id": { + "method": "PUT", + "path": "/{resource_type}/{resource_id}/pause", + "tags": ["Flows"], + "summary": "Pause a Flow (with Resource ID)", + "path_params": ["resource_id", "resource_type"], + }, + "gen_ai_org_settings_show_active": { + "method": "GET", + "path": "/gen_ai_org_settings/active_config", + "tags": ["GenAI Configurations"], + "summary": "Shows active GenAI Configuration for specific usage", + "path_params": [], + }, + "get_all_api_auth_configs": { + "method": "GET", + "path": "/api_auth_configs/all", + "tags": ["Org authentication configs"], + "summary": "Get all auth configs.", + "path_params": [], + }, + "get_api_auth_configs": { + "method": "GET", + "path": "/api_auth_configs", + "tags": ["Org authentication configs"], + "summary": "Get auth configs.", + "path_params": [], + }, + "get_api_auth_configs_2": { + "method": "GET", + "path": "/api_auth_configs/{auth_config_id}", + "tags": ["Org authentication configs"], + "summary": "Get auth configs.", + "path_params": ["auth_config_id"], + }, + "get_api_auth_settings": { + "method": "GET", + "path": "/orgs/{org_id}/auth_settings", + "tags": ["Org authentication configs"], + "summary": "Get auth settings for org.", + "path_params": ["org_id"], + }, + "get_async_task": { + "method": "GET", + "path": "/async_tasks/{task_id}", + "tags": ["Async Tasks"], + "summary": "Get async operation by ID", + "path_params": ["task_id"], + }, + "get_async_task_download_link": { + "method": "GET", + "path": "/async_tasks/{task_id}/download_link", + "tags": ["Async Tasks"], + "summary": "Get download link for async operation result", + "path_params": ["task_id"], + }, + "get_async_task_result": { + "method": "GET", + "path": "/async_tasks/{task_id}/result", + "tags": ["Async Tasks"], + "summary": "Get async operation result", + "path_params": ["task_id"], + }, + "get_async_task_types": { + "method": "GET", + "path": "/async_tasks/types", + "tags": ["Async Tasks"], + "summary": "Get async operation types", + "path_params": [], + }, + "get_async_tasks": { + "method": "GET", + "path": "/async_tasks", + "tags": ["Async Tasks"], + "summary": "Get async operations list for current user.", + "path_params": [], + }, + "get_async_tasks_by_status": { + "method": "GET", + "path": "/async_tasks/by_status/{status}", + "tags": ["Async Tasks"], + "summary": "Get async operations list for current user by status", + "path_params": ["status"], + }, + "get_async_tasks_explain_arguments": { + "method": "GET", + "path": "/async_tasks/explain_arguments/{task_type}", + "tags": ["Async Tasks"], + "summary": "Get async operation arguments for a specific type with descriptions", + "path_params": ["task_type"], + }, + "get_async_tasks_of_type": { + "method": "GET", + "path": "/async_tasks/of_type/{task_type}", + "tags": ["Async Tasks"], + "summary": "Get async operations list for current user of a specific type.", + "path_params": ["task_type"], + }, + "get_attribute_transform": { + "method": "GET", + "path": "/attribute_transforms/{attribute_transform_id}", + "tags": ["Transforms"], + "summary": "Get Attribute Transform by ID", + "path_params": ["attribute_transform_id"], + }, + "get_attribute_transforms": { + "method": "GET", + "path": "/attribute_transforms", + "tags": ["Transforms"], + "summary": "Get all Attribute Transforms", + "path_params": [], + }, + "get_code_container": { + "method": "GET", + "path": "/code_containers/{code_container_id}", + "tags": ["Code Containers"], + "summary": "Get Code Container by ID", + "path_params": ["code_container_id"], + }, + "get_code_container_accessors": { + "method": "GET", + "path": "/code_containers/{code_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Code Container", + "path_params": ["code_container_id"], + }, + "get_code_container_audit_log": { + "method": "GET", + "path": "/code_containers/{code_container_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Code Container", + "path_params": ["code_container_id"], + }, + "get_code_containers": { + "method": "GET", + "path": "/code_containers", + "tags": ["Code Containers"], + "summary": "Get all Code Containers", + "path_params": [], + }, + "get_current_user": { + "method": "GET", + "path": "/users/current", + "tags": ["Session Management", "Users"], + "summary": "Get info on current user", + "path_params": [], + }, + "get_data_credential": { + "method": "GET", + "path": "/data_credentials/{credential_id}", + "tags": ["Credentials"], + "summary": "Get Credential by ID", + "path_params": ["credential_id"], + }, + "get_data_credential_accessors": { + "method": "GET", + "path": "/data_credentials/{data_credential_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Data Credential", + "path_params": ["data_credential_id"], + }, + "get_data_credential_audit_log": { + "method": "GET", + "path": "/data_credentials/{credential_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Data Credential", + "path_params": ["credential_id"], + }, + "get_data_credential_expanded": { + "method": "GET", + "path": "/data_credentials/{credential_id}?expand=1", + "tags": ["Credentials"], + "summary": "Get Credential by ID with expanded references", + "path_params": ["credential_id"], + }, + "get_data_credentials": { + "method": "GET", + "path": "/data_credentials", + "tags": ["Credentials"], + "summary": "Get All Credentials", + "path_params": [], + }, + "get_data_map": { + "method": "GET", + "path": "/data_maps/{data_map_id}", + "tags": ["Data Maps"], + "summary": "Get Data Map by ID", + "path_params": ["data_map_id"], + }, + "get_data_map_accessors": { + "method": "GET", + "path": "/data_maps/{data_map_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Data Map", + "path_params": ["data_map_id"], + }, + "get_data_map_audit_log": { + "method": "GET", + "path": "/data_maps/{data_map_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Data Map", + "path_params": ["data_map_id"], + }, + "get_data_maps": { + "method": "GET", + "path": "/data_maps", + "tags": ["Data Maps"], + "summary": "Get all Data Maps", + "path_params": [], + }, + "get_data_schema_accessors": { + "method": "GET", + "path": "/data_schemas/{data_schema_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Data Schema", + "path_params": ["data_schema_id"], + }, + "get_data_schema_audit_log": { + "method": "GET", + "path": "/data_schemas/{schema_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Data Schema", + "path_params": ["schema_id"], + }, + "get_data_sink": { + "method": "GET", + "path": "/data_sinks/{sink_id}", + "tags": ["Destinations (Data Sinks)"], + "summary": "Get Sink by ID", + "path_params": ["sink_id"], + }, + "get_data_sink_accessors": { + "method": "GET", + "path": "/data_sinks/{data_sink_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Data Sink", + "path_params": ["data_sink_id"], + }, + "get_data_sink_audit_log": { + "method": "GET", + "path": "/data_sinks/{sink_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Data Sink", + "path_params": ["sink_id"], + }, + "get_data_sink_expanded": { + "method": "GET", + "path": "/data_sinks/{sink_id}?expand=1", + "tags": ["Destinations (Data Sinks)"], + "summary": "Get Sink by ID with Expanded References", + "path_params": ["sink_id"], + }, + "get_data_sinks": { + "method": "GET", + "path": "/data_sinks", + "tags": ["Destinations (Data Sinks)"], + "summary": "Get All Sinks", + "path_params": [], + }, + "get_data_source": { + "method": "GET", + "path": "/data_sources/{source_id}", + "tags": ["Sources"], + "summary": "Get Source by ID", + "path_params": ["source_id"], + }, + "get_data_source_accessors": { + "method": "GET", + "path": "/data_sources/{data_source_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Data Source", + "path_params": ["data_source_id"], + }, + "get_data_source_audit_log": { + "method": "GET", + "path": "/data_sources/{source_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Data Source", + "path_params": ["source_id"], + }, + "get_data_source_expanded": { + "method": "GET", + "path": "/data_sources/{source_id}?expand=1", + "tags": ["Sources"], + "summary": "Get Source by ID with Expanded References", + "path_params": ["source_id"], + }, + "get_data_sources": { + "method": "GET", + "path": "/data_sources", + "tags": ["Sources"], + "summary": "Get All Sources", + "path_params": [], + }, + "get_doc_container_accessors": { + "method": "GET", + "path": "/doc_containers/{doc_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Document", + "path_params": ["doc_container_id"], + }, + "get_doc_container_audit_log": { + "method": "GET", + "path": "/doc_containers/{doc_container_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Document", + "path_params": ["doc_container_id"], + }, + "get_domain": { + "method": "GET", + "path": "/marketplace/domains/{domain_id}", + "tags": ["Marketplace"], + "summary": "Get a single marketplace domain.", + "path_params": ["domain_id"], + }, + "get_domain_custodians": { + "method": "GET", + "path": "/marketplace/domains/{domain_id}/custodians", + "tags": ["Marketplace"], + "summary": "Get custodians for a marketplace domain.", + "path_params": ["domain_id"], + }, + "get_domain_items": { + "method": "GET", + "path": "/marketplace/domains/{domain_id}/items", + "tags": ["Marketplace"], + "summary": "Get marketplace items for a domain.", + "path_params": ["domain_id"], + }, + "get_domains": { + "method": "GET", + "path": "/marketplace/domains", + "tags": ["Marketplace"], + "summary": "Get marketplace domains.", + "path_params": [], + }, + "get_domains_for_org": { + "method": "GET", + "path": "/marketplace/domains/for_org", + "tags": ["Marketplace"], + "summary": "Get marketplace domains for organization.", + "path_params": [], + }, + "get_flow_accessors": { + "method": "GET", + "path": "/flows/{flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Flow", + "path_params": ["flow_id"], + }, + "get_flow_accessors__deprecated": { + "method": "GET", + "path": "/data_flows/{data_flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Flow (Deprecated)", + "path_params": ["data_flow_id"], + }, + "get_flow_by_id": { + "method": "GET", + "path": "/flows/{flow_id}", + "tags": ["Flows"], + "summary": "Get Flow by ID", + "path_params": ["flow_id"], + }, + "get_flow_by_resource_id": { + "method": "GET", + "path": "/{resource_type}/{resource_id}/flow", + "tags": ["Flows"], + "summary": "Get Flow (by Resource ID)", + "path_params": ["resource_id", "resource_type"], + }, + "get_flow_logs_for_run_id": { + "method": "GET", + "path": "/data_flows/{resource_type}/{resource_id}/logs", + "tags": ["Metrics"], + "summary": "Get Flow Execution Logs for Run ID of a Flow", + "path_params": ["resource_id", "resource_type"], + }, + "get_flow_metrics": { + "method": "GET", + "path": "/data_flows/{resource_type}/{resource_id}/metrics", + "tags": ["Metrics"], + "summary": "Get Metrics for a Flow", + "path_params": ["resource_id", "resource_type"], + }, + "get_flows": { + "method": "GET", + "path": "/flows", + "tags": ["Flows"], + "summary": "Get All Flows", + "path_params": [], + }, + "get_gen_ai_configs": { + "method": "GET", + "path": "/gen_ai_integration_configs", + "tags": ["GenAI Configurations"], + "summary": "Get all GenAI configs in org", + "path_params": [], + }, + "get_gen_ai_integration_config": { + "method": "GET", + "path": "/gen_ai_integration_configs/{gen_ai_config_id}", + "tags": ["GenAI Configurations"], + "summary": "Get GenAI Integration Config", + "path_params": ["gen_ai_config_id"], + }, + "get_gen_ai_org_setting": { + "method": "GET", + "path": "/gen_ai_org_settings/{gen_ai_org_setting_id}", + "tags": ["GenAI Configuration"], + "summary": "Get Org GenAI binding", + "path_params": ["gen_ai_org_setting_id"], + }, + "get_gen_ai_org_settings": { + "method": "GET", + "path": "/gen_ai_org_settings", + "tags": ["GenAI Configurations"], + "summary": "Get all bindings of GenAI configs of the org for specified usages.", + "path_params": [], + }, + "get_nexset": { + "method": "GET", + "path": "/data_sets/{set_id}", + "tags": ["Nexsets (Data Sets)"], + "summary": "Get a Nexset", + "path_params": ["set_id"], + }, + "get_nexset_accessors": { + "method": "GET", + "path": "/data_sets/{data_set_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Access Rules on Nexset", + "path_params": ["data_set_id"], + }, + "get_nexset_audit_log": { + "method": "GET", + "path": "/data_sets/{set_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Nexset", + "path_params": ["set_id"], + }, + "get_nexset_samples": { + "method": "GET", + "path": "/data_sets/{set_id}/samples", + "tags": ["Nexsets (Data Sets)"], + "summary": "Get Nexset Samples", + "path_params": ["set_id"], + }, + "get_nexsets": { + "method": "GET", + "path": "/data_sets", + "tags": ["Nexsets (Data Sets)"], + "summary": "Get All Nexsets", + "path_params": [], + }, + "get_notification": { + "method": "GET", + "path": "/notifications/{notification_id}", + "tags": ["Notifications"], + "summary": "Get a Notification", + "path_params": ["notification_id"], + }, + "get_notification_channel_setting": { + "method": "GET", + "path": "/notification_channel_settings/{notification_channel_setting_id}", + "tags": ["Notifications"], + "summary": "Get a Notification Channel Setting", + "path_params": ["notification_channel_setting_id"], + }, + "get_notification_count": { + "method": "GET", + "path": "/notifications/count", + "tags": ["Notifications"], + "summary": "Get Notifications Count", + "path_params": [], + }, + "get_notification_setting": { + "method": "GET", + "path": "/notification_settings/{notification_setting_id}", + "tags": ["Notifications"], + "summary": "Get a Notification Setting", + "path_params": ["notification_setting_id"], + }, + "get_notification_types": { + "method": "GET", + "path": "/notification_types", + "tags": ["Notifications"], + "summary": "Get All Notification Types", + "path_params": [], + }, + "get_notifications": { + "method": "GET", + "path": "/notifications", + "tags": ["Notifications"], + "summary": "Get All Notifications", + "path_params": [], + }, + "get_org": { + "method": "GET", + "path": "/orgs/{org_id}", + "tags": ["Organizations"], + "summary": "Get Organization by ID", + "path_params": ["org_id"], + }, + "get_org_audit_log": { + "method": "GET", + "path": "/orgs/{org_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for an Organization", + "path_params": ["org_id"], + }, + "get_org_custodians": { + "method": "GET", + "path": "/orgs/{org_id}/custodians", + "tags": ["Organizations"], + "summary": "Get organization custodians.", + "path_params": ["org_id"], + }, + "get_org_members": { + "method": "GET", + "path": "/orgs/{org_id}/members", + "tags": ["Organizations"], + "summary": "Get All Members in Organization", + "path_params": ["org_id"], + }, + "get_orgs": { + "method": "GET", + "path": "/orgs", + "tags": ["Organizations"], + "summary": "Get all Organizations", + "path_params": [], + }, + "get_pending_approval_requests": { + "method": "GET", + "path": "/approval_requests/pending", + "tags": ["Approval Requests"], + "summary": "Get all pending approval requests.", + "path_params": [], + }, + "get_project": { + "method": "GET", + "path": "/projects/{project_id}", + "tags": ["Projects"], + "summary": "Get Project by ID", + "path_params": ["project_id"], + }, + "get_project_accessors": { + "method": "GET", + "path": "/projects/{project_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Project Accessors", + "path_params": ["project_id"], + }, + "get_project_audit_log": { + "method": "GET", + "path": "/projects/{project_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Project", + "path_params": ["project_id"], + }, + "get_project_flows": { + "method": "GET", + "path": "/projects/{project_id}/flows", + "tags": ["Projects"], + "summary": "Get Project Flows", + "path_params": ["project_id"], + }, + "get_project_flows__deprecated": { + "method": "GET", + "path": "/projects/{project_id}/data_flows", + "tags": ["Projects"], + "summary": "Get Project Flows (Deprecated)", + "path_params": ["project_id"], + }, + "get_projects": { + "method": "GET", + "path": "/projects", + "tags": ["Projects"], + "summary": "Get all Projects", + "path_params": [], + }, + "get_public_attribute_transforms": { + "method": "GET", + "path": "/attribute_transforms/public", + "tags": ["Transforms"], + "summary": "Get all Public Attribute Transforms", + "path_params": [], + }, + "get_public_code_containers": { + "method": "GET", + "path": "/code_containers/public", + "tags": ["Code Containers"], + "summary": "Get all Public Code Containers", + "path_params": [], + }, + "get_public_reusable_record_transforms": { + "method": "GET", + "path": "/transforms/public", + "tags": ["Transforms"], + "summary": "Get all Public Reusable Record Transforms", + "path_params": [], + }, + "get_requested_approval_requests": { + "method": "GET", + "path": "/approval_requests/requested", + "tags": ["Approval Requests"], + "summary": "Get all requested approval requests by the user.", + "path_params": [], + }, + "get_resource_metrics_by_run": { + "method": "GET", + "path": "/{resource_type}/{resource_id}/metrics/run_summary", + "tags": ["Metrics"], + "summary": "Get Metrics By Run ID for a Resource of a Flow", + "path_params": ["resource_id", "resource_type"], + }, + "get_resource_metrics_daily": { + "method": "GET", + "path": "/{resource_type}/{resource_id}/metrics", + "tags": ["Metrics"], + "summary": "Get Daily Metrics for a Resource of a Flow", + "path_params": ["resource_id", "resource_type"], + }, + "get_reusable_record_transform": { + "method": "GET", + "path": "/transforms/{transform_id}", + "tags": ["Transforms"], + "summary": "Get A Reusable Record Transform", + "path_params": ["transform_id"], + }, + "get_reusable_record_transforms": { + "method": "GET", + "path": "/transforms", + "tags": ["Transforms"], + "summary": "Get all Reusable Record Transforms", + "path_params": [], + }, + "get_runtime": { + "method": "GET", + "path": "/runtimes/{runtime_id}", + "tags": ["Custom Runtimes"], + "summary": "Get a custom runtime by ID", + "path_params": ["runtime_id"], + }, + "get_runtimes": { + "method": "GET", + "path": "/runtimes", + "tags": ["Custom Runtimes"], + "summary": "Get all Custom Runtimes", + "path_params": [], + }, + "get_self_signup_blocked_domains": { + "method": "GET", + "path": "/self_signup_blocked_domains", + "tags": ["Self Sign-Up Admin"], + "summary": "List self-sign-up blocked domains for admins.", + "path_params": [], + }, + "get_self_signup_requests": { + "method": "GET", + "path": "/self_signup_requests", + "tags": ["Self Sign-Up Admin"], + "summary": "List Self Sign Up Requests", + "path_params": [], + }, + "get_team": { + "method": "GET", + "path": "/teams/{team_id}", + "tags": ["Teams"], + "summary": "Get Team by ID", + "path_params": ["team_id"], + }, + "get_team_accessors": { + "method": "GET", + "path": "/teams/{team_id}/accessors", + "tags": ["Access Control"], + "summary": "Get Team Accessors", + "path_params": ["team_id"], + }, + "get_team_audit_log": { + "method": "GET", + "path": "/teams/{team_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a Team", + "path_params": ["team_id"], + }, + "get_team_members": { + "method": "GET", + "path": "/teams/{team_id}/members", + "tags": ["Teams"], + "summary": "Get Team Members", + "path_params": ["team_id"], + }, + "get_teams": { + "method": "GET", + "path": "/teams", + "tags": ["Teams"], + "summary": "Get all Teams", + "path_params": [], + }, + "get_user": { + "method": "GET", + "path": "/users/{user_id}", + "tags": ["Users"], + "summary": "Get User by ID", + "path_params": ["user_id"], + }, + "get_user_audit_log": { + "method": "GET", + "path": "/users/{user_id}/audit_log", + "tags": ["Audit Logs"], + "summary": "Get Audit Log for a User", + "path_params": ["user_id"], + }, + "get_user_expand": { + "method": "GET", + "path": "/users/{user_id}?expand=1", + "tags": ["Users"], + "summary": "Get User by ID with Expanded References", + "path_params": ["user_id"], + }, + "get_user_quarantine_data_export_settings": { + "method": "GET", + "path": "/users/{user_id}/quarantine_settings", + "tags": ["Quarantine Settings"], + "summary": "Get Quarantine Data Export Settings for A User", + "path_params": ["user_id"], + }, + "get_user_settings": { + "method": "GET", + "path": "/user_settings", + "tags": ["User Settings"], + "summary": "Get the current user's settings", + "path_params": [], + }, + "get_users": { + "method": "GET", + "path": "/users", + "tags": ["Users"], + "summary": "Get All Users", + "path_params": [], + }, + "get_users_expand": { + "method": "GET", + "path": "/users?expand=1", + "tags": ["Users"], + "summary": "Get All Users with Expanded References", + "path_params": [], + }, + "limits": { + "method": "GET", + "path": "/limits", + "tags": ["Limits"], + "summary": "Get current rate limit and usage", + "path_params": [], + }, + "list_notification_channel_settings": { + "method": "GET", + "path": "/notification_channel_settings", + "tags": ["Notifications"], + "summary": "List Notification Channel Settings", + "path_params": [], + }, + "list_notification_settings": { + "method": "GET", + "path": "/notification_settings", + "tags": ["Notifications"], + "summary": "List Notification Settings", + "path_params": [], + }, + "list_notification_settings_by_type": { + "method": "GET", + "path": "/notification_settings/notification_types/{notification_type_id}", + "tags": ["Notifications"], + "summary": "Get Notification Settings for an Event", + "path_params": ["notification_type_id"], + }, + "list_notification_type": { + "method": "GET", + "path": "/notification_types/list", + "tags": ["Notifications"], + "summary": "Get One Notification Type", + "path_params": [], + }, + "list_resource_notification_settings": { + "method": "GET", + "path": "/notification_settings/{resource_type}/{resource_id}", + "tags": ["Notifications"], + "summary": "Get Notification Settings For a Resource", + "path_params": ["resource_id", "resource_type"], + }, + "login_with_basic_auth": { + "method": "POST", + "path": "/token", + "tags": ["Session Management"], + "summary": "Login with Basic Authentication", + "path_params": [], + }, + "logout": { + "method": "POST", + "path": "/token/logout", + "tags": ["Session Management"], + "summary": "Logout", + "path_params": [], + }, + "notifications_mark_read": { + "method": "PUT", + "path": "/notifications/mark_read", + "tags": ["Notifications"], + "summary": "Mark Notification Read", + "path_params": [], + }, + "notifications_mark_unread": { + "method": "PUT", + "path": "/notifications/mark_unread", + "tags": ["Notifications"], + "summary": "Mark Notification Unread", + "path_params": [], + }, + "org_account_metrics_total": { + "method": "GET", + "path": "/orgs/{org_id}/flows/account_metrics", + "tags": ["Metrics"], + "summary": "Get Total Account Metrics for An Organization", + "path_params": ["org_id"], + }, + "pause_data_sink": { + "method": "PUT", + "path": "/data_sinks/{sink_id}/pause", + "tags": ["Destinations (Data Sinks)"], + "summary": "Pause a Sink", + "path_params": ["sink_id"], + }, + "pause_nexset": { + "method": "PUT", + "path": "/data_sets/{set_id}/pause", + "tags": ["Nexsets (Data Sets)"], + "summary": "Pause Nexset", + "path_params": ["set_id"], + }, + "pause_runtime": { + "method": "PUT", + "path": "/runtimes/{runtime_id}/pause", + "tags": ["Custom Runtimes"], + "summary": "Pause a Custom Runtime", + "path_params": ["runtime_id"], + }, + "pause_source": { + "method": "PUT", + "path": "/data_sources/{source_id}/pause", + "tags": ["Sources"], + "summary": "Pause a Source", + "path_params": ["source_id"], + }, + "preview_connector_content": { + "method": "POST", + "path": "/data_credentials/{credential_id}/probe/sample", + "tags": ["Credentials"], + "summary": "Preview Connector Content", + "path_params": ["credential_id"], + }, + "preview_storage_structure": { + "method": "POST", + "path": "/data_credentials/{credential_id}/probe/tree", + "tags": ["Credentials"], + "summary": "Preview Storage Structure", + "path_params": ["credential_id"], + }, + "reject_approval_request": { + "method": "DELETE", + "path": "/approval_requests/{request_id}/reject", + "tags": ["Approval Requests"], + "summary": "Reject pending approval requests", + "path_params": ["request_id"], + }, + "remove_domain_custodians": { + "method": "DELETE", + "path": "/marketplace/domains/{domain_id}/custodians", + "tags": ["Marketplace"], + "summary": "Remove custodians from a marketplace domain.", + "path_params": ["domain_id"], + }, + "remove_org_custodians": { + "method": "DELETE", + "path": "/orgs/{org_id}/custodians", + "tags": ["Organizations"], + "summary": "Remove organization custodians.", + "path_params": ["org_id"], + }, + "remove_project_flows": { + "method": "DELETE", + "path": "/projects/{project_id}/flows", + "tags": ["Projects"], + "summary": "Remove Flows From A Project", + "path_params": ["project_id"], + }, + "remove_project_flows__deprecated": { + "method": "DELETE", + "path": "/projects/{project_id}/data_flows", + "tags": ["Projects"], + "summary": "Remove Flows From A Project (Deprecated)", + "path_params": ["project_id"], + }, + "replace_code_container_accessors": { + "method": "POST", + "path": "/code_containers/{code_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Code Container", + "path_params": ["code_container_id"], + }, + "replace_data_credential_accessors": { + "method": "POST", + "path": "/data_credentials/{data_credential_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Data Credential", + "path_params": ["data_credential_id"], + }, + "replace_data_map_accessors": { + "method": "POST", + "path": "/data_maps/{data_map_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Data Map", + "path_params": ["data_map_id"], + }, + "replace_data_schema_accessors": { + "method": "POST", + "path": "/data_schemas/{data_schema_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Data Schema", + "path_params": ["data_schema_id"], + }, + "replace_data_sink_accessors": { + "method": "POST", + "path": "/data_sinks/{data_sink_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Data Sink", + "path_params": ["data_sink_id"], + }, + "replace_data_source_accessors": { + "method": "POST", + "path": "/data_sources/{data_source_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Data Source", + "path_params": ["data_source_id"], + }, + "replace_doc_container_accessors": { + "method": "POST", + "path": "/doc_containers/{doc_container_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Document", + "path_params": ["doc_container_id"], + }, + "replace_flow_accessors": { + "method": "POST", + "path": "/flows/{flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Flow", + "path_params": ["flow_id"], + }, + "replace_flow_accessors__deprecated": { + "method": "POST", + "path": "/data_flows/{data_flow_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Flow (Deprecated)", + "path_params": ["data_flow_id"], + }, + "replace_nexset_accessors": { + "method": "POST", + "path": "/data_sets/{data_set_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Nexset", + "path_params": ["data_set_id"], + }, + "replace_project_accessors": { + "method": "POST", + "path": "/projects/{project_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Access Rules on Project", + "path_params": ["project_id"], + }, + "replace_project_flows": { + "method": "POST", + "path": "/projects/{project_id}/flows", + "tags": ["Projects"], + "summary": "Replace Project Flows List", + "path_params": ["project_id"], + }, + "replace_project_flows__deprecated": { + "method": "POST", + "path": "/projects/{project_id}/data_flows", + "tags": ["Projects"], + "summary": "Replace Project Flows List (Deprecated)", + "path_params": ["project_id"], + }, + "replace_team_accessors": { + "method": "POST", + "path": "/teams/{team_id}/accessors", + "tags": ["Access Control"], + "summary": "Replace Team Accessors List", + "path_params": ["team_id"], + }, + "replace_team_members": { + "method": "POST", + "path": "/teams/{team_id}/members", + "tags": ["Teams"], + "summary": "Replace Team Members List", + "path_params": ["team_id"], + }, + "rerun_async_task": { + "method": "POST", + "path": "/async_tasks/{task_id}/rerun", + "tags": ["Async Tasks"], + "summary": "Rerun async operation", + "path_params": ["task_id"], + }, + "self_sign_up": { + "method": "POST", + "path": "/signup", + "tags": ["Self Sign-Up"], + "summary": "Sign Up", + "path_params": [], + }, + "update_api_auth_config": { + "method": "PUT", + "path": "/api_auth_configs/{auth_config_id}", + "tags": ["Org authentication configs"], + "summary": "Update auth config.", + "path_params": ["auth_config_id"], + }, + "update_api_auth_config_2": { + "method": "PUT", + "path": "/orgs/{org_id}/auth_settings/{auth_setting_id}", + "tags": ["Org authentication configs"], + "summary": "Update auth config (enable/disable).", + "path_params": ["auth_setting_id", "org_id"], + }, + "update_attribute_transform": { + "method": "PUT", + "path": "/attribute_transforms/{attribute_transform_id}", + "tags": ["Transforms"], + "summary": "Update Attribute Transform", + "path_params": ["attribute_transform_id"], + }, + "update_code_container": { + "method": "PUT", + "path": "/code_containers/{code_container_id}", + "tags": ["Code Containers"], + "summary": "Update a Code Container", + "path_params": ["code_container_id"], + }, + "update_data_credential": { + "method": "PUT", + "path": "/data_credentials/{credential_id}", + "tags": ["Credentials"], + "summary": "Update Credential", + "path_params": ["credential_id"], + }, + "update_data_map_metadata": { + "method": "PUT", + "path": "/data_maps/{data_map_id}", + "tags": ["Data Maps"], + "summary": "Update Data Map Metadata", + "path_params": ["data_map_id"], + }, + "update_data_sink": { + "method": "PUT", + "path": "/data_sinks/{sink_id}", + "tags": ["Destinations (Data Sinks)"], + "summary": "Update Sink", + "path_params": ["sink_id"], + }, + "update_data_source": { + "method": "PUT", + "path": "/data_sources/{source_id}", + "tags": ["Sources"], + "summary": "Update a Source", + "path_params": ["source_id"], + }, + "update_domain": { + "method": "PUT", + "path": "/marketplace/domains/{domain_id}", + "tags": ["Marketplace"], + "summary": "Update a single marketplace domain.", + "path_params": ["domain_id"], + }, + "update_domain_custodians": { + "method": "PUT", + "path": "/marketplace/domains/{domain_id}/custodians", + "tags": ["Marketplace"], + "summary": "Update custodians for a marketplace domain.", + "path_params": ["domain_id"], + }, + "update_gen_ai_integration_config": { + "method": "PUT", + "path": "/gen_ai_integration_configs/{gen_ai_config_id}", + "tags": ["GenAI Configs"], + "summary": "Update GenAI Integration Config", + "path_params": ["gen_ai_config_id"], + }, + "update_nexset": { + "method": "PUT", + "path": "/data_sets/{set_id}", + "tags": ["Nexsets (Data Sets)"], + "summary": "Update a Nexset", + "path_params": ["set_id"], + }, + "update_notification_channel_setting": { + "method": "PUT", + "path": "/notification_channel_settings/{notification_channel_setting_id}", + "tags": ["Notifications"], + "summary": "Update a Notification Channel Setting", + "path_params": ["notification_channel_setting_id"], + }, + "update_notification_setting": { + "method": "PUT", + "path": "/notification_settings/{notification_setting_id}", + "tags": ["Notifications"], + "summary": "Modify a Notification Setting", + "path_params": ["notification_setting_id"], + }, + "update_org": { + "method": "PUT", + "path": "/orgs/{org_id}", + "tags": ["Organizations"], + "summary": "Update an Organization", + "path_params": ["org_id"], + }, + "update_org_custodians": { + "method": "PUT", + "path": "/orgs/{org_id}/custodians", + "tags": ["Organizations"], + "summary": "Update organization custodians.", + "path_params": ["org_id"], + }, + "update_org_members": { + "method": "PUT", + "path": "/orgs/{org_id}/members", + "tags": ["Organizations"], + "summary": "Update Organization Members", + "path_params": ["org_id"], + }, + "update_project": { + "method": "PUT", + "path": "/projects/{project_id}", + "tags": ["Projects"], + "summary": "Modify a Project", + "path_params": ["project_id"], + }, + "update_reusable_record_transform": { + "method": "PUT", + "path": "/transforms/{transform_id}", + "tags": ["Transforms"], + "summary": "Update Reusable Record Transform", + "path_params": ["transform_id"], + }, + "update_runtime": { + "method": "PUT", + "path": "/runtimes/{runtime_id}", + "tags": ["Custom Runtimes"], + "summary": "Update a Custom Runtime", + "path_params": ["runtime_id"], + }, + "update_self_signup_blocked_domain": { + "method": "PUT", + "path": "/self_signup_blocked_domains/{domain_id}", + "tags": ["Self Sign-Up Admin"], + "summary": "Update self-sign-up blocked domain for admins.", + "path_params": ["domain_id"], + }, + "update_team": { + "method": "PUT", + "path": "/teams/{team_id}", + "tags": ["Teams"], + "summary": "Modify a Team", + "path_params": ["team_id"], + }, + "update_user": { + "method": "PUT", + "path": "/users/{user_id}", + "tags": ["Users"], + "summary": "Modify a User", + "path_params": ["user_id"], + }, + "update_user_quarantine_data_export_settings": { + "method": "PUT", + "path": "/users/{user_id}/quarantine_settings", + "tags": ["Quarantine Settings"], + "summary": "Update Quarantine Data Export Settings for A User", + "path_params": ["user_id"], + }, + "upsert_data_map_entries": { + "method": "PUT", + "path": "/data_maps/{data_map_id}/entries", + "tags": ["Data Maps"], + "summary": "Upsert Static Data Map Entries", + "path_params": ["data_map_id"], + }, + "user_24_hour_flow_stats": { + "method": "GET", + "path": "/users/{user_id}/flows/dashboard", + "tags": ["Metrics"], + "summary": "Get 24 Hour Flow Stats for a User", + "path_params": ["user_id"], + }, + "user_account_metrics_total": { + "method": "GET", + "path": "/users/{user_id}/flows/account_metrics", + "tags": ["Metrics"], + "summary": "Get Total Account Metrics for a User", + "path_params": ["user_id"], + }, + "user_metrics_daily": { + "method": "GET", + "path": "/users/{user_id}/metrics", + "tags": ["Metrics"], + "summary": "Get Daily Data Processing Metrics for a User", + "path_params": ["user_id"], + }, + "verify_email": { + "method": "GET", + "path": "/signup/verify_email", + "tags": ["Self Sign-Up"], + "summary": "Verify Email", + "path_params": [], + }, +} diff --git a/nexla_sdk/generated/schema.py b/nexla_sdk/generated/schema.py new file mode 100644 index 0000000..cc9ed41 --- /dev/null +++ b/nexla_sdk/generated/schema.py @@ -0,0 +1,22 @@ +"""Schema typing helpers for generated operation-level access.""" + +from typing import Any, Dict, List, TypedDict, Union + +JSONPrimitive = Union[str, int, float, bool, None] +JSONValue = Union[JSONPrimitive, Dict[str, "JSONValue"], List["JSONValue"]] +JSONObject = Dict[str, JSONValue] + + +class RawRequest(TypedDict, total=False): + path_params: Dict[str, Any] + query: Dict[str, Any] + body: JSONObject + headers: Dict[str, str] + + +class RawResponse(TypedDict, total=False): + status: str + message: str + data: Any + errors: List[str] + metadata: Dict[str, Any] diff --git a/nexla_sdk/models/__init__.py b/nexla_sdk/models/__init__.py index af19444..48a3c40 100644 --- a/nexla_sdk/models/__init__.py +++ b/nexla_sdk/models/__init__.py @@ -12,6 +12,7 @@ UserAccessorRequest, UserAccessorResponse, ) +from nexla_sdk.models.api_keys import ApiKey, ApiKeyCreate, ApiKeysIndex, ApiKeyUpdate from nexla_sdk.models.approval_requests import ApprovalDecision, ApprovalRequest from nexla_sdk.models.async_tasks import ( AsyncTask, @@ -24,13 +25,48 @@ AttributeTransformCreate, AttributeTransformUpdate, ) +from nexla_sdk.models.auth_parameters import AuthParameter as AuthParameterResource +from nexla_sdk.models.auth_parameters import ( + AuthParameterCreate as AuthParameterResourceCreate, +) +from nexla_sdk.models.auth_parameters import ( + AuthParameterUpdate as AuthParameterResourceUpdate, +) +from nexla_sdk.models.auth_templates import ( + AuthParameter, # Deprecated alias for AuthTemplateParameter +) +from nexla_sdk.models.auth_templates import ( + AuthParameterCreate, + AuthTemplate, + AuthTemplateCreate, + AuthTemplateParameter, + AuthTemplateUpdate, +) from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.catalog_configs import ( + CatalogConfig, + CatalogConfigCreate, + CatalogConfigUpdate, +) +from nexla_sdk.models.catalog_refs import CatalogRef, CatalogRefCreate, CatalogRefUpdate +from nexla_sdk.models.clusters import ( + Cluster, + ClusterCreate, + ClusterEndpoint, + ClusterEndpointCreate, + ClusterEndpointItem, + ClusterEndpointRef, + ClusterEndpointUpdate, + ClusterUpdate, +) from nexla_sdk.models.code_containers import ( CodeContainer, CodeContainerCreate, CodeContainerUpdate, ) from nexla_sdk.models.common import Connector, FlowNode, LogEntry, Organization, Owner +from nexla_sdk.models.connectors import Connector as ConnectorDefinition +from nexla_sdk.models.connectors import ConnectorUpdate # Import all models from subpackages from nexla_sdk.models.credentials import ( @@ -44,6 +80,22 @@ ProbeTreeResponse, VerifiedStatus, ) +from nexla_sdk.models.custom_data_flows import ( + CustomDataFlow, + CustomDataFlowCreate, + CustomDataFlowUpdate, +) +from nexla_sdk.models.dashboard_transforms import ( + DashboardTransform, + DashboardTransformCreate, + DashboardTransformUpdate, +) +from nexla_sdk.models.data_credentials_groups import ( + DataCredentialsGroup, + DataCredentialsGroupCreate, + DataCredentialsGroupRemoveCredentials, + DataCredentialsGroupUpdate, +) from nexla_sdk.models.data_schemas import DataSchema from nexla_sdk.models.destinations import ( DataMapInfo, @@ -68,6 +120,15 @@ UserStatus, UserTier, ) +from nexla_sdk.models.flexible_enums import ( + FlexibleConnectorCategory, + FlexibleCredentialType, + FlexibleDestinationFormat, + FlexibleDestinationType, + FlexibleEnum, + FlexibleSourceType, +) +from nexla_sdk.models.flow_triggers import FlowTrigger, FlowTriggerCreate from nexla_sdk.models.flows import ( DocsRecommendation, FlowCopyOptions, @@ -124,6 +185,18 @@ OutputType, TransformType, ) +from nexla_sdk.models.notification_channel_settings import ( + NotificationChannelSetting as NotificationChannelSettingResource, +) +from nexla_sdk.models.notification_channel_settings import ( + NotificationChannelSettingCreate as NotificationChannelSettingResourceCreate, +) +from nexla_sdk.models.notification_channel_settings import ( + NotificationChannelSettingUpdate as NotificationChannelSettingResourceUpdate, +) +from nexla_sdk.models.notification_types import ( + NotificationType as NotificationTypeResource, +) from nexla_sdk.models.notifications import ( Notification, NotificationChannelSetting, @@ -131,11 +204,13 @@ NotificationChannelSettingUpdate, NotificationCount, NotificationSetting, + NotificationSettingBrief, NotificationSettingCreate, NotificationSettingUpdate, NotificationType, ) from nexla_sdk.models.org_auth_configs import AuthConfig, AuthConfigPayload +from nexla_sdk.models.org_tiers import OrgTier as OrgTierInfo from nexla_sdk.models.organizations import ( CustodianUser, OrganizationUpdate, @@ -155,8 +230,19 @@ ProjectFlowList, ProjectUpdate, ) +from nexla_sdk.models.quarantine_settings import ( + QuarantineSetting, + QuarantineSettingCreate, + QuarantineSettingUpdate, +) +from nexla_sdk.models.resource_parameters import ( + ResourceParameter, + ResourceParameterCreate, + ResourceParameterUpdate, +) from nexla_sdk.models.runtimes import Runtime, RuntimeCreate, RuntimeUpdate from nexla_sdk.models.self_signup import BlockedDomain, SelfSignupRequest +from nexla_sdk.models.service_keys import ServiceKey, ServiceKeyCreate, ServiceKeyUpdate from nexla_sdk.models.sources import ( DataSetBrief, FlowType, @@ -178,16 +264,36 @@ TeamUpdate, ) from nexla_sdk.models.transforms import Transform, TransformCreate, TransformUpdate +from nexla_sdk.models.user_settings import ( + UserSetting, + UserSettingCreate, + UserSettingUpdate, +) +from nexla_sdk.models.user_tiers import UserTier as UserTierInfo from nexla_sdk.models.users import ( AccountSummary, DefaultOrg, OrgMembership, User, UserCreate, + UserCredit, + UserCreditCreate, UserExpanded, UserSettings, UserUpdate, ) +from nexla_sdk.models.validators import ( + Validator, + ValidatorCopyOptions, + ValidatorCreate, + ValidatorUpdate, +) +from nexla_sdk.models.vendor_endpoints import ( + VendorEndpoint, + VendorEndpointCreate, + VendorEndpointUpdate, +) +from nexla_sdk.models.vendors import Vendor, VendorCreate, VendorRef, VendorUpdate from nexla_sdk.models.webhooks import WebhookResponse, WebhookSendOptions __all__ = [ @@ -211,6 +317,9 @@ "AccessorRequestList", "AccessorResponseList", "AccessorType", + # API Keys + "ApiKey", + "ApiKeysIndex", # General Enums "AccessRole", "ResourceStatus", @@ -221,6 +330,35 @@ "UserStatus", "OrgMembershipStatus", "ConnectorCategory", + # Auth Templates + "AuthTemplate", + "AuthTemplateCreate", + "AuthTemplateUpdate", + "AuthTemplateParameter", + "AuthParameterCreate", + "AuthParameter", # Deprecated - use AuthTemplateParameter instead + # Clusters + "Cluster", + "ClusterCreate", + "ClusterUpdate", + "ClusterEndpoint", + "ClusterEndpointCreate", + "ClusterEndpointUpdate", + "ClusterEndpointItem", + "ClusterEndpointRef", + # Connectors + "ConnectorDefinition", + "ConnectorUpdate", + # Flexible Enum helpers + "FlexibleEnum", + "FlexibleDestinationType", + "FlexibleDestinationFormat", + "FlexibleSourceType", + "FlexibleCredentialType", + "FlexibleConnectorCategory", + # Flow Triggers + "FlowTrigger", + "FlowTriggerCreate", # Credential models and enums "CredentialType", "VerifiedStatus", @@ -318,6 +456,7 @@ "NotificationType", "NotificationChannelSetting", "NotificationSetting", + "NotificationSettingBrief", "NotificationCount", "NotificationChannelSettingCreate", "NotificationChannelSettingUpdate", @@ -340,6 +479,16 @@ "Transform", "TransformCreate", "TransformUpdate", + # Validators + "Validator", + "ValidatorCreate", + "ValidatorUpdate", + "ValidatorCopyOptions", + # Vendors + "Vendor", + "VendorCreate", + "VendorUpdate", + "VendorRef", # Attribute transforms "AttributeTransform", "AttributeTransformCreate", @@ -375,10 +524,66 @@ # Self-signup "SelfSignupRequest", "BlockedDomain", + # Service Keys + "ServiceKey", + "ServiceKeyCreate", + "ServiceKeyUpdate", # Doc containers / Data schemas "DocContainer", "DocContainerInput", "DataSchema", + # Custom data flows + "CustomDataFlow", + "CustomDataFlowCreate", + "CustomDataFlowUpdate", + # API keys (requests) + "ApiKeyCreate", + "ApiKeyUpdate", + # Data credentials groups + "DataCredentialsGroup", + "DataCredentialsGroupCreate", + "DataCredentialsGroupUpdate", + "DataCredentialsGroupRemoveCredentials", + # Auth/resource parameters + "AuthParameterResource", + "AuthParameterResourceCreate", + "AuthParameterResourceUpdate", + "ResourceParameter", + "ResourceParameterCreate", + "ResourceParameterUpdate", + # Vendor endpoints + "VendorEndpoint", + "VendorEndpointCreate", + "VendorEndpointUpdate", + # Notification channel/types (resource-level) + "NotificationChannelSettingResource", + "NotificationChannelSettingResourceCreate", + "NotificationChannelSettingResourceUpdate", + "NotificationTypeResource", + # Quarantine settings + "QuarantineSetting", + "QuarantineSettingCreate", + "QuarantineSettingUpdate", + # Dashboard transforms + "DashboardTransform", + "DashboardTransformCreate", + "DashboardTransformUpdate", + # Catalog configs/refs + "CatalogConfig", + "CatalogConfigCreate", + "CatalogConfigUpdate", + "CatalogRef", + "CatalogRefCreate", + "CatalogRefUpdate", + # Org/User tiers and settings + "OrgTierInfo", + "UserTierInfo", + "UserSetting", + "UserSettingCreate", + "UserSettingUpdate", + # User credits + "UserCredit", + "UserCreditCreate", # Webhooks "WebhookSendOptions", "WebhookResponse", diff --git a/nexla_sdk/models/api_keys/__init__.py b/nexla_sdk/models/api_keys/__init__.py new file mode 100644 index 0000000..7322d3c --- /dev/null +++ b/nexla_sdk/models/api_keys/__init__.py @@ -0,0 +1,11 @@ +"""API Keys models.""" + +from nexla_sdk.models.api_keys.requests import ApiKeyCreate, ApiKeyUpdate +from nexla_sdk.models.api_keys.responses import ApiKey, ApiKeysIndex + +__all__ = [ + "ApiKey", + "ApiKeysIndex", + "ApiKeyCreate", + "ApiKeyUpdate", +] diff --git a/nexla_sdk/models/api_keys/requests.py b/nexla_sdk/models/api_keys/requests.py new file mode 100644 index 0000000..3fb1dca --- /dev/null +++ b/nexla_sdk/models/api_keys/requests.py @@ -0,0 +1,17 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class ApiKeyCreate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + scope: Optional[str] = None + expires_at: Optional[str] = None + + +class ApiKeyUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + scope: Optional[str] = None + expires_at: Optional[str] = None diff --git a/nexla_sdk/models/api_keys/responses.py b/nexla_sdk/models/api_keys/responses.py new file mode 100644 index 0000000..f98fe40 --- /dev/null +++ b/nexla_sdk/models/api_keys/responses.py @@ -0,0 +1,43 @@ +"""API Keys response models.""" + +from datetime import datetime +from typing import List, Optional + +from nexla_sdk.models.base import BaseModel + + +class ApiKey(BaseModel): + """API key response model. + + API keys are used for programmatic access to specific resources + like datasets, data sources, data sinks, and users. + """ + + id: int + owner_id: Optional[int] = None + org_id: Optional[int] = None + data_set_id: Optional[int] = None + data_source_id: Optional[int] = None + data_sink_id: Optional[int] = None + user_id: Optional[int] = None + cluster_id: Optional[int] = None # Super user only + cluster_uid: Optional[str] = None # Super user only + name: Optional[str] = None + description: Optional[str] = None + status: Optional[str] = None + scope: Optional[str] = None + api_key: Optional[str] = None + url: Optional[str] = None + last_rotated_key: Optional[str] = None + last_rotated_at: Optional[datetime] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + +class ApiKeysIndex(BaseModel): + """Response model for API keys index (grouped by type).""" + + data_sets: Optional[List[ApiKey]] = None + data_sinks: Optional[List[ApiKey]] = None + data_sources: Optional[List[ApiKey]] = None + users: Optional[List[ApiKey]] = None diff --git a/nexla_sdk/models/auth_parameters/__init__.py b/nexla_sdk/models/auth_parameters/__init__.py new file mode 100644 index 0000000..05e3283 --- /dev/null +++ b/nexla_sdk/models/auth_parameters/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.auth_parameters.requests import ( + AuthParameterCreate, + AuthParameterUpdate, +) +from nexla_sdk.models.auth_parameters.responses import AuthParameter + +__all__ = [ + "AuthParameter", + "AuthParameterCreate", + "AuthParameterUpdate", +] diff --git a/nexla_sdk/models/auth_parameters/requests.py b/nexla_sdk/models/auth_parameters/requests.py new file mode 100644 index 0000000..5c15260 --- /dev/null +++ b/nexla_sdk/models/auth_parameters/requests.py @@ -0,0 +1,31 @@ +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel + + +class AuthParameterCreate(BaseModel): + name: str + display_name: Optional[str] = None + description: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + secured: Optional[bool] = None + global_param: Optional[bool] = None + auth_template_id: Optional[int] = None + vendor_id: Optional[int] = None + allowed_values: Optional[List[Any]] = None + + +class AuthParameterUpdate(BaseModel): + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + secured: Optional[bool] = None + global_param: Optional[bool] = None + auth_template_id: Optional[int] = None + vendor_id: Optional[int] = None + allowed_values: Optional[List[Any]] = None diff --git a/nexla_sdk/models/auth_parameters/responses.py b/nexla_sdk/models/auth_parameters/responses.py new file mode 100644 index 0000000..aa908fb --- /dev/null +++ b/nexla_sdk/models/auth_parameters/responses.py @@ -0,0 +1,27 @@ +from datetime import datetime +from typing import TYPE_CHECKING, Any, Dict, List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.vendors.responses import Vendor + +if TYPE_CHECKING: + from nexla_sdk.models.auth_templates.responses import AuthTemplate + + +class AuthParameter(BaseModel): + id: int + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + secured: Optional[bool] = None + global_param: Optional[bool] = Field(default=None, alias="global") + vendor: Optional[Vendor] = None + auth_template: Optional["AuthTemplate"] = None + allowed_values: Optional[List[Any]] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/auth_templates/__init__.py b/nexla_sdk/models/auth_templates/__init__.py new file mode 100644 index 0000000..eaf091d --- /dev/null +++ b/nexla_sdk/models/auth_templates/__init__.py @@ -0,0 +1,24 @@ +"""Auth template models.""" + +from nexla_sdk.models.auth_templates.requests import ( + AuthParameterCreate, + AuthTemplateCreate, + AuthTemplateUpdate, +) +from nexla_sdk.models.auth_templates.responses import ( + AuthParameter, # Deprecated alias for backward compatibility +) +from nexla_sdk.models.auth_templates.responses import ( + AuthTemplate, + AuthTemplateParameter, +) + +__all__ = [ + "AuthTemplate", + "AuthTemplateCreate", + "AuthTemplateUpdate", + "AuthTemplateParameter", + "AuthParameterCreate", + # Deprecated - use AuthTemplateParameter instead + "AuthParameter", +] diff --git a/nexla_sdk/models/auth_templates/requests.py b/nexla_sdk/models/auth_templates/requests.py new file mode 100644 index 0000000..ddd6811 --- /dev/null +++ b/nexla_sdk/models/auth_templates/requests.py @@ -0,0 +1,37 @@ +"""Auth template request models.""" + +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel + + +class AuthParameterCreate(BaseModel): + """Auth parameter for template creation.""" + + name: str + display_name: Optional[str] = None + description: Optional[str] = None + param_type: Optional[str] = None + required: Optional[bool] = None + default_value: Optional[Any] = None + config: Optional[Dict[str, Any]] = None + + +class AuthTemplateCreate(BaseModel): + """Request model for creating an auth template (super user only).""" + + name: str + vendor_id: int + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None + auth_parameters: Optional[List[AuthParameterCreate]] = None + + +class AuthTemplateUpdate(BaseModel): + """Request model for updating an auth template (super user only).""" + + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/auth_templates/responses.py b/nexla_sdk/models/auth_templates/responses.py new file mode 100644 index 0000000..26ea463 --- /dev/null +++ b/nexla_sdk/models/auth_templates/responses.py @@ -0,0 +1,49 @@ +"""Auth template response models.""" + +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.vendors.responses import VendorRef + + +class AuthTemplateParameter(BaseModel): + """Auth parameter configuration for auth templates. + + This is a lightweight nested model used within AuthTemplate responses. + For the full auth parameter resource model, see nexla_sdk.models.auth_parameters. + """ + + id: Optional[int] = None + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + param_type: Optional[str] = None + required: Optional[bool] = None + default_value: Optional[Any] = None + config: Optional[Dict[str, Any]] = None + + +# Deprecated alias for backward compatibility +AuthParameter = AuthTemplateParameter + + +class AuthTemplate(BaseModel): + """Auth template response model. + + Auth templates define authentication configurations for vendors. + """ + + id: int + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None + credentials_type: Optional[str] = None # From associated connector + vendor: Optional[VendorRef] = None + vendor_id: Optional[int] = None + auth_parameters: Optional[List[AuthTemplateParameter]] = Field(default_factory=list) + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/catalog_configs/__init__.py b/nexla_sdk/models/catalog_configs/__init__.py new file mode 100644 index 0000000..3512412 --- /dev/null +++ b/nexla_sdk/models/catalog_configs/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.catalog_configs.requests import ( + CatalogConfigCreate, + CatalogConfigUpdate, +) +from nexla_sdk.models.catalog_configs.responses import CatalogConfig + +__all__ = [ + "CatalogConfig", + "CatalogConfigCreate", + "CatalogConfigUpdate", +] diff --git a/nexla_sdk/models/catalog_configs/requests.py b/nexla_sdk/models/catalog_configs/requests.py new file mode 100644 index 0000000..74da22c --- /dev/null +++ b/nexla_sdk/models/catalog_configs/requests.py @@ -0,0 +1,21 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class CatalogConfigCreate(BaseModel): + name: str + description: Optional[str] = None + data_credentials_id: Optional[int] = None + config: Optional[Dict[str, Any]] = None + templates: Optional[Dict[str, Any]] = None + mode: Optional[str] = None + + +class CatalogConfigUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + data_credentials_id: Optional[int] = None + config: Optional[Dict[str, Any]] = None + templates: Optional[Dict[str, Any]] = None + mode: Optional[str] = None diff --git a/nexla_sdk/models/catalog_configs/responses.py b/nexla_sdk/models/catalog_configs/responses.py new file mode 100644 index 0000000..c1f789e --- /dev/null +++ b/nexla_sdk/models/catalog_configs/responses.py @@ -0,0 +1,22 @@ +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner +from nexla_sdk.models.credentials.responses import Credential + + +class CatalogConfig(BaseModel): + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + data_credentials: Optional[Credential] = None + name: Optional[str] = None + description: Optional[str] = None + status: Optional[str] = None + config: Optional[Dict[str, Any]] = None + templates: Optional[Dict[str, Any]] = None + mode: Optional[str] = None + job_id: Optional[str] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/catalog_refs/__init__.py b/nexla_sdk/models/catalog_refs/__init__.py new file mode 100644 index 0000000..f3106f8 --- /dev/null +++ b/nexla_sdk/models/catalog_refs/__init__.py @@ -0,0 +1,8 @@ +from nexla_sdk.models.catalog_refs.requests import CatalogRefCreate, CatalogRefUpdate +from nexla_sdk.models.catalog_refs.responses import CatalogRef + +__all__ = [ + "CatalogRef", + "CatalogRefCreate", + "CatalogRefUpdate", +] diff --git a/nexla_sdk/models/catalog_refs/requests.py b/nexla_sdk/models/catalog_refs/requests.py new file mode 100644 index 0000000..d22af99 --- /dev/null +++ b/nexla_sdk/models/catalog_refs/requests.py @@ -0,0 +1,16 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class CatalogRefCreate(BaseModel): + data_set_id: int + catalog_config_id: int + reference_id: Optional[str] = None + link: Optional[str] = None + + +class CatalogRefUpdate(BaseModel): + reference_id: Optional[str] = None + link: Optional[str] = None + status: Optional[str] = None diff --git a/nexla_sdk/models/catalog_refs/responses.py b/nexla_sdk/models/catalog_refs/responses.py new file mode 100644 index 0000000..eb172b3 --- /dev/null +++ b/nexla_sdk/models/catalog_refs/responses.py @@ -0,0 +1,17 @@ +from datetime import datetime +from typing import Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.catalog_configs.responses import CatalogConfig + + +class CatalogRef(BaseModel): + id: int + data_set_id: Optional[int] = None + status: Optional[str] = None + reference_id: Optional[str] = None + link: Optional[str] = None + error_msg: Optional[str] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None + catalog_config: Optional[CatalogConfig] = None diff --git a/nexla_sdk/models/clusters/__init__.py b/nexla_sdk/models/clusters/__init__.py new file mode 100644 index 0000000..bec39ae --- /dev/null +++ b/nexla_sdk/models/clusters/__init__.py @@ -0,0 +1,25 @@ +"""Cluster models.""" + +from nexla_sdk.models.clusters.requests import ( + ClusterCreate, + ClusterEndpointCreate, + ClusterEndpointItem, + ClusterEndpointUpdate, + ClusterUpdate, +) +from nexla_sdk.models.clusters.responses import ( + Cluster, + ClusterEndpoint, + ClusterEndpointRef, +) + +__all__ = [ + "Cluster", + "ClusterCreate", + "ClusterUpdate", + "ClusterEndpoint", + "ClusterEndpointCreate", + "ClusterEndpointUpdate", + "ClusterEndpointItem", + "ClusterEndpointRef", +] diff --git a/nexla_sdk/models/clusters/requests.py b/nexla_sdk/models/clusters/requests.py new file mode 100644 index 0000000..9594ec3 --- /dev/null +++ b/nexla_sdk/models/clusters/requests.py @@ -0,0 +1,63 @@ +"""Cluster request models.""" + +from typing import List, Optional + +from nexla_sdk.models.base import BaseModel + + +class ClusterEndpointItem(BaseModel): + """Endpoint configuration for cluster create/update.""" + + service: str + protocol: Optional[str] = None + host: Optional[str] = None + port: Optional[int] = None + context: Optional[str] = None + header_host: Optional[str] = None + + +class ClusterCreate(BaseModel): + """Request model for creating a cluster.""" + + org_id: int + name: str + region: str # Required + description: Optional[str] = None + provider: Optional[str] = None # aws, gcp, azure, private + is_default: Optional[bool] = None + is_private: Optional[bool] = None + endpoints: Optional[List[ClusterEndpointItem]] = None + + +class ClusterUpdate(BaseModel): + """Request model for updating a cluster.""" + + name: Optional[str] = None + description: Optional[str] = None + provider: Optional[str] = None + is_default: Optional[bool] = None + is_private: Optional[bool] = None + endpoints: Optional[List[ClusterEndpointItem]] = None + + +class ClusterEndpointCreate(BaseModel): + """Request model for creating a cluster endpoint.""" + + cluster_id: int + service: str + protocol: Optional[str] = None + host: Optional[str] = None + port: Optional[int] = None + context: Optional[str] = None + header_host: Optional[str] = None + + +class ClusterEndpointUpdate(BaseModel): + """Request model for updating a cluster endpoint.""" + + service: Optional[str] = None + protocol: Optional[str] = None + host: Optional[str] = None + port: Optional[int] = None + context: Optional[str] = None + header_host: Optional[str] = None diff --git a/nexla_sdk/models/clusters/responses.py b/nexla_sdk/models/clusters/responses.py new file mode 100644 index 0000000..1609ec0 --- /dev/null +++ b/nexla_sdk/models/clusters/responses.py @@ -0,0 +1,64 @@ +"""Cluster response models.""" + +from datetime import datetime +from typing import List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization + + +class ClusterEndpointRef(BaseModel): + """Cluster endpoint reference for cluster response.""" + + id: int + service: Optional[str] = None + protocol: Optional[str] = None + host: Optional[str] = None + port: Optional[int] = None + context: Optional[str] = None + header_host: Optional[str] = None + + +class Cluster(BaseModel): + """Cluster response model. + + Clusters define infrastructure endpoints for processing data flows. + They contain multiple endpoints for different services. + """ + + id: int + org_id: Optional[int] = None + uid: Optional[str] = None + is_default: Optional[bool] = None + is_private: Optional[bool] = None + name: Optional[str] = None + description: Optional[str] = None + status: Optional[str] = None # INIT, ACTIVE, PAUSED + region: Optional[str] = None + provider: Optional[str] = None # aws, gcp, azure, private + org: Optional[Organization] = None + endpoints: Optional[List[ClusterEndpointRef]] = Field(default_factory=list) + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + +class ClusterEndpoint(BaseModel): + """Cluster endpoint response model. + + Endpoints define individual service connections within a cluster. + """ + + id: int + cluster_id: Optional[int] = None + org_id: Optional[int] = None + service: Optional[str] = None + protocol: Optional[str] = None + host: Optional[str] = None + port: Optional[int] = None + context: Optional[str] = None + header_host: Optional[str] = None + org: Optional[Organization] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/common.py b/nexla_sdk/models/common.py index 23ec243..2199b5d 100644 --- a/nexla_sdk/models/common.py +++ b/nexla_sdk/models/common.py @@ -2,6 +2,10 @@ from typing import Any, Dict, List, Optional from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.flexible_enums import ( + FlexibleConnectionType, + FlexibleConnectorType, +) class Owner(BaseModel): @@ -35,8 +39,8 @@ class Connector(BaseModel): """Connector information.""" id: int - type: str - connection_type: str + type: FlexibleConnectorType + connection_type: FlexibleConnectionType name: str description: str nexset_api_compatible: bool diff --git a/nexla_sdk/models/connectors/__init__.py b/nexla_sdk/models/connectors/__init__.py new file mode 100644 index 0000000..7e8dfbe --- /dev/null +++ b/nexla_sdk/models/connectors/__init__.py @@ -0,0 +1,28 @@ +"""Connector models.""" + +from typing import TYPE_CHECKING, Any + +from nexla_sdk.models.connectors.enums import ConnectionType, ConnectorType + +if TYPE_CHECKING: + from nexla_sdk.models.connectors.requests import ConnectorUpdate + from nexla_sdk.models.connectors.responses import Connector + +__all__ = [ + "Connector", + "ConnectorType", + "ConnectionType", + "ConnectorUpdate", +] + + +def __getattr__(name: str) -> Any: + if name == "Connector": + from nexla_sdk.models.connectors.responses import Connector + + return Connector + if name == "ConnectorUpdate": + from nexla_sdk.models.connectors.requests import ConnectorUpdate + + return ConnectorUpdate + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/nexla_sdk/models/connectors/enums.py b/nexla_sdk/models/connectors/enums.py new file mode 100644 index 0000000..c40105f --- /dev/null +++ b/nexla_sdk/models/connectors/enums.py @@ -0,0 +1,106 @@ +"""Connector enums for the /connectors endpoint.""" + +from enum import Enum + + +class ConnectorType(str, Enum): + """All supported connector types. + + This is the comprehensive enum used by the /connectors endpoint. + It includes all source and destination connector types. + """ + + # File Systems + S3 = "s3" + GCS = "gcs" + AZURE_BLB = "azure_blb" + AZURE_DATA_LAKE = "azure_data_lake" + FTP = "ftp" + DROPBOX = "dropbox" + BOX = "box" + GDRIVE = "gdrive" + SHAREPOINT = "sharepoint" + MIN_IO_S3 = "min_io_s3" + WEBDAV = "webdav" + + # Databases - Traditional RDBMS + MYSQL = "mysql" + POSTGRES = "postgres" + SUPABASE = "supabase" + SQLSERVER = "sqlserver" + ORACLE = "oracle" + ORACLE_AUTONOMOUS = "oracle_autonomous" + AS400 = "as400" + DB2 = "db2" + SYBASE = "sybase" + HANA_JDBC = "hana_jdbc" + NETSUITE_JDBC = "netsuite_jdbc" + + # Databases - Cloud Data Warehouses + REDSHIFT = "redshift" + SNOWFLAKE = "snowflake" + SNOWFLAKE_DCR = "snowflake_dcr" + BIGQUERY = "bigquery" + DATABRICKS = "databricks" + AWS_ATHENA = "aws_athena" + AZURE_SYNAPSE = "azure_synapse" + FIREBOLT = "firebolt" + TERADATA = "teradata" + HIVE = "hive" + + # Databases - Google Cloud SQL + CLOUDSQL_MYSQL = "cloudsql_mysql" + CLOUDSQL_POSTGRES = "cloudsql_postgres" + CLOUDSQL_SQLSERVER = "cloudsql_sqlserver" + + # Databases - Google Cloud + GCP_ALLOYDB = "gcp_alloydb" + GCP_SPANNER = "gcp_spanner" + + # Delta Lake / Iceberg + DELTA_LAKE_AZURE_BLB = "delta_lake_azure_blb" + DELTA_LAKE_AZURE_DATA_LAKE = "delta_lake_azure_data_lake" + DELTA_LAKE_S3 = "delta_lake_s3" + S3_ICEBERG = "s3_iceberg" + + # NoSQL + MONGO = "mongo" + DYNAMODB = "dynamodb" + FIREBASE = "firebase" + + # Streaming / Messaging + KAFKA = "kafka" + CONFLUENT_KAFKA = "confluent_kafka" + GOOGLE_PUBSUB = "google_pubsub" + JMS = "jms" + TIBCO = "tibco" + + # APIs + REST = "rest" + SOAP = "soap" + NEXLA_REST = "nexla_rest" + + # Special + FILE_UPLOAD = "file_upload" + EMAIL = "email" + NEXLA_MONITOR = "nexla_monitor" + DATA_MAP = "data_map" + + # Vector Databases + PINECONE = "pinecone" + + +class ConnectionType(str, Enum): + """Connection type categories for connectors. + + Maps to the `connection_type` field in Connector responses. + """ + + FILE = "file" + DATABASE = "database" + NOSQL = "nosql" + STREAMING = "streaming" + API = "api" + VECTOR_DB = "vector_db" + SPECIAL = "special" + DATA_LAKE = "data_lake" diff --git a/nexla_sdk/models/connectors/requests.py b/nexla_sdk/models/connectors/requests.py new file mode 100644 index 0000000..7fbd3dc --- /dev/null +++ b/nexla_sdk/models/connectors/requests.py @@ -0,0 +1,15 @@ +"""Connector request models.""" + +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class ConnectorUpdate(BaseModel): + """Request model for updating a connector (super user only).""" + + name: Optional[str] = None + description: Optional[str] = None + nexset_api_compatible: Optional[bool] = None + sync_api_compatible: Optional[bool] = None + config: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/connectors/responses.py b/nexla_sdk/models/connectors/responses.py new file mode 100644 index 0000000..1436e97 --- /dev/null +++ b/nexla_sdk/models/connectors/responses.py @@ -0,0 +1,28 @@ +"""Connector response models.""" + +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.flexible_enums import ( + FlexibleConnectionType, + FlexibleConnectorType, +) + + +class Connector(BaseModel): + """Connector response model. + + Connectors define connection types for data sources and destinations. + """ + + id: int + type: Optional[FlexibleConnectorType] = None + connection_type: Optional[FlexibleConnectionType] = None + name: Optional[str] = None + description: Optional[str] = None + nexset_api_compatible: Optional[bool] = None + sync_api_compatible: Optional[bool] = None + config: Optional[Dict[str, Any]] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/credentials/__init__.py b/nexla_sdk/models/credentials/__init__.py index 1e87da7..5bb5817 100644 --- a/nexla_sdk/models/credentials/__init__.py +++ b/nexla_sdk/models/credentials/__init__.py @@ -1,15 +1,19 @@ +from typing import TYPE_CHECKING, Any + from nexla_sdk.models.credentials.enums import CredentialType, VerifiedStatus -from nexla_sdk.models.credentials.requests import ( - CredentialCreate, - CredentialUpdate, - ProbeSampleRequest, - ProbeTreeRequest, -) -from nexla_sdk.models.credentials.responses import ( - Credential, - ProbeSampleResponse, - ProbeTreeResponse, -) + +if TYPE_CHECKING: + from nexla_sdk.models.credentials.requests import ( + CredentialCreate, + CredentialUpdate, + ProbeSampleRequest, + ProbeTreeRequest, + ) + from nexla_sdk.models.credentials.responses import ( + Credential, + ProbeSampleResponse, + ProbeTreeResponse, + ) __all__ = [ # Enums @@ -25,3 +29,20 @@ "ProbeTreeRequest", "ProbeSampleRequest", ] + + +def __getattr__(name: str) -> Any: + if name in { + "CredentialCreate", + "CredentialUpdate", + "ProbeTreeRequest", + "ProbeSampleRequest", + }: + from nexla_sdk.models.credentials import requests as _requests + + return getattr(_requests, name) + if name in {"Credential", "ProbeTreeResponse", "ProbeSampleResponse"}: + from nexla_sdk.models.credentials import responses as _responses + + return getattr(_responses, name) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/nexla_sdk/models/credentials/responses.py b/nexla_sdk/models/credentials/responses.py index 06c115f..20432f4 100644 --- a/nexla_sdk/models/credentials/responses.py +++ b/nexla_sdk/models/credentials/responses.py @@ -5,6 +5,7 @@ from nexla_sdk.models.base import BaseModel from nexla_sdk.models.common import Connector, Organization, Owner +from nexla_sdk.models.flexible_enums import FlexibleCredentialType class Credential(BaseModel): @@ -12,7 +13,7 @@ class Credential(BaseModel): id: int name: str - credentials_type: str + credentials_type: FlexibleCredentialType owner: Optional[Owner] = None org: Optional[Organization] = None access_roles: Optional[List[str]] = None diff --git a/nexla_sdk/models/custom_data_flows/__init__.py b/nexla_sdk/models/custom_data_flows/__init__.py new file mode 100644 index 0000000..bae3cde --- /dev/null +++ b/nexla_sdk/models/custom_data_flows/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.custom_data_flows.requests import ( + CustomDataFlowCreate, + CustomDataFlowUpdate, +) +from nexla_sdk.models.custom_data_flows.responses import CustomDataFlow + +__all__ = [ + "CustomDataFlow", + "CustomDataFlowCreate", + "CustomDataFlowUpdate", +] diff --git a/nexla_sdk/models/custom_data_flows/requests.py b/nexla_sdk/models/custom_data_flows/requests.py new file mode 100644 index 0000000..cb9dff8 --- /dev/null +++ b/nexla_sdk/models/custom_data_flows/requests.py @@ -0,0 +1,25 @@ +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel + + +class CustomDataFlowCreate(BaseModel): + name: str + description: Optional[str] = None + flow_type: Optional[str] = None + status: Optional[str] = None + managed: Optional[bool] = None + config: Optional[Dict[str, Any]] = None + code_container_ids: Optional[List[int]] = None + data_credentials_ids: Optional[List[int]] = None + + +class CustomDataFlowUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + flow_type: Optional[str] = None + status: Optional[str] = None + managed: Optional[bool] = None + config: Optional[Dict[str, Any]] = None + code_container_ids: Optional[List[int]] = None + data_credentials_ids: Optional[List[int]] = None diff --git a/nexla_sdk/models/custom_data_flows/responses.py b/nexla_sdk/models/custom_data_flows/responses.py new file mode 100644 index 0000000..2f593c0 --- /dev/null +++ b/nexla_sdk/models/custom_data_flows/responses.py @@ -0,0 +1,26 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.code_containers.responses import CodeContainer +from nexla_sdk.models.common import Organization, Owner +from nexla_sdk.models.credentials.responses import Credential + + +class CustomDataFlow(BaseModel): + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + name: Optional[str] = None + description: Optional[str] = None + flow_type: Optional[str] = None + status: Optional[str] = None + managed: Optional[bool] = None + config: Optional[Dict[str, Any]] = None + code_containers: Optional[List[CodeContainer]] = None + data_credentials: Optional[List[Credential]] = None + access_roles: Optional[List[str]] = None + tags: Optional[List[str]] = None + copied_from_id: Optional[int] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/dashboard_transforms/__init__.py b/nexla_sdk/models/dashboard_transforms/__init__.py new file mode 100644 index 0000000..f1d6a83 --- /dev/null +++ b/nexla_sdk/models/dashboard_transforms/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.dashboard_transforms.requests import ( + DashboardTransformCreate, + DashboardTransformUpdate, +) +from nexla_sdk.models.dashboard_transforms.responses import DashboardTransform + +__all__ = [ + "DashboardTransform", + "DashboardTransformCreate", + "DashboardTransformUpdate", +] diff --git a/nexla_sdk/models/dashboard_transforms/requests.py b/nexla_sdk/models/dashboard_transforms/requests.py new file mode 100644 index 0000000..c7c4aa5 --- /dev/null +++ b/nexla_sdk/models/dashboard_transforms/requests.py @@ -0,0 +1,11 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class DashboardTransformCreate(BaseModel): + code_container_id: int + + +class DashboardTransformUpdate(BaseModel): + code_container_id: Optional[int] = None diff --git a/nexla_sdk/models/dashboard_transforms/responses.py b/nexla_sdk/models/dashboard_transforms/responses.py new file mode 100644 index 0000000..5ef72e7 --- /dev/null +++ b/nexla_sdk/models/dashboard_transforms/responses.py @@ -0,0 +1,14 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.code_containers.responses import CodeContainer +from nexla_sdk.models.common import Organization, Owner + + +class DashboardTransform(BaseModel): + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + resource_type: Optional[str] = None + resource_id: Optional[int] = None + error_transform: Optional[CodeContainer] = None diff --git a/nexla_sdk/models/data_credentials_groups/__init__.py b/nexla_sdk/models/data_credentials_groups/__init__.py new file mode 100644 index 0000000..98f8c80 --- /dev/null +++ b/nexla_sdk/models/data_credentials_groups/__init__.py @@ -0,0 +1,13 @@ +from nexla_sdk.models.data_credentials_groups.requests import ( + DataCredentialsGroupCreate, + DataCredentialsGroupRemoveCredentials, + DataCredentialsGroupUpdate, +) +from nexla_sdk.models.data_credentials_groups.responses import DataCredentialsGroup + +__all__ = [ + "DataCredentialsGroup", + "DataCredentialsGroupCreate", + "DataCredentialsGroupUpdate", + "DataCredentialsGroupRemoveCredentials", +] diff --git a/nexla_sdk/models/data_credentials_groups/requests.py b/nexla_sdk/models/data_credentials_groups/requests.py new file mode 100644 index 0000000..7396aa9 --- /dev/null +++ b/nexla_sdk/models/data_credentials_groups/requests.py @@ -0,0 +1,21 @@ +from typing import List, Optional + +from nexla_sdk.models.base import BaseModel + + +class DataCredentialsGroupCreate(BaseModel): + name: str + description: Optional[str] = None + credentials_type: Optional[str] = None + data_credentials: Optional[List[int]] = None + + +class DataCredentialsGroupUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + credentials_type: Optional[str] = None + data_credentials: Optional[List[int]] = None + + +class DataCredentialsGroupRemoveCredentials(BaseModel): + data_credentials: List[int] diff --git a/nexla_sdk/models/data_credentials_groups/responses.py b/nexla_sdk/models/data_credentials_groups/responses.py new file mode 100644 index 0000000..64ae81a --- /dev/null +++ b/nexla_sdk/models/data_credentials_groups/responses.py @@ -0,0 +1,17 @@ +from datetime import datetime +from typing import Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner + + +class DataCredentialsGroup(BaseModel): + id: int + name: Optional[str] = None + description: Optional[str] = None + credentials_type: Optional[str] = None + data_credentials_count: Optional[int] = None + owner: Optional[Owner] = None + org: Optional[Organization] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/destinations/__init__.py b/nexla_sdk/models/destinations/__init__.py index ebba0f3..5ac80e9 100644 --- a/nexla_sdk/models/destinations/__init__.py +++ b/nexla_sdk/models/destinations/__init__.py @@ -1,18 +1,22 @@ +from typing import TYPE_CHECKING, Any + from nexla_sdk.models.destinations.enums import ( DestinationFormat, DestinationStatus, DestinationType, ) -from nexla_sdk.models.destinations.requests import ( - DestinationCopyOptions, - DestinationCreate, - DestinationUpdate, -) -from nexla_sdk.models.destinations.responses import ( - DataMapInfo, - DataSetInfo, - Destination, -) + +if TYPE_CHECKING: + from nexla_sdk.models.destinations.requests import ( + DestinationCopyOptions, + DestinationCreate, + DestinationUpdate, + ) + from nexla_sdk.models.destinations.responses import ( + DataMapInfo, + DataSetInfo, + Destination, + ) __all__ = [ # Enums @@ -28,3 +32,15 @@ "DestinationUpdate", "DestinationCopyOptions", ] + + +def __getattr__(name: str) -> Any: + if name in {"DestinationCreate", "DestinationUpdate", "DestinationCopyOptions"}: + from nexla_sdk.models.destinations import requests as _requests + + return getattr(_requests, name) + if name in {"Destination", "DataSetInfo", "DataMapInfo"}: + from nexla_sdk.models.destinations import responses as _responses + + return getattr(_responses, name) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/nexla_sdk/models/destinations/responses.py b/nexla_sdk/models/destinations/responses.py index 4c8742b..363501f 100644 --- a/nexla_sdk/models/destinations/responses.py +++ b/nexla_sdk/models/destinations/responses.py @@ -6,7 +6,10 @@ from nexla_sdk.models.base import BaseModel from nexla_sdk.models.common import Connector, Organization, Owner from nexla_sdk.models.credentials.responses import Credential -from nexla_sdk.models.destinations.enums import DestinationFormat +from nexla_sdk.models.flexible_enums import ( + FlexibleDestinationFormat, + FlexibleDestinationType, +) class DataSetInfo(BaseModel): @@ -41,8 +44,8 @@ class Destination(BaseModel): id: int name: str status: str - sink_type: str - connector_type: Optional[str] = None + sink_type: FlexibleDestinationType + connector_type: Optional[FlexibleDestinationType] = None owner: Optional[Owner] = None org: Optional[Organization] = None access_roles: Optional[List[str]] = None @@ -53,7 +56,7 @@ class Destination(BaseModel): data_set_id: Optional[int] = None data_map_id: Optional[int] = None data_source_id: Optional[int] = None - sink_format: Optional[DestinationFormat] = None + sink_format: Optional[FlexibleDestinationFormat] = None sink_config: Optional[Dict[str, Any]] = None sink_schedule: Optional[str] = None in_memory: bool = False diff --git a/nexla_sdk/models/flexible_enums.py b/nexla_sdk/models/flexible_enums.py new file mode 100644 index 0000000..093bc43 --- /dev/null +++ b/nexla_sdk/models/flexible_enums.py @@ -0,0 +1,80 @@ +"""Helper utilities for flexible enum handling in Pydantic models. + +These utilities allow enums to gracefully accept unknown values from API responses +without raising validation errors. Unknown values are preserved as strings. +""" + +from enum import Enum +from typing import Type, TypeVar, Union + +from pydantic import BeforeValidator +from typing_extensions import Annotated # typing.Annotated only landed in 3.9 + +# Import directly from .enums modules to avoid circular imports through __init__.py +from nexla_sdk.models.connectors.enums import ConnectionType, ConnectorType +from nexla_sdk.models.credentials.enums import CredentialType +from nexla_sdk.models.destinations.enums import DestinationFormat, DestinationType +from nexla_sdk.models.enums import ConnectorCategory +from nexla_sdk.models.sources.enums import SourceType + +E = TypeVar("E", bound=Enum) + + +def flexible_enum_validator(enum_cls: Type[E]): + """Create a validator that accepts enum values or unknown strings. + + Args: + enum_cls: The enum class to validate against + + Returns: + A validator function that returns the enum member for known values, + or the raw string for unknown values. + """ + + def validator(v): + if v is None: + return None + if isinstance(v, enum_cls): + return v + if isinstance(v, str): + try: + return enum_cls(v) + except ValueError: + # Unknown value - return as string + return v + return v + + return validator + + +def FlexibleEnum(enum_cls: Type[E]) -> Type[Union[E, str]]: + """Create a flexible enum type annotation for Pydantic models. + + This creates an Annotated type that accepts either a valid enum value + or any string. Known values are returned as enum members; unknown values + are returned as raw strings. + + Usage: + sink_type: Optional[FlexibleEnum(DestinationType)] = None + + Args: + enum_cls: The enum class to create a flexible version of + + Returns: + An Annotated type suitable for Pydantic model fields + """ + return Annotated[ + Union[enum_cls, str], BeforeValidator(flexible_enum_validator(enum_cls)) + ] + + +# Pre-defined flexible connector types for convenience +FlexibleDestinationType = FlexibleEnum(DestinationType) +FlexibleDestinationFormat = FlexibleEnum(DestinationFormat) +FlexibleSourceType = FlexibleEnum(SourceType) +FlexibleCredentialType = FlexibleEnum(CredentialType) +FlexibleConnectorCategory = FlexibleEnum(ConnectorCategory) + +# Flexible types for connectors resource +FlexibleConnectorType = FlexibleEnum(ConnectorType) +FlexibleConnectionType = FlexibleEnum(ConnectionType) diff --git a/nexla_sdk/models/flow_triggers/__init__.py b/nexla_sdk/models/flow_triggers/__init__.py new file mode 100644 index 0000000..72471fb --- /dev/null +++ b/nexla_sdk/models/flow_triggers/__init__.py @@ -0,0 +1,9 @@ +"""Flow triggers models.""" + +from nexla_sdk.models.flow_triggers.requests import FlowTriggerCreate +from nexla_sdk.models.flow_triggers.responses import FlowTrigger + +__all__ = [ + "FlowTrigger", + "FlowTriggerCreate", +] diff --git a/nexla_sdk/models/flow_triggers/requests.py b/nexla_sdk/models/flow_triggers/requests.py new file mode 100644 index 0000000..f864dad --- /dev/null +++ b/nexla_sdk/models/flow_triggers/requests.py @@ -0,0 +1,39 @@ +"""Flow trigger request models.""" + +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class FlowTriggerCreate(BaseModel): + """Request model for creating a flow trigger. + + Flow triggers define when one flow should trigger based on events + from another flow. The triggering and triggered resources must be + specified, along with the event types. + + Event Types: + - DATA_SINK_WRITE_DONE: Triggered when a data sink finishes writing + - DATA_SOURCE_READ_START: Triggered when a data source starts reading + - DATA_SOURCE_READ_DONE: Triggered when a data source finishes reading + """ + + # Event types + triggering_event_type: str # Required + triggered_event_type: str # Required + + # Triggering resource (one of these sets required) + triggering_flow_node_id: Optional[int] = None + triggering_resource_id: Optional[int] = None + triggering_resource_type: Optional[str] = None # data_source, data_sink + data_sink_id: Optional[int] = None # Shorthand for triggering data sink + + # Triggered resource (one of these sets required) + triggered_origin_node_id: Optional[int] = None + triggered_resource_id: Optional[int] = None + triggered_resource_type: Optional[str] = None # data_source, data_sink + data_source_id: Optional[int] = None # Shorthand for triggered data source + + # Optional owner/org + owner_id: Optional[int] = None + org_id: Optional[int] = None diff --git a/nexla_sdk/models/flow_triggers/responses.py b/nexla_sdk/models/flow_triggers/responses.py new file mode 100644 index 0000000..472ba22 --- /dev/null +++ b/nexla_sdk/models/flow_triggers/responses.py @@ -0,0 +1,36 @@ +"""Flow trigger response models.""" + +from datetime import datetime +from typing import Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner + + +class FlowTrigger(BaseModel): + """Flow trigger response model. + + Flow triggers define orchestration events that trigger one flow + based on events from another flow. For example, triggering a + data source read when a data sink write completes. + """ + + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + status: str # ACTIVE, PAUSED + triggering_event_type: ( + str # DATA_SINK_WRITE_DONE, DATA_SOURCE_READ_START, DATA_SOURCE_READ_DONE + ) + triggering_origin_node_id: Optional[int] = None + triggering_flow_node_id: Optional[int] = None + triggering_resource_type: Optional[str] = None # data_source, data_sink + triggering_resource_id: Optional[int] = None + triggered_event_type: ( + str # DATA_SINK_WRITE_DONE, DATA_SOURCE_READ_START, DATA_SOURCE_READ_DONE + ) + triggered_origin_node_id: Optional[int] = None + triggered_resource_type: Optional[str] = None # data_source, data_sink + triggered_resource_id: Optional[int] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/nexsets/responses.py b/nexla_sdk/models/nexsets/responses.py index 3affaf3..a59f0e9 100644 --- a/nexla_sdk/models/nexsets/responses.py +++ b/nexla_sdk/models/nexsets/responses.py @@ -5,7 +5,7 @@ from nexla_sdk.models.base import BaseModel from nexla_sdk.models.common import Organization, Owner -from nexla_sdk.models.destinations.enums import DestinationType +from nexla_sdk.models.flexible_enums import FlexibleDestinationType from nexla_sdk.models.sources.responses import DataSetBrief, Source @@ -17,7 +17,7 @@ class DataSinkSimplified(BaseModel): org_id: Optional[int] = None name: str status: Optional[str] = None - sink_type: Optional[DestinationType] = Field(default=None, alias="sinkType") + sink_type: Optional[FlexibleDestinationType] = Field(default=None, alias="sinkType") class Nexset(BaseModel): diff --git a/nexla_sdk/models/notification_channel_settings/__init__.py b/nexla_sdk/models/notification_channel_settings/__init__.py new file mode 100644 index 0000000..c90da72 --- /dev/null +++ b/nexla_sdk/models/notification_channel_settings/__init__.py @@ -0,0 +1,13 @@ +from nexla_sdk.models.notification_channel_settings.requests import ( + NotificationChannelSettingCreate, + NotificationChannelSettingUpdate, +) +from nexla_sdk.models.notification_channel_settings.responses import ( + NotificationChannelSetting, +) + +__all__ = [ + "NotificationChannelSetting", + "NotificationChannelSettingCreate", + "NotificationChannelSettingUpdate", +] diff --git a/nexla_sdk/models/notification_channel_settings/requests.py b/nexla_sdk/models/notification_channel_settings/requests.py new file mode 100644 index 0000000..26aff82 --- /dev/null +++ b/nexla_sdk/models/notification_channel_settings/requests.py @@ -0,0 +1,14 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class NotificationChannelSettingCreate(BaseModel): + channel: str + config: Optional[Dict[str, Any]] = None + org_id: Optional[int] = None + + +class NotificationChannelSettingUpdate(BaseModel): + channel: Optional[str] = None + config: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/notification_channel_settings/responses.py b/nexla_sdk/models/notification_channel_settings/responses.py new file mode 100644 index 0000000..c404956 --- /dev/null +++ b/nexla_sdk/models/notification_channel_settings/responses.py @@ -0,0 +1,14 @@ +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class NotificationChannelSetting(BaseModel): + id: int + channel: Optional[str] = None + config: Optional[Dict[str, Any]] = None + owner_id: Optional[int] = None + org_id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/notification_settings/__init__.py b/nexla_sdk/models/notification_settings/__init__.py new file mode 100644 index 0000000..0d39063 --- /dev/null +++ b/nexla_sdk/models/notification_settings/__init__.py @@ -0,0 +1,17 @@ +"""Notification Settings models.""" + +from nexla_sdk.models.notification_settings.requests import ( + NotificationSettingCreate, + NotificationSettingUpdate, +) +from nexla_sdk.models.notification_settings.responses import ( + NotificationSetting, + NotificationSettingBrief, +) + +__all__ = [ + "NotificationSetting", + "NotificationSettingBrief", + "NotificationSettingCreate", + "NotificationSettingUpdate", +] diff --git a/nexla_sdk/models/notification_settings/requests.py b/nexla_sdk/models/notification_settings/requests.py new file mode 100644 index 0000000..e742551 --- /dev/null +++ b/nexla_sdk/models/notification_settings/requests.py @@ -0,0 +1,35 @@ +"""Notification Setting request models.""" + +from typing import Any, Dict, Optional + +from pydantic import ConfigDict, Field + +from nexla_sdk.models.base import BaseModel + + +class NotificationSettingCreate(BaseModel): + """Notification Setting creation request model.""" + + model_config = ConfigDict(populate_by_name=True) + + notification_type_id: int + resource_id: Optional[int] = None + resource_type: Optional[str] = None + channel: str = Field(..., description="Notification channel (e.g., email, slack)") + priority: int = Field(default=0, ge=0, le=100, description="Priority level") + status: str = Field( + default="ENABLED", + description="Status (ENABLED, DISABLED)", + ) + payload: Optional[Dict[str, Any]] = None + + +class NotificationSettingUpdate(BaseModel): + """Notification Setting update request model.""" + + model_config = ConfigDict(populate_by_name=True) + + channel: Optional[str] = None + priority: Optional[int] = Field(default=None, ge=0, le=100) + status: Optional[str] = None + payload: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/notification_settings/responses.py b/nexla_sdk/models/notification_settings/responses.py new file mode 100644 index 0000000..fffc881 --- /dev/null +++ b/nexla_sdk/models/notification_settings/responses.py @@ -0,0 +1,35 @@ +"""Notification Setting response models.""" + +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class NotificationSetting(BaseModel): + """Notification Setting response model.""" + + id: int + notification_type_id: int + resource_id: Optional[int] = None + resource_type: Optional[str] = None + channel: str + priority: int = 0 + status: str = "ENABLED" + payload: Optional[Dict[str, Any]] = None + owner_id: Optional[int] = None + org_id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + +class NotificationSettingBrief(BaseModel): + """Brief Notification Setting response model for list views.""" + + id: int + notification_type_id: int + channel: str + priority: int = 0 + status: str = "ENABLED" + resource_type: Optional[str] = None + resource_id: Optional[int] = None diff --git a/nexla_sdk/models/notification_types/__init__.py b/nexla_sdk/models/notification_types/__init__.py new file mode 100644 index 0000000..89c5080 --- /dev/null +++ b/nexla_sdk/models/notification_types/__init__.py @@ -0,0 +1,3 @@ +from nexla_sdk.models.notification_types.responses import NotificationType + +__all__ = ["NotificationType"] diff --git a/nexla_sdk/models/notification_types/responses.py b/nexla_sdk/models/notification_types/responses.py new file mode 100644 index 0000000..fd55aff --- /dev/null +++ b/nexla_sdk/models/notification_types/responses.py @@ -0,0 +1,14 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class NotificationType(BaseModel): + id: int + name: Optional[str] = None + description: Optional[str] = None + category: Optional[str] = None + default: Optional[bool] = None + status: Optional[str] = None + event_type: Optional[str] = None + resource_type: Optional[str] = None diff --git a/nexla_sdk/models/notifications/__init__.py b/nexla_sdk/models/notifications/__init__.py index 9d24357..16465ef 100644 --- a/nexla_sdk/models/notifications/__init__.py +++ b/nexla_sdk/models/notifications/__init__.py @@ -9,6 +9,7 @@ NotificationChannelSetting, NotificationCount, NotificationSetting, + NotificationSettingBrief, NotificationType, ) @@ -18,6 +19,7 @@ "NotificationType", "NotificationChannelSetting", "NotificationSetting", + "NotificationSettingBrief", "NotificationCount", # Requests "NotificationChannelSettingCreate", diff --git a/nexla_sdk/models/notifications/responses.py b/nexla_sdk/models/notifications/responses.py index 6e01a05..36b668b 100644 --- a/nexla_sdk/models/notifications/responses.py +++ b/nexla_sdk/models/notifications/responses.py @@ -74,3 +74,15 @@ class NotificationCount(BaseModel): """Notification count response.""" count: int + + +class NotificationSettingBrief(BaseModel): + """Brief Notification Setting response model for list views.""" + + id: int + notification_type_id: int + channel: str + priority: int = 0 + status: str = "ENABLED" + resource_type: Optional[str] = None + resource_id: Optional[int] = None diff --git a/nexla_sdk/models/org_tiers/__init__.py b/nexla_sdk/models/org_tiers/__init__.py new file mode 100644 index 0000000..e50c096 --- /dev/null +++ b/nexla_sdk/models/org_tiers/__init__.py @@ -0,0 +1,3 @@ +from nexla_sdk.models.org_tiers.responses import OrgTier + +__all__ = ["OrgTier"] diff --git a/nexla_sdk/models/org_tiers/responses.py b/nexla_sdk/models/org_tiers/responses.py new file mode 100644 index 0000000..6052397 --- /dev/null +++ b/nexla_sdk/models/org_tiers/responses.py @@ -0,0 +1,13 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class OrgTier(BaseModel): + id: int + name: Optional[str] = None + display_name: Optional[str] = None + record_count_limit: Optional[int] = None + record_count_limit_time: Optional[str] = None + data_source_count_limit: Optional[int] = None + trial_period_days: Optional[int] = None diff --git a/nexla_sdk/models/quarantine_settings/__init__.py b/nexla_sdk/models/quarantine_settings/__init__.py new file mode 100644 index 0000000..6e7b15e --- /dev/null +++ b/nexla_sdk/models/quarantine_settings/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.quarantine_settings.requests import ( + QuarantineSettingCreate, + QuarantineSettingUpdate, +) +from nexla_sdk.models.quarantine_settings.responses import QuarantineSetting + +__all__ = [ + "QuarantineSetting", + "QuarantineSettingCreate", + "QuarantineSettingUpdate", +] diff --git a/nexla_sdk/models/quarantine_settings/requests.py b/nexla_sdk/models/quarantine_settings/requests.py new file mode 100644 index 0000000..e5f5cc9 --- /dev/null +++ b/nexla_sdk/models/quarantine_settings/requests.py @@ -0,0 +1,17 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class QuarantineSettingCreate(BaseModel): + data_credentials_id: int + config: Dict[str, Any] + owner_id: Optional[int] = None + org_id: Optional[int] = None + + +class QuarantineSettingUpdate(BaseModel): + data_credentials_id: Optional[int] = None + config: Optional[Dict[str, Any]] = None + owner_id: Optional[int] = None + org_id: Optional[int] = None diff --git a/nexla_sdk/models/quarantine_settings/responses.py b/nexla_sdk/models/quarantine_settings/responses.py new file mode 100644 index 0000000..42a0786 --- /dev/null +++ b/nexla_sdk/models/quarantine_settings/responses.py @@ -0,0 +1,20 @@ +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner +from nexla_sdk.models.credentials.responses import Credential + + +class QuarantineSetting(BaseModel): + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + resource_type: Optional[str] = None + resource_id: Optional[int] = None + config: Optional[Dict[str, Any]] = None + data_credentials_id: Optional[int] = None + credentials_type: Optional[str] = None + data_credentials: Optional[Credential] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/resource_parameters/__init__.py b/nexla_sdk/models/resource_parameters/__init__.py new file mode 100644 index 0000000..2934617 --- /dev/null +++ b/nexla_sdk/models/resource_parameters/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.resource_parameters.requests import ( + ResourceParameterCreate, + ResourceParameterUpdate, +) +from nexla_sdk.models.resource_parameters.responses import ResourceParameter + +__all__ = [ + "ResourceParameter", + "ResourceParameterCreate", + "ResourceParameterUpdate", +] diff --git a/nexla_sdk/models/resource_parameters/requests.py b/nexla_sdk/models/resource_parameters/requests.py new file mode 100644 index 0000000..459eacc --- /dev/null +++ b/nexla_sdk/models/resource_parameters/requests.py @@ -0,0 +1,29 @@ +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel + + +class ResourceParameterCreate(BaseModel): + name: str + display_name: Optional[str] = None + description: Optional[str] = None + resource_type: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + global_param: Optional[bool] = None + vendor_endpoint_id: Optional[int] = None + allowed_values: Optional[List[Any]] = None + + +class ResourceParameterUpdate(BaseModel): + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + resource_type: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + global_param: Optional[bool] = None + vendor_endpoint_id: Optional[int] = None + allowed_values: Optional[List[Any]] = None diff --git a/nexla_sdk/models/resource_parameters/responses.py b/nexla_sdk/models/resource_parameters/responses.py new file mode 100644 index 0000000..1c6c60b --- /dev/null +++ b/nexla_sdk/models/resource_parameters/responses.py @@ -0,0 +1,23 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.vendor_endpoints.responses import VendorEndpoint + + +class ResourceParameter(BaseModel): + id: int + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + resource_type: Optional[str] = None + data_type: Optional[str] = None + order: Optional[int] = None + config: Optional[Dict[str, Any]] = None + global_param: Optional[bool] = Field(default=None, alias="global") + vendor_endpoint: Optional[VendorEndpoint] = None + allowed_values: Optional[List[Any]] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/service_keys/__init__.py b/nexla_sdk/models/service_keys/__init__.py new file mode 100644 index 0000000..95fb582 --- /dev/null +++ b/nexla_sdk/models/service_keys/__init__.py @@ -0,0 +1,10 @@ +"""Service keys models.""" + +from nexla_sdk.models.service_keys.requests import ServiceKeyCreate, ServiceKeyUpdate +from nexla_sdk.models.service_keys.responses import ServiceKey + +__all__ = [ + "ServiceKey", + "ServiceKeyCreate", + "ServiceKeyUpdate", +] diff --git a/nexla_sdk/models/service_keys/requests.py b/nexla_sdk/models/service_keys/requests.py new file mode 100644 index 0000000..d57757d --- /dev/null +++ b/nexla_sdk/models/service_keys/requests.py @@ -0,0 +1,20 @@ +"""Service key request models.""" + +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class ServiceKeyCreate(BaseModel): + """Request model for creating a service key.""" + + name: str + description: str + data_source_id: Optional[int] = None + + +class ServiceKeyUpdate(BaseModel): + """Request model for updating a service key.""" + + name: Optional[str] = None + description: Optional[str] = None diff --git a/nexla_sdk/models/service_keys/responses.py b/nexla_sdk/models/service_keys/responses.py new file mode 100644 index 0000000..36f6688 --- /dev/null +++ b/nexla_sdk/models/service_keys/responses.py @@ -0,0 +1,29 @@ +"""Service key response models.""" + +from datetime import datetime +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class ServiceKey(BaseModel): + """Service key response model. + + Service keys are long-lived credentials used for programmatic API access. + They can be rotated and have lifecycle management (activate/pause). + """ + + id: int + owner_id: Optional[int] = None + org_id: Optional[int] = None + name: Optional[str] = None + description: Optional[str] = None + status: str # INIT, ACTIVE, PAUSED + api_key: str + last_rotated_key: Optional[str] = None + last_rotated_at: Optional[datetime] = None + data_source_id: Optional[int] = None + cluster_id: Optional[int] = None # Super user only + cluster_uid: Optional[str] = None # Super user only + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/sources/__init__.py b/nexla_sdk/models/sources/__init__.py index 6df9d18..2312cde 100644 --- a/nexla_sdk/models/sources/__init__.py +++ b/nexla_sdk/models/sources/__init__.py @@ -1,15 +1,19 @@ +from typing import TYPE_CHECKING, Any + from nexla_sdk.models.sources.enums import ( FlowType, IngestMethod, SourceStatus, SourceType, ) -from nexla_sdk.models.sources.requests import ( - SourceCopyOptions, - SourceCreate, - SourceUpdate, -) -from nexla_sdk.models.sources.responses import DataSetBrief, RunInfo, Source + +if TYPE_CHECKING: + from nexla_sdk.models.sources.requests import ( + SourceCopyOptions, + SourceCreate, + SourceUpdate, + ) + from nexla_sdk.models.sources.responses import DataSetBrief, RunInfo, Source __all__ = [ # Enums @@ -26,3 +30,15 @@ "SourceUpdate", "SourceCopyOptions", ] + + +def __getattr__(name: str) -> Any: + if name in {"SourceCreate", "SourceUpdate", "SourceCopyOptions"}: + from nexla_sdk.models.sources import requests as _requests + + return getattr(_requests, name) + if name in {"Source", "DataSetBrief", "RunInfo"}: + from nexla_sdk.models.sources import responses as _responses + + return getattr(_responses, name) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/nexla_sdk/models/sources/enums.py b/nexla_sdk/models/sources/enums.py index 49b6284..b87accd 100644 --- a/nexla_sdk/models/sources/enums.py +++ b/nexla_sdk/models/sources/enums.py @@ -20,31 +20,66 @@ class SourceType(str, Enum): S3 = "s3" GCS = "gcs" AZURE_BLB = "azure_blb" + AZURE_DATA_LAKE = "azure_data_lake" FTP = "ftp" DROPBOX = "dropbox" BOX = "box" GDRIVE = "gdrive" SHAREPOINT = "sharepoint" + MIN_IO_S3 = "min_io_s3" + WEBDAV = "webdav" - # Databases + # Databases - Traditional RDBMS MYSQL = "mysql" POSTGRES = "postgres" + SUPABASE = "supabase" SQLSERVER = "sqlserver" ORACLE = "oracle" + ORACLE_AUTONOMOUS = "oracle_autonomous" + AS400 = "as400" + DB2 = "db2" + SYBASE = "sybase" + HANA_JDBC = "hana_jdbc" + NETSUITE_JDBC = "netsuite_jdbc" + + # Databases - Cloud Data Warehouses REDSHIFT = "redshift" SNOWFLAKE = "snowflake" + SNOWFLAKE_DCR = "snowflake_dcr" BIGQUERY = "bigquery" DATABRICKS = "databricks" + AWS_ATHENA = "aws_athena" + AZURE_SYNAPSE = "azure_synapse" + FIREBOLT = "firebolt" + TERADATA = "teradata" + HIVE = "hive" + + # Databases - Google Cloud SQL + CLOUDSQL_MYSQL = "cloudsql_mysql" + CLOUDSQL_POSTGRES = "cloudsql_postgres" + CLOUDSQL_SQLSERVER = "cloudsql_sqlserver" + + # Databases - Google Cloud + GCP_ALLOYDB = "gcp_alloydb" + GCP_SPANNER = "gcp_spanner" + + # Delta Lake / Iceberg + DELTA_LAKE_AZURE_BLB = "delta_lake_azure_blb" + DELTA_LAKE_AZURE_DATA_LAKE = "delta_lake_azure_data_lake" + DELTA_LAKE_S3 = "delta_lake_s3" + S3_ICEBERG = "s3_iceberg" # NoSQL MONGO = "mongo" DYNAMODB = "dynamodb" FIREBASE = "firebase" - # Streaming + # Streaming / Messaging KAFKA = "kafka" CONFLUENT_KAFKA = "confluent_kafka" GOOGLE_PUBSUB = "google_pubsub" + JMS = "jms" + TIBCO = "tibco" # APIs REST = "rest" @@ -56,7 +91,8 @@ class SourceType(str, Enum): EMAIL = "email" NEXLA_MONITOR = "nexla_monitor" - # Add all other types from the spec... + # Vector Databases + PINECONE = "pinecone" class IngestMethod(str, Enum): diff --git a/nexla_sdk/models/sources/responses.py b/nexla_sdk/models/sources/responses.py index f3c415b..82d986d 100644 --- a/nexla_sdk/models/sources/responses.py +++ b/nexla_sdk/models/sources/responses.py @@ -6,6 +6,7 @@ from nexla_sdk.models.base import BaseModel from nexla_sdk.models.common import Connector, Organization, Owner from nexla_sdk.models.credentials.responses import Credential +from nexla_sdk.models.flexible_enums import FlexibleSourceType class DataSetBrief(BaseModel): @@ -34,8 +35,8 @@ class Source(BaseModel): id: int name: str status: str - source_type: str - connector_type: Optional[str] = None + source_type: FlexibleSourceType + connector_type: Optional[FlexibleSourceType] = None owner: Optional[Owner] = None org: Optional[Organization] = None access_roles: Optional[List[str]] = None diff --git a/nexla_sdk/models/user_settings/__init__.py b/nexla_sdk/models/user_settings/__init__.py new file mode 100644 index 0000000..a171294 --- /dev/null +++ b/nexla_sdk/models/user_settings/__init__.py @@ -0,0 +1,8 @@ +from nexla_sdk.models.user_settings.requests import UserSettingCreate, UserSettingUpdate +from nexla_sdk.models.user_settings.responses import UserSetting + +__all__ = [ + "UserSetting", + "UserSettingCreate", + "UserSettingUpdate", +] diff --git a/nexla_sdk/models/user_settings/requests.py b/nexla_sdk/models/user_settings/requests.py new file mode 100644 index 0000000..65a3f63 --- /dev/null +++ b/nexla_sdk/models/user_settings/requests.py @@ -0,0 +1,16 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class UserSettingCreate(BaseModel): + user_settings_type: str + primary_key_value: str + description: Optional[str] = None + settings: Optional[Dict[str, Any]] = None + copied_from_id: Optional[int] = None + + +class UserSettingUpdate(BaseModel): + description: Optional[str] = None + settings: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/user_settings/responses.py b/nexla_sdk/models/user_settings/responses.py new file mode 100644 index 0000000..ade39f3 --- /dev/null +++ b/nexla_sdk/models/user_settings/responses.py @@ -0,0 +1,18 @@ +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner + + +class UserSetting(BaseModel): + id: int + owner: Optional[Owner] = None + org: Optional[Organization] = None + user_settings_type: Optional[str] = None + primary_key_value: Optional[str] = None + description: Optional[str] = None + settings: Optional[Dict[str, Any]] = None + copied_from_id: Optional[int] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/user_tiers/__init__.py b/nexla_sdk/models/user_tiers/__init__.py new file mode 100644 index 0000000..4a769a9 --- /dev/null +++ b/nexla_sdk/models/user_tiers/__init__.py @@ -0,0 +1,3 @@ +from nexla_sdk.models.user_tiers.responses import UserTier + +__all__ = ["UserTier"] diff --git a/nexla_sdk/models/user_tiers/responses.py b/nexla_sdk/models/user_tiers/responses.py new file mode 100644 index 0000000..c91e218 --- /dev/null +++ b/nexla_sdk/models/user_tiers/responses.py @@ -0,0 +1,13 @@ +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class UserTier(BaseModel): + id: int + name: Optional[str] = None + display_name: Optional[str] = None + record_count_limit: Optional[int] = None + record_count_limit_time: Optional[str] = None + data_source_count_limit: Optional[int] = None + trial_period_days: Optional[int] = None diff --git a/nexla_sdk/models/users/__init__.py b/nexla_sdk/models/users/__init__.py index d92b1bf..25f2ad7 100644 --- a/nexla_sdk/models/users/__init__.py +++ b/nexla_sdk/models/users/__init__.py @@ -1,3 +1,4 @@ +from nexla_sdk.models.users.credits import UserCredit, UserCreditCreate from nexla_sdk.models.users.requests import UserCreate, UserUpdate from nexla_sdk.models.users.responses import ( AccountSummary, @@ -16,6 +17,8 @@ "DefaultOrg", "OrgMembership", "AccountSummary", + "UserCredit", + "UserCreditCreate", # Requests "UserCreate", "UserUpdate", diff --git a/nexla_sdk/models/users/credits.py b/nexla_sdk/models/users/credits.py new file mode 100644 index 0000000..37237c4 --- /dev/null +++ b/nexla_sdk/models/users/credits.py @@ -0,0 +1,28 @@ +from datetime import datetime +from typing import Optional + +from nexla_sdk.models.base import BaseModel + + +class UserCredit(BaseModel): + id: int + owner_id: Optional[int] = None + org_id: Optional[int] = None + grant_type: Optional[str] = None + credits_available: Optional[int] = None + credits: Optional[int] = None + credits_used: Optional[int] = None + credits_monthly: Optional[int] = None + credits_used_in_month: Optional[int] = None + granted_at: Optional[datetime] = None + refreshed_at: Optional[datetime] = None + expires_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None + + +class UserCreditCreate(BaseModel): + grant_type: Optional[str] = None + credits: Optional[int] = None + credits_monthly: Optional[int] = None + expires_at: Optional[str] = None diff --git a/nexla_sdk/models/validators/__init__.py b/nexla_sdk/models/validators/__init__.py new file mode 100644 index 0000000..dbaa309 --- /dev/null +++ b/nexla_sdk/models/validators/__init__.py @@ -0,0 +1,15 @@ +"""Validators models.""" + +from nexla_sdk.models.validators.requests import ( + ValidatorCopyOptions, + ValidatorCreate, + ValidatorUpdate, +) +from nexla_sdk.models.validators.responses import Validator + +__all__ = [ + "Validator", + "ValidatorCreate", + "ValidatorUpdate", + "ValidatorCopyOptions", +] diff --git a/nexla_sdk/models/validators/requests.py b/nexla_sdk/models/validators/requests.py new file mode 100644 index 0000000..88daf12 --- /dev/null +++ b/nexla_sdk/models/validators/requests.py @@ -0,0 +1,58 @@ +"""Validator request models.""" + +from typing import Any, Dict, List, Optional + +from nexla_sdk.models.base import BaseModel + + +class ValidatorCreate(BaseModel): + """Request model for creating a validator.""" + + name: Optional[str] = None + description: Optional[str] = None + code_type: str # Required: jolt_standard, jolt_custom, python, javascript, etc. + code: Optional[Any] = None + code_config: Optional[Dict[str, Any]] = None + code_encoding: Optional[str] = None # none, base64 + custom_config: Optional[Dict[str, Any]] = None + resource_type: str = "validator" + output_type: Optional[str] = None # record, attribute, custom + reusable: Optional[bool] = None + public: Optional[bool] = None + owner_id: Optional[int] = None + org_id: Optional[int] = None + data_credentials_id: Optional[int] = None + runtime_data_credentials_id: Optional[int] = None + tags: Optional[List[str]] = None + repo_type: Optional[str] = None + repo_config: Optional[Dict[str, Any]] = None + ai_function_type: Optional[str] = None + + +class ValidatorUpdate(BaseModel): + """Request model for updating a validator.""" + + name: Optional[str] = None + description: Optional[str] = None + code_type: Optional[str] = None + code: Optional[Any] = None + code_config: Optional[Dict[str, Any]] = None + code_encoding: Optional[str] = None + custom_config: Optional[Dict[str, Any]] = None + output_type: Optional[str] = None + reusable: Optional[bool] = None + public: Optional[bool] = None + data_credentials_id: Optional[int] = None + runtime_data_credentials_id: Optional[int] = None + tags: Optional[List[str]] = None + repo_type: Optional[str] = None + repo_config: Optional[Dict[str, Any]] = None + + +class ValidatorCopyOptions(BaseModel): + """Options for copying a validator.""" + + owner_id: Optional[int] = None + org_id: Optional[int] = None + copy_access_controls: Optional[bool] = None + reuse_data_credentials: Optional[bool] = None diff --git a/nexla_sdk/models/validators/responses.py b/nexla_sdk/models/validators/responses.py new file mode 100644 index 0000000..9633319 --- /dev/null +++ b/nexla_sdk/models/validators/responses.py @@ -0,0 +1,51 @@ +"""Validator response models.""" + +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.common import Organization, Owner + + +class ValidatorCredential(BaseModel): + """Credential reference in validator response.""" + + id: int + name: Optional[str] = None + description: Optional[str] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None + + +class Validator(BaseModel): + """Validator response model.""" + + id: int + name: Optional[str] = None + description: Optional[str] = None + resource_type: str = "validator" + code_type: Optional[str] = None + output_type: Optional[str] = None + code: Optional[Any] = None + code_config: Optional[Dict[str, Any]] = None + code_encoding: Optional[str] = None + code_error: Optional[str] = None + custom_config: Optional[Dict[str, Any]] = None + repo_config: Optional[Dict[str, Any]] = None + reusable: bool = True + public: bool = False + managed: bool = False + ai_function_type: Optional[str] = None + owner: Optional[Owner] = None + org: Optional[Organization] = None + access_roles: Optional[List[str]] = Field(default_factory=list) + data_credentials: Optional[ValidatorCredential] = None + runtime_data_credentials: Optional[ValidatorCredential] = None + data_sets: Optional[List[int]] = Field(default_factory=list) + tags: Optional[List[str]] = Field(default_factory=list) + referenced_resource_ids: Optional[Dict[str, List[int]]] = None + copied_from_id: Optional[int] = None + updated_at: Optional[datetime] = None + created_at: Optional[datetime] = None diff --git a/nexla_sdk/models/vendor_endpoints/__init__.py b/nexla_sdk/models/vendor_endpoints/__init__.py new file mode 100644 index 0000000..bba6287 --- /dev/null +++ b/nexla_sdk/models/vendor_endpoints/__init__.py @@ -0,0 +1,11 @@ +from nexla_sdk.models.vendor_endpoints.requests import ( + VendorEndpointCreate, + VendorEndpointUpdate, +) +from nexla_sdk.models.vendor_endpoints.responses import VendorEndpoint + +__all__ = [ + "VendorEndpoint", + "VendorEndpointCreate", + "VendorEndpointUpdate", +] diff --git a/nexla_sdk/models/vendor_endpoints/requests.py b/nexla_sdk/models/vendor_endpoints/requests.py new file mode 100644 index 0000000..6f88bae --- /dev/null +++ b/nexla_sdk/models/vendor_endpoints/requests.py @@ -0,0 +1,16 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class VendorEndpointCreate(BaseModel): + name: str + vendor_id: int + resource_type: Optional[str] = None + config: Optional[Dict[str, Any]] = None + + +class VendorEndpointUpdate(BaseModel): + name: Optional[str] = None + resource_type: Optional[str] = None + config: Optional[Dict[str, Any]] = None diff --git a/nexla_sdk/models/vendor_endpoints/responses.py b/nexla_sdk/models/vendor_endpoints/responses.py new file mode 100644 index 0000000..8e1698f --- /dev/null +++ b/nexla_sdk/models/vendor_endpoints/responses.py @@ -0,0 +1,16 @@ +from datetime import datetime +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel +from nexla_sdk.models.vendors.responses import VendorRef + + +class VendorEndpoint(BaseModel): + id: int + name: Optional[str] = None + resource_type: Optional[str] = None + config: Optional[Dict[str, Any]] = None + vendor: Optional[VendorRef] = None + vendor_id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/models/vendors/__init__.py b/nexla_sdk/models/vendors/__init__.py new file mode 100644 index 0000000..4176122 --- /dev/null +++ b/nexla_sdk/models/vendors/__init__.py @@ -0,0 +1,11 @@ +"""Vendor models.""" + +from nexla_sdk.models.vendors.requests import VendorCreate, VendorUpdate +from nexla_sdk.models.vendors.responses import Vendor, VendorRef + +__all__ = [ + "Vendor", + "VendorCreate", + "VendorUpdate", + "VendorRef", +] diff --git a/nexla_sdk/models/vendors/requests.py b/nexla_sdk/models/vendors/requests.py new file mode 100644 index 0000000..96f8504 --- /dev/null +++ b/nexla_sdk/models/vendors/requests.py @@ -0,0 +1,28 @@ +"""Vendor request models.""" + +from typing import Any, Dict, Optional + +from nexla_sdk.models.base import BaseModel + + +class VendorCreate(BaseModel): + """Request model for creating a vendor (super user only).""" + + name: str + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None + small_logo: Optional[str] = None + logo: Optional[str] = None + connector_id: Optional[int] = None + + +class VendorUpdate(BaseModel): + """Request model for updating a vendor (super user only).""" + + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None + small_logo: Optional[str] = None + logo: Optional[str] = None diff --git a/nexla_sdk/models/vendors/responses.py b/nexla_sdk/models/vendors/responses.py new file mode 100644 index 0000000..953b1ef --- /dev/null +++ b/nexla_sdk/models/vendors/responses.py @@ -0,0 +1,39 @@ +"""Vendor response models.""" + +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import Field + +from nexla_sdk.models.base import BaseModel + + +class VendorRef(BaseModel): + """Minimal vendor reference.""" + + id: int + name: Optional[str] = None + display_name: Optional[str] = None + + +class Vendor(BaseModel): + """Vendor response model. + + Vendors represent third-party service providers that can be + connected via auth templates and endpoints. + """ + + id: int + name: Optional[str] = None + display_name: Optional[str] = None + description: Optional[str] = None + config: Optional[Dict[str, Any]] = None + small_logo: Optional[str] = None + logo: Optional[str] = None + connection_type: Optional[str] = None # From associated connector + auth_templates: Optional[List[Any]] = Field(default_factory=list) # IDs or objects + vendor_endpoints: Optional[List[Any]] = Field( + default_factory=list + ) # IDs or objects + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None diff --git a/nexla_sdk/py.typed b/nexla_sdk/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/nexla_sdk/raw_operations.py b/nexla_sdk/raw_operations.py new file mode 100644 index 0000000..fdacce2 --- /dev/null +++ b/nexla_sdk/raw_operations.py @@ -0,0 +1,248 @@ +"""Typed operation-level access for the full OpenAPI surface.""" + +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Dict, List, Mapping, Optional, Union + +from nexla_sdk.exceptions import ValidationError +from nexla_sdk.generated.operation_map import OPERATION_MAP, OperationId + +if TYPE_CHECKING: + from nexla_sdk.client import NexlaClient + + +_PATH_PARAM_RE = re.compile(r"\{([^}]+)\}") + + +@dataclass(frozen=True) +class OperationDefinition: + """Normalized operation metadata.""" + + operation_id: str + method: str + path: str + tags: List[str] + summary: str + path_params: List[str] + + +class RawOperationsClient: + """Low-level typed access to any OpenAPI operation.""" + + def __init__(self, client: "NexlaClient"): + self._client = client + + def list_operations(self) -> List[str]: + """Return sorted operation ids available in this SDK build.""" + return sorted(OPERATION_MAP.keys()) + + def get_operation( + self, operation_id: Union[OperationId, str] + ) -> OperationDefinition: + """Get metadata for a specific operation id.""" + spec = OPERATION_MAP.get(str(operation_id)) + if spec is None: + raise ValidationError( + f"Unknown operation_id: {operation_id}", + operation="raw_get_operation", + resource_type="operation", + resource_id=str(operation_id), + ) + + return OperationDefinition( + operation_id=str(operation_id), + method=spec["method"], + path=spec["path"], + tags=list(spec["tags"]), + summary=spec["summary"], + path_params=list(spec["path_params"]), + ) + + def call( + self, + operation_id: Union[OperationId, str], + *, + path_params: Optional[Mapping[str, Any]] = None, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + """Call an operation by operation id.""" + operation = self.get_operation(operation_id) + path = self._render_path( + operation.path, operation.path_params, path_params or {} + ) + + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + + return self._client.request(operation.method, path, **kwargs) + + def request( + self, + method: str, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + """Send an arbitrary request to support non-spec or backend-only endpoints.""" + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request(method.upper(), path, **kwargs) + + def get( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("GET", path, **kwargs) + + def post( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("POST", path, **kwargs) + + def put( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("PUT", path, **kwargs) + + def delete( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("DELETE", path, **kwargs) + + def patch( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + body: Any = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if body is not None: + kwargs["json"] = body + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("PATCH", path, **kwargs) + + def head( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("HEAD", path, **kwargs) + + def options( + self, + path: str, + *, + query: Optional[Mapping[str, Any]] = None, + headers: Optional[Mapping[str, str]] = None, + ) -> Any: + kwargs: Dict[str, Any] = {} + if query is not None: + kwargs["params"] = dict(query) + if headers is not None: + kwargs["headers"] = dict(headers) + return self._client.request("OPTIONS", path, **kwargs) + + def _render_path( + self, + path_template: str, + required_params: List[str], + provided_params: Mapping[str, Any], + ) -> str: + missing = [param for param in required_params if param not in provided_params] + if missing: + missing_str = ", ".join(missing) + raise ValidationError( + f"Missing required path params: {missing_str}", + operation="raw_call", + resource_type="operation_path_params", + context={"path": path_template, "required": required_params}, + ) + + def _replace(match: re.Match[str]) -> str: + key = match.group(1) + value = provided_params.get(key) + if value is None: + raise ValidationError( + f"Path param '{key}' cannot be None", + operation="raw_call", + resource_type="operation_path_params", + context={"path": path_template, "param": key}, + ) + return str(value) + + rendered = _PATH_PARAM_RE.sub(_replace, path_template) + if not rendered.startswith("/"): + rendered = f"/{rendered}" + return rendered diff --git a/nexla_sdk/resources/__init__.py b/nexla_sdk/resources/__init__.py index effd879..d3c75c8 100644 --- a/nexla_sdk/resources/__init__.py +++ b/nexla_sdk/resources/__init__.py @@ -1,32 +1,66 @@ +from nexla_sdk.resources.api_keys import ApiKeysResource from nexla_sdk.resources.approval_requests import ApprovalRequestsResource from nexla_sdk.resources.async_tasks import AsyncTasksResource from nexla_sdk.resources.attribute_transforms import AttributeTransformsResource +from nexla_sdk.resources.auth_parameters import AuthParametersResource +from nexla_sdk.resources.auth_templates import AuthTemplatesResource from nexla_sdk.resources.base_resource import BaseResource +from nexla_sdk.resources.catalog_configs import CatalogConfigsResource +from nexla_sdk.resources.cluster_endpoints import ClusterEndpointsResource +from nexla_sdk.resources.clusters import ClustersResource from nexla_sdk.resources.code_containers import CodeContainersResource +from nexla_sdk.resources.connectors import ConnectorsResource from nexla_sdk.resources.credentials import CredentialsResource +from nexla_sdk.resources.cubejs import CubeJsResource +from nexla_sdk.resources.custom_data_flows import CustomDataFlowsResource +from nexla_sdk.resources.dashboard_transforms import DashboardTransformsResource +from nexla_sdk.resources.data_credentials_groups import DataCredentialsGroupsResource +from nexla_sdk.resources.data_flows import DataFlowsResource from nexla_sdk.resources.data_schemas import DataSchemasResource from nexla_sdk.resources.destinations import DestinationsResource from nexla_sdk.resources.doc_containers import DocContainersResource +from nexla_sdk.resources.flow_nodes import FlowNodesResource +from nexla_sdk.resources.flow_triggers import FlowTriggersResource from nexla_sdk.resources.flows import FlowsResource from nexla_sdk.resources.genai import GenAIResource from nexla_sdk.resources.lookups import LookupsResource from nexla_sdk.resources.marketplace import MarketplaceResource from nexla_sdk.resources.metrics import MetricsResource from nexla_sdk.resources.nexsets import NexsetsResource +from nexla_sdk.resources.notification_channel_settings import ( + NotificationChannelSettingsResource, +) +from nexla_sdk.resources.notification_settings import NotificationSettingsResource +from nexla_sdk.resources.notification_types import NotificationTypesResource from nexla_sdk.resources.notifications import NotificationsResource from nexla_sdk.resources.org_auth_configs import OrgAuthConfigsResource +from nexla_sdk.resources.org_tiers import OrgTiersResource from nexla_sdk.resources.organizations import OrganizationsResource from nexla_sdk.resources.projects import ProjectsResource +from nexla_sdk.resources.quarantine_settings import QuarantineSettingsResource +from nexla_sdk.resources.resource_parameters import ResourceParametersResource from nexla_sdk.resources.runtimes import RuntimesResource +from nexla_sdk.resources.search_health import SearchHealthResource from nexla_sdk.resources.self_signup import SelfSignupResource +from nexla_sdk.resources.self_signup_blocked_domains import ( + SelfSignupBlockedDomainsResource, +) +from nexla_sdk.resources.service_keys import ServiceKeysResource from nexla_sdk.resources.sources import SourcesResource from nexla_sdk.resources.teams import TeamsResource +from nexla_sdk.resources.tokens import TokensResource from nexla_sdk.resources.transforms import TransformsResource +from nexla_sdk.resources.user_settings import UserSettingsResource +from nexla_sdk.resources.user_tiers import UserTiersResource from nexla_sdk.resources.users import UsersResource +from nexla_sdk.resources.validators import ValidatorsResource +from nexla_sdk.resources.vendor_endpoints import VendorEndpointsResource +from nexla_sdk.resources.vendors import VendorsResource __all__ = [ "BaseResource", "CredentialsResource", + "CustomDataFlowsResource", "FlowsResource", "SourcesResource", "DestinationsResource", @@ -37,6 +71,7 @@ "TeamsResource", "ProjectsResource", "NotificationsResource", + "NotificationSettingsResource", "MetricsResource", "CodeContainersResource", "TransformsResource", @@ -46,8 +81,38 @@ "RuntimesResource", "MarketplaceResource", "OrgAuthConfigsResource", + "OrgTiersResource", + "AuthParametersResource", + "ResourceParametersResource", + "CatalogConfigsResource", + "VendorEndpointsResource", "GenAIResource", "SelfSignupResource", + "SelfSignupBlockedDomainsResource", "DocContainersResource", "DataSchemasResource", + "DataCredentialsGroupsResource", + "DataFlowsResource", + "FlowNodesResource", + "DashboardTransformsResource", + "NotificationChannelSettingsResource", + "NotificationTypesResource", + "QuarantineSettingsResource", + "UserSettingsResource", + "UserTiersResource", + "TokensResource", + "SearchHealthResource", + "CubeJsResource", + # Phase 1 resources + "ValidatorsResource", + "ServiceKeysResource", + "FlowTriggersResource", + # Phase 3 resources + "ClustersResource", + "ClusterEndpointsResource", + # Phase 4 resources + "ApiKeysResource", + "ConnectorsResource", + "VendorsResource", + "AuthTemplatesResource", ] diff --git a/nexla_sdk/resources/api_keys.py b/nexla_sdk/resources/api_keys.py new file mode 100644 index 0000000..406ed83 --- /dev/null +++ b/nexla_sdk/resources/api_keys.py @@ -0,0 +1,153 @@ +"""Resource for managing API keys (read-only).""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.api_keys.responses import ApiKey, ApiKeysIndex +from nexla_sdk.resources.base_resource import BaseResource + + +class ApiKeysResource(BaseResource): + """Resource for API keys (read-only access). + + API keys provide programmatic access to specific resources like + datasets, data sources, data sinks, and users. + + Note: + This resource only supports ``list()``, ``list_grouped()``, + ``get()``, and ``search()``. Write operations inherited from + ``BaseResource`` (e.g. ``create``, ``update``, ``delete``) are + not supported by the backend and will raise ``NotImplementedError``. + + Examples: + # List all API keys (grouped by type) + all_keys = client.api_keys.list_grouped() + + # Get a specific API key + key = client.api_keys.get(123) + + # Search API keys + keys = client.api_keys.search({"scope": "read"}) + """ + + _NOT_SUPPORTED_MSG = ( + "API keys are read-only. Create, update, and delete operations " + "are not supported. Manage API keys through their parent resources." + ) + + def __init__(self, client): + """Initialize the API keys resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/api_keys" + self._model_class = ApiKey + + def list( + self, + access_role: Optional[str] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, + **kwargs, + ) -> List[ApiKey]: + """List API keys. + + Args: + access_role: Filter by access role + page: Page number (1-based) + per_page: Items per page + + Returns: + List of API keys + """ + params = kwargs.copy() + if access_role is not None: + params["access_role"] = access_role + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def list_grouped( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + ) -> ApiKeysIndex: + """List API keys grouped by resource type. + + Returns API keys organized by their resource type: + data_sets, data_sinks, data_sources, and users. + + Args: + page: Page number (1-based) + per_page: Items per page + + Returns: + ApiKeysIndex with grouped API keys + """ + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", self._path, params=params) + return ApiKeysIndex.model_validate(response) + + def get(self, api_key_id: Union[int, str]) -> ApiKey: + """Get API key by ID or key value. + + Args: + api_key_id: API key ID (int) or api_key value (string) + + Returns: + ApiKey instance + """ + path = f"{self._path}/{api_key_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + + def search( + self, + filters: Dict[str, Any], + page: Optional[int] = None, + per_page: Optional[int] = None, + ) -> List[ApiKey]: + """Search API keys with filters. + + Args: + filters: Search filters + page: Page number (1-based) + per_page: Items per page + + Returns: + List of matching API keys + """ + path = f"{self._path}/search" + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("POST", path, json=filters, params=params) + return [ApiKey.model_validate(k) for k in response] + + def create(self, data=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def update(self, resource_id=None, data=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def delete(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def copy(self, resource_id=None, options=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def activate(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def pause(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) diff --git a/nexla_sdk/resources/approval_requests.py b/nexla_sdk/resources/approval_requests.py index 92623f1..39b9411 100644 --- a/nexla_sdk/resources/approval_requests.py +++ b/nexla_sdk/resources/approval_requests.py @@ -17,11 +17,46 @@ def list_pending(self) -> List[ApprovalRequest]: response = self._make_request("GET", path) return self._parse_response(response) + def list_assigned(self) -> List[ApprovalRequest]: + path = f"{self._path}/assigned" + response = self._make_request("GET", path) + return self._parse_response(response) + def list_requested(self) -> List[ApprovalRequest]: path = f"{self._path}/requested" response = self._make_request("GET", path) return self._parse_response(response) + def list_access_requested(self) -> List[ApprovalRequest]: + path = f"{self._path}/access/requested" + response = self._make_request("GET", path) + return self._parse_response(response) + + def list_access_pending(self) -> List[ApprovalRequest]: + path = f"{self._path}/access/pending" + response = self._make_request("GET", path) + return self._parse_response(response) + + def list_listings_requested(self) -> List[ApprovalRequest]: + path = f"{self._path}/listings/requested" + response = self._make_request("GET", path) + return self._parse_response(response) + + def list_listings_pending(self) -> List[ApprovalRequest]: + path = f"{self._path}/listings/pending" + response = self._make_request("GET", path) + return self._parse_response(response) + + def get(self, request_id: int) -> ApprovalRequest: + path = f"{self._path}/{request_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + + def show_data_set(self, data_set_id: int) -> List[ApprovalRequest]: + path = f"{self._path}/data_sets/{data_set_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + def approve(self, request_id: int) -> ApprovalRequest: path = f"{self._path}/{request_id}/approve" response = self._make_request("PUT", path) @@ -32,3 +67,8 @@ def reject(self, request_id: int, reason: str = "") -> ApprovalRequest: body = {"reason": reason} if reason else {} response = self._make_request("DELETE", path, json=body) return self._parse_response(response) + + def cancel(self, request_id: int) -> ApprovalRequest: + path = f"{self._path}/{request_id}/cancel" + response = self._make_request("PUT", path) + return self._parse_response(response) diff --git a/nexla_sdk/resources/async_tasks.py b/nexla_sdk/resources/async_tasks.py index 0b171a7..10de2e2 100644 --- a/nexla_sdk/resources/async_tasks.py +++ b/nexla_sdk/resources/async_tasks.py @@ -13,9 +13,9 @@ def __init__(self, client): self._path = "/async_tasks" self._model_class = AsyncTask - def list(self) -> List[AsyncTask]: + def list(self, **params) -> List[AsyncTask]: """List asynchronous tasks.""" - response = self._make_request("GET", self._path) + response = self._make_request("GET", self._path, params=params) return self._parse_response(response) def create(self, payload: AsyncTaskCreate) -> AsyncTask: @@ -24,9 +24,9 @@ def create(self, payload: AsyncTaskCreate) -> AsyncTask: response = self._make_request("POST", self._path, json=serialized) return self._parse_response(response) - def list_of_type(self, task_type: str) -> List[AsyncTask]: + def list_of_type(self, task_type: str, **params) -> List[AsyncTask]: path = f"{self._path}/of_type/{task_type}" - response = self._make_request("GET", path) + response = self._make_request("GET", path, params=params) return self._parse_response(response) def list_by_status(self, status: str) -> List[AsyncTask]: diff --git a/nexla_sdk/resources/attribute_transforms.py b/nexla_sdk/resources/attribute_transforms.py index dc2f0c5..4ded835 100644 --- a/nexla_sdk/resources/attribute_transforms.py +++ b/nexla_sdk/resources/attribute_transforms.py @@ -59,3 +59,13 @@ def list_public(self) -> List[AttributeTransform]: path = f"{self._path}/public" response = self._make_request("GET", path) return self._parse_response(response) + + def copy(self, attribute_transform_id: int) -> AttributeTransform: + """Copy an attribute transform.""" + return super().copy(attribute_transform_id) + + def search(self, filters: Dict[str, Any], **params) -> List[AttributeTransform]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[AttributeTransform]: + return super().search_tags(tags, **params) diff --git a/nexla_sdk/resources/auth_parameters.py b/nexla_sdk/resources/auth_parameters.py new file mode 100644 index 0000000..db6e2e8 --- /dev/null +++ b/nexla_sdk/resources/auth_parameters.py @@ -0,0 +1,36 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.auth_parameters.requests import ( + AuthParameterCreate, + AuthParameterUpdate, +) +from nexla_sdk.models.auth_parameters.responses import AuthParameter +from nexla_sdk.resources.base_resource import BaseResource + + +class AuthParametersResource(BaseResource): + """Resource for managing auth parameters.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/auth_parameters" + self._model_class = AuthParameter + + def list(self, **kwargs) -> List[AuthParameter]: + return super().list(**kwargs) + + def get(self, auth_parameter_id: int) -> AuthParameter: + return super().get(auth_parameter_id) + + def create(self, data: Union[AuthParameterCreate, Dict[str, Any]]) -> AuthParameter: + return super().create(data) + + def update( + self, + auth_parameter_id: int, + data: Union[AuthParameterUpdate, Dict[str, Any]], + ) -> AuthParameter: + return super().update(auth_parameter_id, data) + + def delete(self, auth_parameter_id: int) -> Dict[str, Any]: + return super().delete(auth_parameter_id) diff --git a/nexla_sdk/resources/auth_templates.py b/nexla_sdk/resources/auth_templates.py new file mode 100644 index 0000000..0ebd7ba --- /dev/null +++ b/nexla_sdk/resources/auth_templates.py @@ -0,0 +1,174 @@ +"""Resource for managing auth templates.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.auth_templates.requests import ( + AuthTemplateCreate, + AuthTemplateUpdate, +) +from nexla_sdk.models.auth_templates.responses import AuthTemplate +from nexla_sdk.resources.base_resource import BaseResource + + +class AuthTemplatesResource(BaseResource): + """Resource for managing auth templates. + + Auth templates define authentication configurations for vendors. + Write operations (create, update, delete) require super user access. + + Examples: + # List all auth templates + templates = client.auth_templates.list() + + # Get an auth template by ID + template = client.auth_templates.get(123) + + # Get an auth template by name + template = client.auth_templates.get_by_name("oauth2_standard") + + # Create an auth template (super user only) + template = client.auth_templates.create(AuthTemplateCreate( + name="new_template", + vendor_id=456, + display_name="New Auth Template" + )) + + # Update an auth template (super user only) + template = client.auth_templates.update(123, AuthTemplateUpdate( + description="Updated description" + )) + + # Delete an auth template (super user only) + client.auth_templates.delete(123) + """ + + def __init__(self, client): + """Initialize the auth templates resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/auth_templates" + self._model_class = AuthTemplate + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + access_role: Optional[str] = None, + **kwargs, + ) -> List[AuthTemplate]: + """List auth templates. + + Args: + page: Page number (1-based) + per_page: Items per page + access_role: Filter by access role (owner, collaborator, operator, admin) + + Returns: + List of auth templates + """ + return super().list( + page=page, per_page=per_page, access_role=access_role, **kwargs + ) + + def get(self, auth_template_id: int, expand: bool = False) -> AuthTemplate: + """Get auth template by ID. + + Args: + auth_template_id: Auth template ID + expand: Include expanded references (where supported) + + Returns: + AuthTemplate instance + """ + return super().get(auth_template_id, expand=expand) + + def get_by_name(self, auth_template_name: str) -> AuthTemplate: + """Get auth template by name. + + Args: + auth_template_name: Auth template name + + Returns: + AuthTemplate instance + """ + params = {"auth_template_name": auth_template_name} + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def create(self, data: Union[AuthTemplateCreate, Dict[str, Any]]) -> AuthTemplate: + """Create a new auth template (super user only). + + Args: + data: Auth template creation data + + Returns: + Created auth template + """ + return super().create(data) + + def update( + self, auth_template_id: int, data: Union[AuthTemplateUpdate, Dict[str, Any]] + ) -> AuthTemplate: + """Update an auth template (super user only). + + Args: + auth_template_id: Auth template ID + data: Updated auth template data + + Returns: + Updated auth template + """ + return super().update(auth_template_id, data) + + def update_by_name( + self, auth_template_name: str, data: Union[AuthTemplateUpdate, Dict[str, Any]] + ) -> AuthTemplate: + """Update an auth template by name (super user only). + + Args: + auth_template_name: Auth template name + data: Updated auth template data + + Returns: + Updated auth template + """ + params = {"auth_template_name": auth_template_name} + serialized_data = self._serialize_data(data) + response = self._make_request( + "PUT", self._path, json=serialized_data, params=params + ) + return self._parse_response(response) + + def delete(self, auth_template_id: int) -> Dict[str, Any]: + """Delete an auth template (super user only). + + Args: + auth_template_id: Auth template ID + + Returns: + Response with status + """ + return super().delete(auth_template_id) + + def delete_by_name(self, auth_template_name: str) -> Dict[str, Any]: + """Delete an auth template by name (super user only). + + Args: + auth_template_name: Auth template name + + Returns: + Response with status + """ + params = {"auth_template_name": auth_template_name} + return self._make_request("DELETE", self._path, params=params) + + def update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """Update auth templates via collection endpoint.""" + return self._make_request("PUT", self._path, json=payload) + + def delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: + """Delete auth templates via collection endpoint.""" + return self._make_request("DELETE", self._path, json=payload or {}) diff --git a/nexla_sdk/resources/base_resource.py b/nexla_sdk/resources/base_resource.py index 80ba9b8..c5675ba 100644 --- a/nexla_sdk/resources/base_resource.py +++ b/nexla_sdk/resources/base_resource.py @@ -336,6 +336,244 @@ def copy( response = self._make_request("POST", path, json=serialized_options) return self._parse_response(response) + def list_public( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + **params, + ) -> List[T]: + """ + List publicly available resources for this type. + + Args: + page: Page number (1-based) + per_page: Items per page + **params: Additional query parameters + + Returns: + List of public resources + """ + path = f"{self._path}/public" + query_params: Dict[str, Any] = {} + if page is not None: + query_params["page"] = page + if per_page is not None: + query_params["per_page"] = per_page + query_params.update(params) + response = self._make_request("GET", path, params=query_params) + return self._parse_response(response) + + def list_accessible(self, **params) -> List[T]: + """ + List resources accessible to the current user (access_insights). + + Args: + **params: Optional query parameters + + Returns: + List of accessible resources + """ + path = f"{self._path}/accessible" + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def get_access_insights(self, resource_id: int, **params) -> Dict[str, Any]: + """ + Explain why the current user can access a resource. + + Args: + resource_id: Resource ID + **params: Optional query parameters + + Returns: + Access insights payload + """ + path = f"{self._path}/{resource_id}/access" + return self._make_request("GET", path, params=params) + + def get_users_access_insights(self, resource_id: int, **params) -> Dict[str, Any]: + """ + Get access insights for all users with access to a resource. + + Args: + resource_id: Resource ID + **params: Optional query parameters + + Returns: + Users access insights payload + """ + path = f"{self._path}/{resource_id}/users_access_insights" + return self._make_request("GET", path, params=params) + + def search(self, filters: Dict[str, Any], **params) -> List[T]: + """ + Search resources using filter criteria. + + Args: + filters: Search filters payload + **params: Optional query parameters + + Returns: + List of matching resources + """ + path = f"{self._path}/search" + response = self._make_request("POST", path, json=filters, params=params) + return self._parse_response(response) + + def search_tags(self, tags: List[str], **params) -> List[T]: + """ + Search resources by tags. + + Args: + tags: List of tags to search for + **params: Optional query parameters + + Returns: + List of matching resources + """ + path = f"{self._path}/search_tags" + response = self._make_request("POST", path, json=tags, params=params) + return self._parse_response(response) + + def get_docs(self, resource_id: int) -> Dict[str, Any]: + """ + Get documentation entries for a resource. + + Args: + resource_id: Resource ID + + Returns: + Docs payload + """ + path = f"{self._path}/{resource_id}/docs" + return self._make_request("GET", path) + + def set_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]: + """ + Replace documentation entries for a resource. + + Args: + resource_id: Resource ID + docs: Docs payload + + Returns: + Updated docs payload + """ + path = f"{self._path}/{resource_id}/docs" + return self._make_request("POST", path, json=docs) + + def add_docs(self, resource_id: int, docs: List[Dict[str, Any]]) -> Dict[str, Any]: + """ + Add documentation entries for a resource. + + Args: + resource_id: Resource ID + docs: Docs payload to add + + Returns: + Updated docs payload + """ + path = f"{self._path}/{resource_id}/docs" + return self._make_request("PUT", path, json=docs) + + def remove_docs( + self, resource_id: int, docs: Optional[List[Dict[str, Any]]] = None + ) -> Dict[str, Any]: + """ + Remove documentation entries for a resource. + + Args: + resource_id: Resource ID + docs: Docs payload to remove (optional) + + Returns: + Updated docs payload + """ + path = f"{self._path}/{resource_id}/docs" + return self._make_request("DELETE", path, json=docs or []) + + def get_referenced_by(self, resource_id: int) -> Dict[str, Any]: + """ + Get resources that reference this resource. + + Args: + resource_id: Resource ID + + Returns: + Referenced-by payload + """ + path = f"{self._path}/{resource_id}/referenced_by" + return self._make_request("GET", path) + + def get_control_event(self, resource_id: int, event: str) -> Dict[str, Any]: + """ + Get control event info for a resource. + + Args: + resource_id: Resource ID + event: Control event name + + Returns: + Control event payload + """ + path = f"{self._path}/{resource_id}/control/{event}" + return self._make_request("GET", path) + + def get_tags(self, resource_id: int) -> List[str]: + """ + Get tags for a resource. + + Args: + resource_id: Resource ID + + Returns: + List of tags + """ + path = f"{self._path}/{resource_id}/tags" + return self._make_request("GET", path) + + def set_tags(self, resource_id: int, tags: List[str]) -> List[str]: + """ + Replace all tags for a resource. + + Args: + resource_id: Resource ID + tags: Tags to set + + Returns: + Updated list of tags + """ + path = f"{self._path}/{resource_id}/tags" + return self._make_request("POST", path, json=tags) + + def add_tags(self, resource_id: int, tags: List[str]) -> List[str]: + """ + Add tags to a resource. + + Args: + resource_id: Resource ID + tags: Tags to add + + Returns: + Updated list of tags + """ + path = f"{self._path}/{resource_id}/tags" + return self._make_request("PUT", path, json=tags) + + def remove_tags(self, resource_id: int, tags: List[str]) -> List[str]: + """ + Remove tags from a resource. + + Args: + resource_id: Resource ID + tags: Tags to remove + + Returns: + Updated list of tags + """ + path = f"{self._path}/{resource_id}/tags" + return self._make_request("DELETE", path, json=tags) + def get_audit_log( self, resource_id: int, diff --git a/nexla_sdk/resources/catalog_configs.py b/nexla_sdk/resources/catalog_configs.py new file mode 100644 index 0000000..ef7c983 --- /dev/null +++ b/nexla_sdk/resources/catalog_configs.py @@ -0,0 +1,49 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.catalog_configs.requests import ( + CatalogConfigCreate, + CatalogConfigUpdate, +) +from nexla_sdk.models.catalog_configs.responses import CatalogConfig +from nexla_sdk.resources.base_resource import BaseResource + + +class CatalogConfigsResource(BaseResource): + """Resource for managing catalog configs.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/catalog_configs" + self._model_class = CatalogConfig + + def list(self, **kwargs) -> List[CatalogConfig]: + return super().list(**kwargs) + + def list_all(self, **params) -> List[CatalogConfig]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def get(self, catalog_config_id: int) -> CatalogConfig: + return super().get(catalog_config_id) + + def create(self, data: Union[CatalogConfigCreate, Dict[str, Any]]) -> CatalogConfig: + return super().create(data) + + def update( + self, catalog_config_id: int, data: Union[CatalogConfigUpdate, Dict[str, Any]] + ) -> CatalogConfig: + return super().update(catalog_config_id, data) + + def delete(self, catalog_config_id: int) -> Dict[str, Any]: + return super().delete(catalog_config_id) + + def mock_catalog_add(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/mock_catalog_add", json=payload) + + def check_job_status(self, catalog_config_id: int) -> Dict[str, Any]: + path = f"{self._path}/{catalog_config_id}/check_job_status" + return self._make_request("GET", path) + + def start_bulk_create_update(self, catalog_config_id: int) -> Dict[str, Any]: + path = f"{self._path}/{catalog_config_id}/bulk_create_update_refs" + return self._make_request("GET", path) diff --git a/nexla_sdk/resources/cluster_endpoints.py b/nexla_sdk/resources/cluster_endpoints.py new file mode 100644 index 0000000..8374647 --- /dev/null +++ b/nexla_sdk/resources/cluster_endpoints.py @@ -0,0 +1,138 @@ +"""Resource for managing cluster endpoints.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.clusters.requests import ( + ClusterEndpointCreate, + ClusterEndpointUpdate, +) +from nexla_sdk.models.clusters.responses import ClusterEndpoint +from nexla_sdk.resources.base_resource import BaseResource + + +class ClusterEndpointsResource(BaseResource): + """Resource for managing cluster endpoints. + + Cluster endpoints define individual service connections within a cluster. + Most operations require super user access. + + Examples: + # List cluster endpoints + endpoints = client.cluster_endpoints.list() + + # Get a specific endpoint + endpoint = client.cluster_endpoints.get(123) + + # Create an endpoint + endpoint = client.cluster_endpoints.create(ClusterEndpointCreate( + cluster_id=456, + service="data_ingestion", + protocol="https", + host="ingestion.example.com", + port=443 + )) + + # Update an endpoint + endpoint = client.cluster_endpoints.update(123, ClusterEndpointUpdate( + host="new-ingestion.example.com" + )) + + # Get audit log + audit_log = client.cluster_endpoints.get_audit_log(123) + """ + + def __init__(self, client): + """Initialize the cluster endpoints resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/cluster_endpoints" + self._model_class = ClusterEndpoint + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + **kwargs, + ) -> List[ClusterEndpoint]: + """List cluster endpoints. + + Args: + page: Page number (1-based) + per_page: Items per page + + Returns: + List of cluster endpoints + """ + return super().list(page=page, per_page=per_page, **kwargs) + + def get(self, endpoint_id: int) -> ClusterEndpoint: + """Get cluster endpoint by ID. + + Args: + endpoint_id: Endpoint ID + + Returns: + ClusterEndpoint instance + """ + path = f"{self._path}/{endpoint_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + + def create( + self, data: Union[ClusterEndpointCreate, Dict[str, Any]] + ) -> ClusterEndpoint: + """Create a new cluster endpoint. + + Args: + data: Endpoint creation data (requires cluster_id and service) + + Returns: + Created cluster endpoint + """ + serialized_data = self._serialize_data(data) + response = self._make_request("POST", self._path, json=serialized_data) + return self._parse_response(response) + + def update( + self, endpoint_id: int, data: Union[ClusterEndpointUpdate, Dict[str, Any]] + ) -> ClusterEndpoint: + """Update a cluster endpoint. + + Args: + endpoint_id: Endpoint ID + data: Updated endpoint data + + Returns: + Updated cluster endpoint + """ + path = f"{self._path}/{endpoint_id}" + serialized_data = self._serialize_data(data) + response = self._make_request("PUT", path, json=serialized_data) + return self._parse_response(response) + + def get_audit_log( + self, + endpoint_id: int, + page: Optional[int] = None, + per_page: Optional[int] = None, + ) -> List[Dict[str, Any]]: + """Get audit log for a cluster endpoint. + + Args: + endpoint_id: Endpoint ID + page: Page number (1-based) + per_page: Items per page + + Returns: + List of audit log entries + """ + path = f"{self._path}/{endpoint_id}/audit_log" + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + return self._make_request("GET", path, params=params) diff --git a/nexla_sdk/resources/clusters.py b/nexla_sdk/resources/clusters.py new file mode 100644 index 0000000..627c50c --- /dev/null +++ b/nexla_sdk/resources/clusters.py @@ -0,0 +1,155 @@ +"""Resource for managing clusters.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.clusters.requests import ClusterCreate, ClusterUpdate +from nexla_sdk.models.clusters.responses import Cluster +from nexla_sdk.resources.base_resource import BaseResource + + +class ClustersResource(BaseResource): + """Resource for managing clusters. + + Clusters define infrastructure endpoints for processing data flows. + This resource requires super user access for most operations. + + Examples: + # List clusters + clusters = client.clusters.list() + + # Get a specific cluster + cluster = client.clusters.get(123) + + # Create a cluster + cluster = client.clusters.create(ClusterCreate( + org_id=1, + name="Production Cluster", + region="us-west-2", + provider="aws" + )) + + # Activate a cluster + client.clusters.activate(cluster.id) + + # Set as default cluster + client.clusters.set_default(cluster.id) + """ + + def __init__(self, client): + """Initialize the clusters resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/clusters" + self._model_class = Cluster + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + access_role: Optional[str] = None, + **kwargs, + ) -> List[Cluster]: + """List clusters. + + Args: + page: Page number (1-based) + per_page: Items per page + access_role: Filter by access role (owner, collaborator, operator, admin) + + Returns: + List of clusters + """ + return super().list( + page=page, per_page=per_page, access_role=access_role, **kwargs + ) + + def get(self, cluster_id: int, expand: bool = False) -> Cluster: + """Get cluster by ID. + + Args: + cluster_id: Cluster ID + expand: Include expanded references + + Returns: + Cluster instance + """ + return super().get(cluster_id, expand=expand) + + def create(self, data: Union[ClusterCreate, Dict[str, Any]]) -> Cluster: + """Create a new cluster. + + Args: + data: Cluster creation data (requires org_id, name, and region) + + Returns: + Created cluster + """ + return super().create(data) + + def update( + self, cluster_id: int, data: Union[ClusterUpdate, Dict[str, Any]] + ) -> Cluster: + """Update a cluster. + + Args: + cluster_id: Cluster ID + data: Updated cluster data + + Returns: + Updated cluster + """ + return super().update(cluster_id, data) + + def delete(self, cluster_id: int) -> Dict[str, Any]: + """Delete a cluster. + + Args: + cluster_id: Cluster ID + + Returns: + Response with status + """ + return super().delete(cluster_id) + + def activate(self, cluster_id: int) -> Cluster: + """Activate a cluster. + + Args: + cluster_id: Cluster ID + + Returns: + Activated cluster + """ + return super().activate(cluster_id) + + def set_default(self, cluster_id: int) -> Cluster: + """Set a cluster as the default. + + The cluster must be available (active, belongs to Nexla org, + and is not private). + + Args: + cluster_id: Cluster ID + + Returns: + Updated cluster + """ + path = f"{self._path}/default/{cluster_id}" + response = self._make_request("PUT", path) + return self._parse_response(response) + + def delete_endpoint(self, cluster_id: int, endpoint_id: int) -> Dict[str, Any]: + """Delete an endpoint from a cluster. + + Args: + cluster_id: Cluster ID + endpoint_id: Endpoint ID + + Returns: + Response with status + """ + path = f"{self._path}/{cluster_id}/endpoints/{endpoint_id}" + return self._make_request("DELETE", path) diff --git a/nexla_sdk/resources/code_containers.py b/nexla_sdk/resources/code_containers.py index 2fa67af..980a299 100644 --- a/nexla_sdk/resources/code_containers.py +++ b/nexla_sdk/resources/code_containers.py @@ -73,3 +73,19 @@ def list_public(self) -> List[CodeContainer]: path = f"{self._path}/public" response = self._make_request("GET", path) return self._parse_response(response) + + def list_accessible(self, **params) -> List[CodeContainer]: + return super().list_accessible(**params) + + def repo(self, code_container_id: int) -> Dict[str, Any]: + path = f"{self._path}/{code_container_id}/repo" + return self._make_request("GET", path) + + def error_functions(self) -> Dict[str, Any]: + return self._make_request("GET", "/error_functions") + + def search(self, filters: Dict[str, Any], **params) -> List[CodeContainer]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[CodeContainer]: + return super().search_tags(tags, **params) diff --git a/nexla_sdk/resources/connectors.py b/nexla_sdk/resources/connectors.py new file mode 100644 index 0000000..a453231 --- /dev/null +++ b/nexla_sdk/resources/connectors.py @@ -0,0 +1,139 @@ +"""Resource for managing connectors.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.connectors.requests import ConnectorUpdate +from nexla_sdk.models.connectors.responses import Connector +from nexla_sdk.resources.base_resource import BaseResource + + +class ConnectorsResource(BaseResource): + """Resource for managing connectors. + + Connectors define connection types for data sources and destinations. + The backend only supports list, get, and update operations. + + Read access requires Nexla admin org membership. + Update operations require super user access. + + Note: + This resource only supports ``list()``, ``get()``, and ``update()``. + Other write operations inherited from ``BaseResource`` (e.g. + ``create``, ``delete``, ``copy``) are not supported by the backend + and will raise ``NotImplementedError``. + + Examples: + # List all connectors + connectors = client.connectors.list() + + # Filter by API compatibility + nexset_connectors = client.connectors.list(nexset_api_compatible=True) + + # Get a specific connector by ID + connector = client.connectors.get(123) + + # Get a connector by type + connector = client.connectors.get("s3") + + # Update a connector (super user only) + connector = client.connectors.update(123, ConnectorUpdate( + description="Updated description" + )) + """ + + _NOT_SUPPORTED_MSG = ( + "Connectors only support list, get, and update operations. " + "This method is not supported by the backend." + ) + + def __init__(self, client): + """Initialize the connectors resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/connectors" + self._model_class = Connector + + def list( + self, + access_role: Optional[str] = None, + nexset_api_compatible: Optional[bool] = None, + sync_api_compatible: Optional[bool] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, + **kwargs, + ) -> List[Connector]: + """List connectors. + + Args: + access_role: Filter by access role + nexset_api_compatible: Filter by Nexset API compatibility + sync_api_compatible: Filter by Sync API compatibility + page: Page number (1-based) + per_page: Items per page + + Returns: + List of connectors + """ + params = kwargs.copy() + if access_role is not None: + params["access_role"] = access_role + if nexset_api_compatible is not None: + params["nexset_api_compatible"] = str(nexset_api_compatible).lower() + if sync_api_compatible is not None: + params["sync_api_compatible"] = str(sync_api_compatible).lower() + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def get(self, connector_id: Union[int, str]) -> Connector: + """Get connector by ID or type. + + Args: + connector_id: Connector ID (int) or type (string) + + Returns: + Connector instance + """ + path = f"{self._path}/{connector_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + + def update( + self, + connector_id: Union[int, str], + data: Union[ConnectorUpdate, Dict[str, Any]], + ) -> Connector: + """Update a connector (super user only). + + Args: + connector_id: Connector ID or type + data: Updated connector data + + Returns: + Updated connector + """ + path = f"{self._path}/{connector_id}" + serialized_data = self._serialize_data(data) + response = self._make_request("PUT", path, json=serialized_data) + return self._parse_response(response) + + def create(self, data=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def delete(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def copy(self, resource_id=None, options=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def activate(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) + + def pause(self, resource_id=None): + raise NotImplementedError(self._NOT_SUPPORTED_MSG) diff --git a/nexla_sdk/resources/credentials.py b/nexla_sdk/resources/credentials.py index 83bb436..e1e4356 100644 --- a/nexla_sdk/resources/credentials.py +++ b/nexla_sdk/resources/credentials.py @@ -56,6 +56,34 @@ def list( return super().list(**params) + def list_all(self, **params) -> List[Credential]: + """List all credentials (admin only).""" + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def list_public(self, **params) -> List[Credential]: + response = self._make_request("GET", f"{self._path}/public", params=params) + return self._parse_response(response) + + def list_accessible(self, **params) -> List[Credential]: + return super().list_accessible(**params) + + def credentials_schema(self, source_type: Optional[str] = None) -> Dict[str, Any]: + path = f"{self._path}/format" + if source_type: + path = f"{path}/{source_type}" + return self._make_request("GET", path) + + def db_data_types(self, source_type: str) -> Dict[str, Any]: + path = f"{self._path}/db_data_types/{source_type}" + return self._make_request("GET", path) + + def search(self, filters: Dict[str, Any], **params) -> List[Credential]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Credential]: + return super().search_tags(tags, **params) + def get(self, credential_id: int, expand: bool = False) -> Credential: """ Get single credential by ID. @@ -152,6 +180,56 @@ def probe( else: return response + def probe_list_buckets(self, credential_id: int) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/list" + return self._make_request("GET", path) + + def probe_summary(self, credential_id: int) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/summary" + return self._make_request("GET", path) + + def probe_list_files( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/buckets" + return self._make_request("POST", path, json=payload) + + def probe_tree_request( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/tree" + return self._make_request("POST", path, json=payload) + + def probe_read_file( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/files" + return self._make_request("POST", path, json=payload) + + def probe_detect_schemas( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/schemas" + return self._make_request("POST", path, json=payload) + + def probe_read_sample( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/sample" + return self._make_request("POST", path, json=payload) + + def probe_file_download( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/file/download" + return self._make_request("POST", path, json=payload) + + def probe_search_path( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/probe/search_path" + return self._make_request("POST", path, json=payload) + def probe_tree( self, credential_id: int, @@ -207,3 +285,23 @@ def probe_sample( "POST", path, json=request.to_dict(), params=params ) return ProbeSampleResponse(**response) + + def refresh(self, credential_id: int) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/refresh" + return self._make_request("PUT", path) + + def usage(self, credential_id: int) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/usage" + return self._make_request("GET", path) + + def intent( + self, credential_id: int, payload: Dict[str, Any], method: str = "PUT" + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/intent" + return self._make_request(method.upper(), path, json=payload) + + def migrate_iceberg( + self, credential_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{credential_id}/migrate/iceberg" + return self._make_request("POST", path, json=payload) diff --git a/nexla_sdk/resources/cubejs.py b/nexla_sdk/resources/cubejs.py new file mode 100644 index 0000000..414cc4a --- /dev/null +++ b/nexla_sdk/resources/cubejs.py @@ -0,0 +1,15 @@ +from typing import Any, Dict + +from nexla_sdk.resources.base_resource import BaseResource + + +class CubeJsResource(BaseResource): + """Resource for Cube.js query endpoint.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/cubejs" + self._model_class = None + + def query(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/query", json=payload) diff --git a/nexla_sdk/resources/custom_data_flows.py b/nexla_sdk/resources/custom_data_flows.py new file mode 100644 index 0000000..d204b7a --- /dev/null +++ b/nexla_sdk/resources/custom_data_flows.py @@ -0,0 +1,80 @@ +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.custom_data_flows.requests import ( + CustomDataFlowCreate, + CustomDataFlowUpdate, +) +from nexla_sdk.models.custom_data_flows.responses import CustomDataFlow +from nexla_sdk.resources.base_resource import BaseResource + + +class CustomDataFlowsResource(BaseResource): + """Resource for managing custom data flows.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/custom_data_flows" + self._model_class = CustomDataFlow + + def list(self, **kwargs) -> List[CustomDataFlow]: + return super().list(**kwargs) + + def list_accessible(self, **params) -> List[CustomDataFlow]: + return super().list_accessible(**params) + + def get(self, custom_data_flow_id: int, expand: bool = False) -> CustomDataFlow: + return super().get(custom_data_flow_id, expand) + + def create( + self, data: Union[CustomDataFlowCreate, Dict[str, Any]] + ) -> CustomDataFlow: + return super().create(data) + + def update( + self, + custom_data_flow_id: int, + data: Union[CustomDataFlowUpdate, Dict[str, Any]], + ) -> CustomDataFlow: + return super().update(custom_data_flow_id, data) + + def delete(self, custom_data_flow_id: int) -> Dict[str, Any]: + return super().delete(custom_data_flow_id) + + def copy( + self, custom_data_flow_id: int, payload: Optional[Dict[str, Any]] = None + ) -> CustomDataFlow: + return super().copy(custom_data_flow_id, payload) + + def activate( + self, custom_data_flow_id: int, activate: bool = True + ) -> CustomDataFlow: + action = "activate" if activate else "pause" + path = f"{self._path}/{custom_data_flow_id}/{action}" + response = self._make_request("PUT", path) + return self._parse_response(response) + + def get_metrics(self, custom_data_flow_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{custom_data_flow_id}/metrics" + return self._make_request("GET", path, params=params) + + def edit_code_containers( + self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str + ) -> Dict[str, Any]: + path = f"{self._path}/{custom_data_flow_id}/code_containers" + method_map = {"list": "GET", "reset": "POST", "add": "PUT", "remove": "DELETE"} + method = method_map.get(mode, "GET") + return self._make_request(method, path, json=payload) + + def edit_data_credentials( + self, custom_data_flow_id: int, payload: Dict[str, Any], mode: str + ) -> Dict[str, Any]: + path = f"{self._path}/{custom_data_flow_id}/data_credentials" + method_map = {"list": "GET", "reset": "POST", "add": "PUT", "remove": "DELETE"} + method = method_map.get(mode, "GET") + return self._make_request(method, path, json=payload) + + def search(self, filters: Dict[str, Any], **params) -> List[CustomDataFlow]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[CustomDataFlow]: + return super().search_tags(tags, **params) diff --git a/nexla_sdk/resources/dashboard_transforms.py b/nexla_sdk/resources/dashboard_transforms.py new file mode 100644 index 0000000..4e24764 --- /dev/null +++ b/nexla_sdk/resources/dashboard_transforms.py @@ -0,0 +1,42 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.dashboard_transforms.requests import ( + DashboardTransformCreate, + DashboardTransformUpdate, +) +from nexla_sdk.models.dashboard_transforms.responses import DashboardTransform +from nexla_sdk.resources.base_resource import BaseResource + + +class DashboardTransformsResource(BaseResource): + """Resource for dashboard transforms (global endpoints).""" + + def __init__(self, client): + super().__init__(client) + self._path = "/dashboard_transforms" + self._model_class = DashboardTransform + + def list(self, **kwargs) -> List[DashboardTransform]: + return super().list(**kwargs) + + def list_all(self, **params) -> List[DashboardTransform]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def get(self, dashboard_transform_id: int) -> DashboardTransform: + return super().get(dashboard_transform_id) + + def create( + self, data: Union[DashboardTransformCreate, Dict[str, Any]] + ) -> DashboardTransform: + return super().create(data) + + def update( + self, + dashboard_transform_id: int, + data: Union[DashboardTransformUpdate, Dict[str, Any]], + ) -> DashboardTransform: + return super().update(dashboard_transform_id, data) + + def delete(self, dashboard_transform_id: int) -> Dict[str, Any]: + return super().delete(dashboard_transform_id) diff --git a/nexla_sdk/resources/data_credentials_groups.py b/nexla_sdk/resources/data_credentials_groups.py new file mode 100644 index 0000000..86590bb --- /dev/null +++ b/nexla_sdk/resources/data_credentials_groups.py @@ -0,0 +1,54 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.credentials.responses import Credential +from nexla_sdk.models.data_credentials_groups.requests import ( + DataCredentialsGroupCreate, + DataCredentialsGroupRemoveCredentials, + DataCredentialsGroupUpdate, +) +from nexla_sdk.models.data_credentials_groups.responses import DataCredentialsGroup +from nexla_sdk.resources.base_resource import BaseResource + + +class DataCredentialsGroupsResource(BaseResource): + """Resource for managing data credentials groups.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/data_credentials_groups" + self._model_class = DataCredentialsGroup + + def list(self, **kwargs) -> List[DataCredentialsGroup]: + return super().list(**kwargs) + + def get(self, group_id: int, expand: bool = False) -> DataCredentialsGroup: + return super().get(group_id, expand) + + def create( + self, data: Union[DataCredentialsGroupCreate, Dict[str, Any]] + ) -> DataCredentialsGroup: + return super().create(data) + + def update( + self, + group_id: int, + data: Union[DataCredentialsGroupUpdate, Dict[str, Any]], + ) -> DataCredentialsGroup: + return super().update(group_id, data) + + def delete(self, group_id: int) -> Dict[str, Any]: + return super().delete(group_id) + + def list_credentials(self, group_id: int, **params) -> List[Credential]: + path = f"{self._path}/{group_id}/data_credentials" + response = self._make_request("GET", path, params=params) + return [Credential.model_validate(item) for item in (response or [])] + + def remove_credentials( + self, + group_id: int, + payload: Union[DataCredentialsGroupRemoveCredentials, Dict[str, Any]], + ) -> Dict[str, Any]: + path = f"{self._path}/{group_id}/data_credentials" + data = self._serialize_data(payload) + return self._make_request("DELETE", path, json=data) diff --git a/nexla_sdk/resources/data_flows.py b/nexla_sdk/resources/data_flows.py new file mode 100644 index 0000000..95280df --- /dev/null +++ b/nexla_sdk/resources/data_flows.py @@ -0,0 +1,62 @@ +from typing import Any, Dict, List + +from nexla_sdk.resources.base_resource import BaseResource + + +class DataFlowsResource(BaseResource): + """Resource for legacy data_flows endpoints.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/data_flows" + self._model_class = None + + def list(self, **params) -> List[Dict[str, Any]]: + response = self._make_request("GET", self._path, params=params) + return response or [] + + def get(self, data_flow_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{data_flow_id}" + return self._make_request("GET", path, params=params) + + def create(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", self._path, json=payload) + + def get_audit_log(self, data_flow_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{data_flow_id}/audit_log" + return self._make_request("GET", path, params=params) + + def list_data_source_flows(self, **params) -> List[Dict[str, Any]]: + return ( + self._make_request("GET", f"{self._path}/data_source", params=params) or [] + ) + + def get_data_source_flow(self, data_source_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/data_source/{data_source_id}" + return self._make_request("GET", path, params=params) + + def create_data_source_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/data_source", json=payload) + + def list_data_sink_flows(self, **params) -> List[Dict[str, Any]]: + return self._make_request("GET", f"{self._path}/data_sink", params=params) or [] + + def get_data_sink_flow(self, data_sink_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/data_sink/{data_sink_id}" + return self._make_request("GET", path, params=params) + + def create_data_sink_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/data_sink", json=payload) + + def get_flow_audit_log(self, flow_node_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"/flows/{flow_node_id}/audit_log") + + def get_data_source_audit_log(self, data_source_id: int) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/data_source/{data_source_id}/audit_log" + ) + + def get_data_sink_audit_log(self, data_sink_id: int) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/data_sink/{data_sink_id}/audit_log" + ) diff --git a/nexla_sdk/resources/data_schemas.py b/nexla_sdk/resources/data_schemas.py index efdf54f..b4b62bf 100644 --- a/nexla_sdk/resources/data_schemas.py +++ b/nexla_sdk/resources/data_schemas.py @@ -1,16 +1,62 @@ -from typing import List +from typing import Any, Dict, List, Optional from nexla_sdk.models.common import LogEntry +from nexla_sdk.models.data_schemas.responses import DataSchema from nexla_sdk.resources.base_resource import BaseResource class DataSchemasResource(BaseResource): - """Resource for data schemas (accessors + audit log only).""" + """Resource for data schemas.""" def __init__(self, client): super().__init__(client) self._path = "/data_schemas" - self._model_class = None + self._model_class = DataSchema + + def list(self, **kwargs) -> List[DataSchema]: + return super().list(**kwargs) + + def list_all(self, **params) -> List[DataSchema]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def list_public(self, **params) -> List[DataSchema]: + response = self._make_request("GET", f"{self._path}/public", params=params) + return self._parse_response(response) + + def list_accessible(self, **params) -> List[DataSchema]: + return super().list_accessible(**params) + + def get(self, schema_id: int, expand: bool = False) -> DataSchema: + return super().get(schema_id, expand) + + def create(self, data: Dict[str, Any]) -> DataSchema: + return super().create(data) + + def update(self, schema_id: int, data: Dict[str, Any]) -> DataSchema: + return super().update(schema_id, data) + + def delete(self, schema_id: int) -> Dict[str, Any]: + return super().delete(schema_id) + + def get_metrics( + self, schema_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{schema_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + + def search(self, filters: Dict[str, Any], **params) -> List[DataSchema]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[DataSchema]: + return super().search_tags(tags, **params) + + def copy( + self, schema_id: int, payload: Optional[Dict[str, Any]] = None + ) -> DataSchema: + return super().copy(schema_id, payload) def get_audit_log(self, schema_id: int, **params) -> List[LogEntry]: path = f"{self._path}/{schema_id}/audit_log" diff --git a/nexla_sdk/resources/destinations.py b/nexla_sdk/resources/destinations.py index 35b8da9..3adbd23 100644 --- a/nexla_sdk/resources/destinations.py +++ b/nexla_sdk/resources/destinations.py @@ -35,6 +35,38 @@ def list(self, **kwargs) -> List[Destination]: """ return super().list(**kwargs) + def search(self, filters: Dict[str, Any], **params) -> List[Destination]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Destination]: + return super().search_tags(tags, **params) + + def list_all(self, **params) -> List[Destination]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def list_all_condensed(self, **params) -> List[Dict[str, Any]]: + return self._make_request("GET", f"{self._path}/all/condensed", params=params) + + def list_all_ids(self, **params) -> List[int]: + return self._make_request("GET", f"{self._path}/all/ids", params=params) + + def list_all_by_data_set(self, **params) -> List[Destination]: + response = self._make_request( + "GET", f"{self._path}/all/data_set", params=params + ) + return self._parse_response(response) + + def list_accessible(self, **params) -> List[Destination]: + return super().list_accessible(**params) + + def script_sink_config(self) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/script_sink_config") + + def update_runtime_status(self, sink_id: int, status: str) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/runtime_status/{status}" + return self._make_request("PUT", path) + def get(self, sink_id: int, expand: bool = False) -> Destination: """ Get single destination by ID. @@ -91,6 +123,53 @@ def delete(self, sink_id: int) -> Dict[str, Any]: """ return super().delete(sink_id) + def get_flow(self, sink_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/{sink_id}/flow") + + def get_flow_dashboard(self, sink_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{sink_id}/flow/dashboard", params=params + ) + + def get_flow_status_metrics(self, sink_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{sink_id}/flow/status_metrics", params=params + ) + + def get_flow_metrics(self, sink_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{sink_id}/flow/metrics", params=params + ) + + def get_flow_logs(self, sink_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{sink_id}/flow/logs", params=params + ) + + def get_metrics( + self, sink_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + + def get_quarantine_offset( + self, sink_id: int, data_set_id: Optional[int] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine/offset" + if data_set_id: + path = f"{path}/{data_set_id}" + return self._make_request("GET", path) + + def get_offset( + self, sink_id: int, data_set_id: Optional[int] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/offset" + if data_set_id: + path = f"{path}/{data_set_id}" + return self._make_request("GET", path) + def activate(self, sink_id: int) -> Destination: """ Activate destination. @@ -130,3 +209,170 @@ def copy( """ data = options.to_dict() if options else {} return super().copy(sink_id, data) + + def probe_list_buckets(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe" + return self._make_request("GET", path) + + def probe_summary(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/summary" + return self._make_request("GET", path) + + def probe_authenticate(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/authenticate" + return self._make_request("GET", path) + + def probe_list_files(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/buckets" + return self._make_request("POST", path, json=payload) + + def probe_tree(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/tree" + return self._make_request("POST", path, json=payload) + + def probe_read_file(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/files" + return self._make_request("POST", path, json=payload) + + def probe_detect_schemas( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/schemas" + return self._make_request("POST", path, json=payload) + + def probe_quarantine_sample( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/probe/quarantine/sample" + return self._make_request("POST", path, json=payload) + + def get_quarantine_settings(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine_settings" + return self._make_request("GET", path) + + def create_quarantine_settings( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine_settings" + return self._make_request("POST", path, json=payload) + + def update_quarantine_settings( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine_settings" + return self._make_request("PUT", path, json=payload) + + def delete_quarantine_settings(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine_settings" + return self._make_request("DELETE", path) + + def get_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/dashboard_transforms" + return self._make_request("GET", path) + + def create_dashboard_transforms( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/dashboard_transforms" + return self._make_request("POST", path, json=payload) + + def update_dashboard_transforms( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/dashboard_transforms" + return self._make_request("PUT", path, json=payload) + + def delete_dashboard_transforms(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/dashboard_transforms" + return self._make_request("DELETE", path) + + def validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/config/validate", json=payload) + + def test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/test_config", json=payload) + + def run_status(self, sink_id: int, run_id: Optional[int] = None) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/run_status" + if run_id is not None: + path = f"{path}/{run_id}" + return self._make_request("GET", path) + + def run_analysis(self, sink_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/run_analysis" + return self._make_request("GET", path, params=params) + + def list_flow_triggers(self, sink_id: int) -> List[Dict[str, Any]]: + path = f"{self._path}/{sink_id}/flow_triggers" + return self._make_request("GET", path) or [] + + def edit_flow_triggers( + self, + sink_id: int, + payload: Dict[str, Any], + mode: str, + all_triggers: bool = False, + ) -> List[Dict[str, Any]]: + path = f"{self._path}/{sink_id}/flow_triggers" + if mode in {"pause", "activate"}: + path = f"{path}/{mode}" + if all_triggers: + path = f"{path}/all" + method = "PUT" if mode in {"add", "pause", "activate"} else "POST" + if mode == "remove": + method = "DELETE" + return self._make_request(method, path, json=payload) or [] + + def list_api_keys(self, sink_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys" + return self._make_request("GET", path, params=params) + + def search_api_keys( + self, sink_id: int, filters: Dict[str, Any], **params + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/search" + return self._make_request("POST", path, json=filters, params=params) + + def get_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}" + return self._make_request("GET", path) + + def create_api_key(self, sink_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys" + return self._make_request("POST", path, json=payload) + + def update_api_key( + self, sink_id: int, api_key_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}" + return self._make_request("PUT", path, json=payload) + + def rotate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}/rotate" + return self._make_request("PUT", path) + + def activate_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}/activate" + return self._make_request("PUT", path) + + def pause_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}/pause" + return self._make_request("PUT", path) + + def pause_all_api_keys(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/pause" + return self._make_request("PUT", path) + + def delete_api_key(self, sink_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/api_keys/{api_key_id}" + return self._make_request("DELETE", path) + + def trigger_quarantine_aggregation( + self, sink_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/trigger_quarantine_aggregation" + return self._make_request("POST", path, json=payload) + + def get_quarantine_aggregation(self, sink_id: int) -> Dict[str, Any]: + path = f"{self._path}/{sink_id}/quarantine_aggregation" + return self._make_request("GET", path) diff --git a/nexla_sdk/resources/doc_containers.py b/nexla_sdk/resources/doc_containers.py index ff2df5d..c2c94df 100644 --- a/nexla_sdk/resources/doc_containers.py +++ b/nexla_sdk/resources/doc_containers.py @@ -1,16 +1,43 @@ -from typing import List +from typing import Any, Dict, List, Optional from nexla_sdk.models.common import LogEntry +from nexla_sdk.models.doc_containers.responses import DocContainer from nexla_sdk.resources.base_resource import BaseResource class DocContainersResource(BaseResource): - """Resource for document containers accessors and audit logs.""" + """Resource for document containers.""" def __init__(self, client): super().__init__(client) self._path = "/doc_containers" - self._model_class = None + self._model_class = DocContainer + + def list(self, **kwargs) -> List[DocContainer]: + return super().list(**kwargs) + + def get(self, doc_container_id: int, expand: bool = False) -> DocContainer: + return super().get(doc_container_id, expand) + + def create(self, data: Dict[str, Any]) -> DocContainer: + return super().create(data) + + def update(self, doc_container_id: int, data: Dict[str, Any]) -> DocContainer: + return super().update(doc_container_id, data) + + def delete(self, doc_container_id: int) -> Dict[str, Any]: + return super().delete(doc_container_id) + + def copy( + self, doc_container_id: int, payload: Optional[Dict[str, Any]] = None + ) -> DocContainer: + return super().copy(doc_container_id, payload) + + def search(self, filters: Dict[str, Any], **params) -> List[DocContainer]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[DocContainer]: + return super().search_tags(tags, **params) def get_audit_log(self, doc_container_id: int, **params) -> List[LogEntry]: path = f"{self._path}/{doc_container_id}/audit_log" diff --git a/nexla_sdk/resources/flow_nodes.py b/nexla_sdk/resources/flow_nodes.py new file mode 100644 index 0000000..7c19d5a --- /dev/null +++ b/nexla_sdk/resources/flow_nodes.py @@ -0,0 +1,28 @@ +from typing import Any, Dict + +from nexla_sdk.models.common import FlowNode +from nexla_sdk.resources.base_resource import BaseResource + + +class FlowNodesResource(BaseResource): + """Resource for flow nodes.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/flow_nodes" + self._model_class = FlowNode + + def get(self, flow_node_id: int) -> FlowNode: + return super().get(flow_node_id) + + def update(self, flow_node_id: int, data: Dict[str, Any]) -> FlowNode: + return super().update(flow_node_id, data) + + def list_origin_nodes_condensed(self, **params) -> Dict[str, Any]: + return self._make_request("GET", "/flows/all/condensed", params=params) + + def list_flows_minimal(self, **params) -> Dict[str, Any]: + return self._make_request("GET", "/flows/all/minimal", params=params) + + def get_access_insights(self, flow_node_id: int, **params) -> Dict[str, Any]: + return self._make_request("GET", f"/flows/{flow_node_id}/access", params=params) diff --git a/nexla_sdk/resources/flow_triggers.py b/nexla_sdk/resources/flow_triggers.py new file mode 100644 index 0000000..531f624 --- /dev/null +++ b/nexla_sdk/resources/flow_triggers.py @@ -0,0 +1,166 @@ +"""Resource for managing flow triggers.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.flow_triggers.requests import FlowTriggerCreate +from nexla_sdk.models.flow_triggers.responses import FlowTrigger +from nexla_sdk.resources.base_resource import BaseResource + + +class FlowTriggersResource(BaseResource): + """Resource for managing flow triggers (orchestration events). + + Flow triggers define when one flow should trigger based on events + from another flow. They are immutable once created - to change a + trigger, delete and recreate it. + + Examples: + # List flow triggers + triggers = client.flow_triggers.list() + + # List all triggers (super user only) + all_triggers = client.flow_triggers.list_all() + + # Create a trigger: start data source when sink completes + trigger = client.flow_triggers.create(FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + data_sink_id=123, # Triggering sink + data_source_id=456 # Triggered source + )) + + # Pause a trigger + client.flow_triggers.pause(trigger.id) + + # Activate a trigger + client.flow_triggers.activate(trigger.id) + + # Delete a trigger + client.flow_triggers.delete(trigger.id) + """ + + def __init__(self, client): + """Initialize the flow triggers resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/flow_triggers" + self._model_class = FlowTrigger + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + access_role: Optional[str] = None, + **kwargs, + ) -> List[FlowTrigger]: + """List flow triggers accessible by current user. + + Args: + page: Page number (1-based) + per_page: Items per page + access_role: Filter by access role (owner, collaborator, operator, admin) + + Returns: + List of flow triggers + """ + return super().list( + page=page, per_page=per_page, access_role=access_role, **kwargs + ) + + def list_all( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + ) -> List[FlowTrigger]: + """List all flow triggers (super user only). + + Args: + page: Page number (1-based) + per_page: Items per page (max: 100) + + Returns: + List of all flow triggers + + Raises: + AuthorizationError: If user is not a super user + """ + path = f"{self._path}/all" + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def get(self, trigger_id: int, expand: bool = False) -> FlowTrigger: + """Get flow trigger by ID. + + Args: + trigger_id: Flow trigger ID + expand: Include expanded references (where supported) + + Returns: + FlowTrigger instance + """ + return super().get(trigger_id, expand=expand) + + def create(self, data: Union[FlowTriggerCreate, Dict[str, Any]]) -> FlowTrigger: + """Create a new flow trigger. + + Note: Flow triggers are immutable - update is not supported. + To change a trigger, delete and recreate it. + + Args: + data: Flow trigger creation data + + Returns: + Created flow trigger + + Raises: + ValidationError: If trigger would create a cycle or duplicate + """ + return super().create(data) + + def delete(self, trigger_id: int) -> Dict[str, Any]: + """Delete a flow trigger. + + Args: + trigger_id: Flow trigger ID + + Returns: + Response with status + """ + return super().delete(trigger_id) + + def activate(self, trigger_id: int) -> FlowTrigger: + """Activate a flow trigger. + + Args: + trigger_id: Flow trigger ID + + Returns: + Activated flow trigger + """ + return super().activate(trigger_id) + + def pause(self, trigger_id: int) -> FlowTrigger: + """Pause a flow trigger. + + Args: + trigger_id: Flow trigger ID + + Returns: + Paused flow trigger + """ + return super().pause(trigger_id) + + def update(self, resource_id=None, data=None): + """Flow triggers are immutable. To change a trigger, delete and recreate it.""" + raise NotImplementedError( + "Flow triggers are immutable once created. " + "To change a trigger, delete it and create a new one." + ) diff --git a/nexla_sdk/resources/flows.py b/nexla_sdk/resources/flows.py index fe8548c..5b673aa 100644 --- a/nexla_sdk/resources/flows.py +++ b/nexla_sdk/resources/flows.py @@ -4,7 +4,6 @@ from nexla_sdk.models.destinations.requests import DestinationUpdate from nexla_sdk.models.flows.requests import FlowCopyOptions -from nexla_sdk.models.projects.requests import ProjectFlowList from nexla_sdk.models.flows.responses import ( DocsRecommendation, FlowLogsResponse, @@ -12,6 +11,7 @@ FlowResponse, ) from nexla_sdk.models.metrics.enums import ResourceType +from nexla_sdk.models.projects.requests import ProjectFlowList from nexla_sdk.models.sources.requests import SourceUpdate from nexla_sdk.resources.base_resource import BaseResource @@ -375,6 +375,163 @@ def pause_by_resource( response = self._make_request("PUT", path, params=params) return self._parse_response(response) + def update_by_resource( + self, resource_type: str, resource_id: int, payload: Dict[str, Any] + ) -> FlowResponse: + path = f"/{resource_type}/{resource_id}/flow" + response = self._make_request("PUT", path, json=payload) + return self._parse_response(response) + + def copy_by_resource( + self, + resource_type: str, + resource_id: int, + payload: Optional[Dict[str, Any]] = None, + ) -> FlowResponse: + path = f"/{resource_type}/{resource_id}/flow/copy" + response = self._make_request("POST", path, json=payload or {}) + return self._parse_response(response) + + def accessors_by_resource( + self, + resource_type: str, + resource_id: int, + mode: str = "list", + payload: Optional[Dict[str, Any]] = None, + ) -> Dict[str, Any]: + path = f"/{resource_type}/{resource_id}/flow/accessors" + method_map = {"list": "GET", "reset": "POST", "add": "PUT", "remove": "DELETE"} + method = method_map.get(mode, "GET") + return self._make_request(method, path, json=payload or {}) + + def docs_by_resource( + self, + resource_type: str, + resource_id: int, + mode: str = "list", + payload: Optional[List[Dict[str, Any]]] = None, + ) -> Dict[str, Any]: + path = f"/{resource_type}/{resource_id}/flow/docs" + method_map = {"list": "GET", "reset": "POST", "add": "PUT", "remove": "DELETE"} + method = method_map.get(mode, "GET") + return self._make_request(method, path, json=payload or []) + + def run_status_by_resource( + self, resource_type: str, resource_id: int + ) -> Dict[str, Any]: + path = f"/{resource_type}/{resource_id}/flow/run_status" + return self._make_request("GET", path) + + def run_profiles_activate( + self, flow_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/run_profiles/activate" + return self._make_request("POST", path, json=payload) + + def run_now(self, flow_id: int, method: str = "POST") -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/run_now" + return self._make_request(method.upper(), path) + + def flow_logs(self, flow_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/logs" + return self._make_request("GET", path, params=params) + + def flow_logs_v2( + self, flow_id: int, payload: Dict[str, Any], **params + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/logs_v2" + return self._make_request("POST", path, json=payload, params=params) + + def flow_metrics(self, flow_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/metrics" + return self._make_request("GET", path, params=params) + + def list_linked_flows(self, flow_id: int) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/links" + return self._make_request("GET", path) + + def create_linked_flows( + self, flow_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/links" + return self._make_request("POST", path, json=payload) + + def update_linked_flows( + self, flow_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/links" + return self._make_request("PUT", path, json=payload) + + def delete_linked_flows( + self, flow_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/links" + return self._make_request("DELETE", path, json=payload) + + def delete_all_linked_flows(self, flow_id: int) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/links/all" + return self._make_request("DELETE", path) + + def insert_flow_node(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/insert_flow_node" + return self._make_request("POST", path, json=payload) + + def remove_flow_node( + self, flow_id: int, payload: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/remove_flow_node" + return self._make_request("POST", path, json=payload or {}) + + def update_samples(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/samples" + return self._make_request("PUT", path, json=payload) + + def publish_rag(self, flow_id: int) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/rag/publish" + return self._make_request("PUT", path) + + def update_archival_status( + self, flow_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/archival/status" + return self._make_request("POST", path, json=payload) + + def restore_archival(self, flow_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/archival/restore" + return self._make_request("POST", path, json=payload) + + def run_status(self, flow_id: int, run_id: Optional[int] = None) -> Dict[str, Any]: + path = f"{self._path}/{flow_id}/run_status" + if run_id is not None: + path = f"{path}/{run_id}" + return self._make_request("GET", path) + + def search(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/search", json=payload) + + def bulk_assign_project(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("PUT", f"{self._path}/project", json=payload) + + def import_flow(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/import", json=payload) + + def publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/raw", json=payload) + + def daily_metrics(self, **params) -> Dict[str, Any]: + return self._make_request("GET", "/data_flows/metrics/daily", params=params) + + def total_metrics(self, **params) -> Dict[str, Any]: + return self._make_request("GET", "/data_flows/metrics/total", params=params) + + def active_flows_metrics(self, **params) -> Dict[str, Any]: + return self._make_request( + "GET", "/data_flows/metrics/active_flows_metrics", params=params + ) + + def get_resources_access(self, flow_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/{flow_id}/resources_access") + def docs_recommendation( self, flow_id: int ) -> Union[DocsRecommendation, Dict[str, Any]]: @@ -532,9 +689,9 @@ def get_logs( resource_id: int, run_id: int, from_ts: int, - to_ts: int = None, - page: int = None, - per_page: int = None, + to_ts: Optional[int] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, ) -> Union[FlowLogsResponse, Dict[str, Any]]: """Get flow execution logs for a specific run id of a flow. @@ -583,11 +740,11 @@ def get_metrics( resource_type: Union[ResourceType, str], resource_id: int, from_date: str, - to_date: str = None, - groupby: str = None, - orderby: str = None, - page: int = None, - per_page: int = None, + to_date: Optional[str] = None, + groupby: Optional[str] = None, + orderby: Optional[str] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, ) -> Union[FlowMetricsApiResponse, Dict[str, Any]]: """Get flow metrics for a flow node keyed by resource id. diff --git a/nexla_sdk/resources/genai.py b/nexla_sdk/resources/genai.py index 1fd519b..52fd830 100644 --- a/nexla_sdk/resources/genai.py +++ b/nexla_sdk/resources/genai.py @@ -74,11 +74,23 @@ def get_org_setting(self, gen_ai_org_setting_id: int) -> GenAiOrgSetting: ) return GenAiOrgSetting.model_validate(response) + def update_org_setting( + self, gen_ai_org_setting_id: int, payload: GenAiOrgSettingPayload + ) -> GenAiOrgSetting: + data = self._serialize_data(payload) + response = self._make_request( + "PUT", f"/gen_ai_org_settings/{gen_ai_org_setting_id}", json=data + ) + return GenAiOrgSetting.model_validate(response) + def delete_org_setting(self, gen_ai_org_setting_id: int) -> Dict[str, Any]: return self._make_request( "DELETE", f"/gen_ai_org_settings/{gen_ai_org_setting_id}" ) + def delete_org_settings(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("DELETE", "/gen_ai_org_settings", json=payload) + def show_active_config(self, gen_ai_usage: str) -> ActiveConfigView: response = self._make_request( "GET", diff --git a/nexla_sdk/resources/lookups.py b/nexla_sdk/resources/lookups.py index 5c8dad0..7a20303 100644 --- a/nexla_sdk/resources/lookups.py +++ b/nexla_sdk/resources/lookups.py @@ -37,6 +37,13 @@ def list(self, **kwargs) -> List[Lookup]: """ return super().list(**kwargs) + def list_public(self, **params) -> List[Lookup]: + response = self._make_request("GET", f"{self._path}/public", params=params) + return self._parse_response(response) + + def list_accessible(self, **params) -> List[Lookup]: + return super().list_accessible(**params) + def get(self, data_map_id: int, expand: bool = False) -> Lookup: """ Get single lookup by ID. @@ -93,6 +100,21 @@ def delete(self, data_map_id: int) -> Dict[str, Any]: """ return super().delete(data_map_id) + def search(self, filters: Dict[str, Any], **params) -> List[Lookup]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Lookup]: + return super().search_tags(tags, **params) + + def validate(self, data_map_id: int) -> Dict[str, Any]: + path = f"{self._path}/{data_map_id}/validate" + return self._make_request("GET", path) + + def download_map(self, data_map_id: int) -> str: + path = f"{self._path}/{data_map_id}/download_map" + response = self._make_request("GET", path) + return response # plain text response + def upsert_entries( self, data_map_id: int, entries: List[Dict[str, Any]] ) -> List[Dict[str, Any]]: @@ -134,6 +156,12 @@ def get_entries( path = f"/data_maps/{data_map_id}/entries/{keys_str}" return self._make_request("GET", path) + def get_entries_by_body( + self, data_map_id: int, payload: Dict[str, Any] + ) -> List[Dict[str, Any]]: + path = f"{self._path}/{data_map_id}/get_entries" + return self._make_request("POST", path, json=payload) + def delete_entries( self, data_map_id: int, entry_keys: Union[str, List[str]] ) -> Dict[str, Any]: @@ -154,3 +182,13 @@ def delete_entries( path = f"/data_maps/{data_map_id}/entries/{keys_str}" return self._make_request("DELETE", path) + + def delete_entries_by_body( + self, data_map_id: int, entry_keys: List[str] + ) -> Dict[str, Any]: + path = f"{self._path}/{data_map_id}/entries" + return self._make_request("DELETE", path, json=entry_keys) + + def probe_sample(self, data_map_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{data_map_id}/probe/sample" + return self._make_request("POST", path, json=payload) diff --git a/nexla_sdk/resources/marketplace.py b/nexla_sdk/resources/marketplace.py index e1e9465..8cd6210 100644 --- a/nexla_sdk/resources/marketplace.py +++ b/nexla_sdk/resources/marketplace.py @@ -58,6 +58,11 @@ def create_domain(self, data: MarketplaceDomainCreate) -> MarketplaceDomain: def delete_domain(self, domain_id: int) -> Dict[str, Any]: return self._make_request("DELETE", f"{self._path}/domains/{domain_id}") + def get_domain_audit_log(self, domain_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/domains/{domain_id}/audit_log", params=params + ) + # Items def list_domain_items(self, domain_id: int) -> List[MarketplaceDomainsItem]: response = self._make_request("GET", f"{self._path}/domains/{domain_id}/items") @@ -72,6 +77,46 @@ def create_domain_item( ) return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + def get_domain_item(self, domain_id: int, item_id: int) -> MarketplaceDomainsItem: + response = self._make_request( + "GET", f"{self._path}/domains/{domain_id}/items/{item_id}" + ) + return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + + def search_domain_items( + self, domain_id: int, payload: Dict[str, Any] + ) -> List[MarketplaceDomainsItem]: + response = self._make_request( + "POST", f"{self._path}/domains/{domain_id}/items/search", json=payload + ) + return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + + def delist_domain_item(self, domain_id: int, item_id: int) -> Dict[str, Any]: + return self._make_request( + "DELETE", f"{self._path}/domains/{domain_id}/items/{item_id}" + ) + + def request_item_access(self, domain_id: int, item_id: int) -> Dict[str, Any]: + return self._make_request( + "POST", + f"{self._path}/domains/{domain_id}/items/{item_id}/request_access", + ) + + # Global items + def list_items(self) -> List[MarketplaceDomainsItem]: + response = self._make_request("GET", f"{self._path}/items") + return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + + def get_item(self, item_id: int) -> MarketplaceDomainsItem: + response = self._make_request("GET", f"{self._path}/items/{item_id}") + return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + + def search_items(self, payload: Dict[str, Any]) -> List[MarketplaceDomainsItem]: + response = self._make_request( + "POST", f"{self._path}/items/search", json=payload + ) + return self._parse_response(response, MarketplaceDomainsItem) # type: ignore[arg-type] + # Custodians def list_domain_custodians(self, domain_id: int) -> List[CustodianUser]: response = self._make_request( diff --git a/nexla_sdk/resources/metrics.py b/nexla_sdk/resources/metrics.py index 8cb9ceb..58d9bcd 100644 --- a/nexla_sdk/resources/metrics.py +++ b/nexla_sdk/resources/metrics.py @@ -118,6 +118,10 @@ def get_rate_limits(self) -> Dict[str, Any]: path = "/limits" return self._make_request("GET", path) + def publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """Publish raw metrics (super user only).""" + return self._make_request("POST", "/metrics/raw", json=payload) + def get_resource_flow_metrics( self, resource_type: Union[ResourceType, str], @@ -164,11 +168,11 @@ def get_flow_metrics( resource_type: Union[ResourceType, str], resource_id: int, from_date: str, - to_date: str = None, - groupby: str = None, - orderby: str = None, - page: int = None, - per_page: int = None, + to_date: Optional[str] = None, + groupby: Optional[str] = None, + orderby: Optional[str] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, ) -> Union[ResourceFlowMetricsResponse, Dict[str, Any]]: """ Get flow metrics for a flow node keyed by resource ID. @@ -219,9 +223,9 @@ def get_flow_logs( resource_id: int, run_id: int, from_ts: int, - to_ts: int = None, - page: int = None, - per_page: int = None, + to_ts: Optional[int] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, ) -> Union[ResourceFlowLogsResponse, Dict[str, Any]]: """ Get flow logs for a flow run keyed by resource ID. diff --git a/nexla_sdk/resources/nexsets.py b/nexla_sdk/resources/nexsets.py index 735fef0..e763d55 100644 --- a/nexla_sdk/resources/nexsets.py +++ b/nexla_sdk/resources/nexsets.py @@ -1,5 +1,6 @@ from typing import Any, Dict, List, Optional, Union +from nexla_sdk.models.catalog_refs.responses import CatalogRef from nexla_sdk.models.doc_containers import DocContainer, DocContainerInput from nexla_sdk.models.nexsets.requests import ( NexsetCopyOptions, @@ -36,6 +37,56 @@ def list(self, **kwargs) -> List[Nexset]: """ return super().list(**kwargs) + def list_all(self, **params) -> List[Nexset]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def list_all_condensed(self, **params) -> List[Dict[str, Any]]: + return self._make_request("GET", f"{self._path}/all/condensed", params=params) + + def list_all_ids(self, **params) -> List[int]: + return self._make_request("GET", f"{self._path}/all/ids", params=params) + + def list_available(self, **params) -> List[Nexset]: + response = self._make_request("GET", f"{self._path}/available", params=params) + return self._parse_response(response) + + def search_available(self, filters: Dict[str, Any], **params) -> List[Nexset]: + path = f"{self._path}/available/search" + response = self._make_request("POST", path, json=filters, params=params) + return self._parse_response(response) + + def list_shared(self, **params) -> List[Nexset]: + response = self._make_request("GET", f"{self._path}/shared", params=params) + return self._parse_response(response) + + def list_public(self, **params) -> List[Nexset]: + response = self._make_request("GET", f"{self._path}/public", params=params) + return self._parse_response(response) + + def search_public_tags(self, tags: List[str], **params) -> List[Nexset]: + path = f"{self._path}/public/search_tags" + response = self._make_request("POST", path, json=tags, params=params) + return self._parse_response(response) + + def list_characteristics_search(self, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/characteristics/search", params=params + ) + + def list_summary(self, **params) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/summary", params=params) + + def list_nexset_api_compatible(self, **params) -> List[Nexset]: + response = self._make_request( + "GET", f"{self._path}/nexset_api_compatible", params=params + ) + return self._parse_response(response) + + def update_runtime_status(self, set_id: int, status: str) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/runtime_status/{status}" + return self._make_request("PUT", path) + def get(self, set_id: int, expand: bool = False) -> Nexset: """ Get single nexset by ID. @@ -145,6 +196,23 @@ def get_samples( return [NexsetSample(**item) for item in response] return response + def update_samples( + self, set_id: int, samples: Any, replace: bool = False + ) -> List[NexsetSample]: + path = f"{self._path}/{set_id}/samples" + params = {"replace": replace} + response = self._make_request("PUT", path, json=samples, params=params) + if isinstance(response, list): + return [NexsetSample(**item) for item in response] + return response + + def add_samples(self, set_id: int, samples: Any) -> List[NexsetSample]: + path = f"{self._path}/{set_id}/samples" + response = self._make_request("POST", path, json=samples) + if isinstance(response, list): + return [NexsetSample(**item) for item in response] + return response + def copy(self, set_id: int, options: Optional[NexsetCopyOptions] = None) -> Nexset: """ Copy a nexset. @@ -159,6 +227,232 @@ def copy(self, set_id: int, options: Optional[NexsetCopyOptions] = None) -> Nexs data = options.to_dict() if options else {} return super().copy(set_id, data) + def sync_with_catalog(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/sync_with_catalog" + return self._make_request("POST", path) + + def get_flow(self, set_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/{set_id}/flow") + + def get_flow_dashboard(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/flow/dashboard" + return self._make_request("GET", path, params=params) + + def get_flow_status_metrics(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/flow/status_metrics" + return self._make_request("GET", path, params=params) + + def get_flow_metrics(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/flow/metrics" + return self._make_request("GET", path, params=params) + + def get_flow_logs(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/flow/logs" + return self._make_request("GET", path, params=params) + + def get_metrics( + self, set_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + + def catalog_add(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/catalog" + return self._make_request("POST", path, json=payload) + + def semantic_schemas(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/semantic_schemas" + return self._make_request("GET", path, params=params) + + def transform(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/transform" + return self._make_request("POST", path, json=payload) + + def get_quarantine_settings(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine_settings" + return self._make_request("GET", path) + + def create_quarantine_settings( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine_settings" + return self._make_request("POST", path, json=payload) + + def update_quarantine_settings( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine_settings" + return self._make_request("PUT", path, json=payload) + + def delete_quarantine_settings(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine_settings" + return self._make_request("DELETE", path) + + def get_dashboard_transforms(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/dashboard_transforms" + return self._make_request("GET", path) + + def create_dashboard_transforms( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/dashboard_transforms" + return self._make_request("POST", path, json=payload) + + def update_dashboard_transforms( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/dashboard_transforms" + return self._make_request("PUT", path, json=payload) + + def delete_dashboard_transforms(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/dashboard_transforms" + return self._make_request("DELETE", path) + + def list_sharers(self, set_id: int) -> List[Dict[str, Any]]: + path = f"{self._path}/{set_id}/sharers" + return self._make_request("GET", path) or [] + + def set_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]: + path = f"{self._path}/{set_id}/sharers" + return self._make_request("POST", path, json=payload) or [] + + def add_sharers(self, set_id: int, payload: Dict[str, Any]) -> List[Dict[str, Any]]: + path = f"{self._path}/{set_id}/sharers" + return self._make_request("PUT", path, json=payload) or [] + + def remove_sharers( + self, set_id: int, payload: Dict[str, Any] + ) -> List[Dict[str, Any]]: + path = f"{self._path}/{set_id}/sharers" + return self._make_request("DELETE", path, json=payload) or [] + + def mark_shared(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/sharers/shared" + return self._make_request("PUT", path) + + def probe_quarantine_sample( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/probe/quarantine/sample" + return self._make_request("POST", path, json=payload) + + def get_quarantine_offset(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine/offset" + return self._make_request("GET", path) + + def get_offset(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/offset" + return self._make_request("GET", path) + + def get_data_update_time(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/data_update_time" + return self._make_request("GET", path) + + def get_characteristics(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/characteristics" + return self._make_request("GET", path) + + def summary(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/summary" + return self._make_request("GET", path) + + def search(self, filters: Dict[str, Any], **params) -> List[Nexset]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Nexset]: + return super().search_tags(tags, **params) + + def vote(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/vote" + return self._make_request("POST", path, json=payload) + + def unvote(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/unvote" + return self._make_request("DELETE", path) + + def list_catalog_refs(self, **params) -> List[CatalogRef]: + path = f"{self._path}/catalog_refs" + response = self._make_request("GET", path, params=params) + return [CatalogRef.model_validate(item) for item in (response or [])] + + def get_catalog_ref(self, ref_id: int) -> CatalogRef: + path = f"{self._path}/catalog_refs/{ref_id}" + response = self._make_request("GET", path) + return CatalogRef.model_validate(response) + + def create_catalog_ref(self, payload: Dict[str, Any]) -> CatalogRef: + path = f"{self._path}/catalog_refs" + response = self._make_request("POST", path, json=payload) + return CatalogRef.model_validate(response) + + def update_catalog_ref(self, ref_id: int, payload: Dict[str, Any]) -> CatalogRef: + path = f"{self._path}/catalog_refs/{ref_id}" + response = self._make_request("PUT", path, json=payload) + return CatalogRef.model_validate(response) + + def delete_catalog_ref(self, ref_id: int) -> Dict[str, Any]: + path = f"{self._path}/catalog_refs/{ref_id}" + return self._make_request("DELETE", path) + + def bulk_update_catalog_refs(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("PUT", "/catalog_refs/bulk_update_refs", json=payload) + + def list_api_keys(self, set_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys" + return self._make_request("GET", path, params=params) + + def search_api_keys( + self, set_id: int, filters: Dict[str, Any], **params + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/search" + return self._make_request("POST", path, json=filters, params=params) + + def get_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}" + return self._make_request("GET", path) + + def create_api_key(self, set_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys" + return self._make_request("POST", path, json=payload) + + def update_api_key( + self, set_id: int, api_key_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}" + return self._make_request("PUT", path, json=payload) + + def rotate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}/rotate" + return self._make_request("PUT", path) + + def activate_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}/activate" + return self._make_request("PUT", path) + + def pause_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}/pause" + return self._make_request("PUT", path) + + def pause_all_api_keys(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/pause" + return self._make_request("PUT", path) + + def delete_api_key(self, set_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/api_keys/{api_key_id}" + return self._make_request("DELETE", path) + + def trigger_quarantine_aggregation( + self, set_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/trigger_quarantine_aggregation" + return self._make_request("POST", path, json=payload) + + def get_quarantine_aggregation(self, set_id: int) -> Dict[str, Any]: + path = f"{self._path}/{set_id}/quarantine_aggregation" + return self._make_request("GET", path) + def docs_recommendation(self, set_id: int) -> Dict[str, Any]: """Generate AI suggestion for Nexset documentation.""" path = f"{self._path}/{set_id}/docs/recommendation" @@ -234,9 +528,7 @@ def update_docs( """ path = f"{self._path}/{set_id}/docs" serialized = [self._serialize_data(d) for d in docs] - response = self._make_request( - "POST", path, json={"docs": serialized} - ) + response = self._make_request("POST", path, json={"docs": serialized}) if isinstance(response, list): return [DocContainer.model_validate(item) for item in response] return [] @@ -273,9 +565,7 @@ def copy_docs(self, src_id: int, dst_id: int) -> List[DocContainer]: if not source_docs: return [] payload = [ - DocContainerInput.model_validate( - doc.model_dump(exclude_none=True) - ) + DocContainerInput.model_validate(doc.model_dump(exclude_none=True)) for doc in source_docs ] return self.update_docs(dst_id, payload) diff --git a/nexla_sdk/resources/notification_channel_settings.py b/nexla_sdk/resources/notification_channel_settings.py new file mode 100644 index 0000000..e5abe76 --- /dev/null +++ b/nexla_sdk/resources/notification_channel_settings.py @@ -0,0 +1,40 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.notification_channel_settings.requests import ( + NotificationChannelSettingCreate, + NotificationChannelSettingUpdate, +) +from nexla_sdk.models.notification_channel_settings.responses import ( + NotificationChannelSetting, +) +from nexla_sdk.resources.base_resource import BaseResource + + +class NotificationChannelSettingsResource(BaseResource): + """Resource for managing notification channel settings.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/notification_channel_settings" + self._model_class = NotificationChannelSetting + + def list(self, **kwargs) -> List[NotificationChannelSetting]: + return super().list(**kwargs) + + def get(self, setting_id: int) -> NotificationChannelSetting: + return super().get(setting_id) + + def create( + self, data: Union[NotificationChannelSettingCreate, Dict[str, Any]] + ) -> NotificationChannelSetting: + return super().create(data) + + def update( + self, + setting_id: int, + data: Union[NotificationChannelSettingUpdate, Dict[str, Any]], + ) -> NotificationChannelSetting: + return super().update(setting_id, data) + + def delete(self, setting_id: int) -> Dict[str, Any]: + return super().delete(setting_id) diff --git a/nexla_sdk/resources/notification_settings.py b/nexla_sdk/resources/notification_settings.py new file mode 100644 index 0000000..723a2ff --- /dev/null +++ b/nexla_sdk/resources/notification_settings.py @@ -0,0 +1,337 @@ +"""Resource for managing notification settings.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.notification_settings.requests import ( + NotificationSettingCreate, + NotificationSettingUpdate, +) +from nexla_sdk.models.notification_settings.responses import NotificationSetting +from nexla_sdk.resources.base_resource import BaseResource + + +class NotificationSettingsResource(BaseResource): + """Resource for managing notification settings. + + Notification settings control how and when users receive notifications + for different events and resources. + + Examples: + # List notification settings + settings = client.notification_settings.list() + + # Get a specific setting + setting = client.notification_settings.get(123) + + # Create a new notification setting + setting = client.notification_settings.create(NotificationSettingCreate( + notification_type_id=1, + channel="email", + priority=5 + )) + + # Update a setting + setting = client.notification_settings.update(123, NotificationSettingUpdate( + priority=10 + )) + """ + + def __init__(self, client): + """Initialize the notification settings resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/notification_settings" + self._model_class = NotificationSetting + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + notification_resource_type: Optional[str] = None, + resource_id: Optional[int] = None, + sort_by: Optional[str] = None, + sort_order: Optional[str] = None, + **kwargs, + ) -> List[NotificationSetting]: + """List notification settings for the current user. + + Args: + page: Page number (1-based) + per_page: Items per page + notification_resource_type: Filter by resource type + resource_id: Filter by resource ID + sort_by: Sort field (default: priority) + sort_order: Sort order (ASC or DESC) + **kwargs: Additional query parameters + + Returns: + List of notification settings + """ + params = kwargs.copy() + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + if notification_resource_type is not None: + params["notification_resource_type"] = notification_resource_type + if resource_id is not None: + params["resource_id"] = resource_id + if sort_by is not None: + params["sort_by"] = sort_by + if sort_order is not None: + params["sort_order"] = sort_order + + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def list_all( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + resource_type: Optional[str] = None, + event_type: Optional[str] = None, + status: Optional[str] = None, + ) -> List[NotificationSetting]: + """List all notification settings (super user only). + + Args: + page: Page number (1-based) + per_page: Items per page + resource_type: Filter by resource type + event_type: Filter by event type + status: Filter by status + + Returns: + List of all notification settings + """ + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + if resource_type is not None: + params["resource_type"] = resource_type + if event_type is not None: + params["event_type"] = event_type + if status is not None: + params["status"] = status + + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def get(self, setting_id: int, expand: bool = False) -> NotificationSetting: + """Get notification setting by ID. + + Args: + setting_id: Notification setting ID + expand: Include expanded details + + Returns: + Notification setting instance + """ + return super().get(setting_id, expand=expand) + + def create( + self, data: Union[NotificationSettingCreate, Dict[str, Any]] + ) -> NotificationSetting: + """Create a new notification setting. + + Args: + data: Notification setting creation data + + Returns: + Created notification setting + """ + return super().create(data) + + def update( + self, + setting_id: int, + data: Union[NotificationSettingUpdate, Dict[str, Any]], + ) -> NotificationSetting: + """Update a notification setting. + + Args: + setting_id: Notification setting ID + data: Updated notification setting data + + Returns: + Updated notification setting + """ + return super().update(setting_id, data) + + def delete(self, setting_id: int) -> Dict[str, Any]: + """Delete a notification setting. + + Args: + setting_id: Notification setting ID + + Returns: + Response with status + """ + return super().delete(setting_id) + + def show_resource_settings( + self, + resource_type: str, + resource_id: int, + notification_type_id: Optional[int] = None, + page: Optional[int] = None, + per_page: Optional[int] = None, + filter_overridden_settings: bool = False, + ) -> List[NotificationSetting]: + """Get notification settings for a specific resource. + + Args: + resource_type: Resource type (data_sources, data_sets, data_sinks) + resource_id: Resource ID + notification_type_id: Optional notification type ID to filter + page: Page number (1-based) + per_page: Items per page + filter_overridden_settings: Filter overridden settings + + Returns: + List of notification settings for the resource + """ + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + if notification_type_id is not None: + params["notification_type_id"] = notification_type_id + if filter_overridden_settings: + params["filter_overridden_settings"] = "true" + + path = f"/notification_settings/{resource_type}/{resource_id}" + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def show_type_settings( + self, + notification_type_id: int, + page: Optional[int] = None, + per_page: Optional[int] = None, + sort_by: Optional[str] = None, + sort_order: Optional[str] = None, + ) -> List[NotificationSetting]: + """Get notification settings for a specific notification type. + + Args: + notification_type_id: Notification type ID + page: Page number (1-based) + per_page: Items per page + sort_by: Sort field (default: priority) + sort_order: Sort order (ASC or DESC) + + Returns: + List of notification settings for the type + """ + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + if sort_by is not None: + params["sort_by"] = sort_by + if sort_order is not None: + params["sort_order"] = sort_order + + path = f"/notification_settings/notification_types/{notification_type_id}" + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def list_by( + self, payload: Dict[str, Any], method: str = "POST" + ) -> List[NotificationSetting]: + path = "/notification_setting/list" + response = self._make_request(method.upper(), path, json=payload) + return self._parse_response(response) + + def org_index( + self, + org_id: int, + page: Optional[int] = None, + per_page: Optional[int] = None, + sort_by: Optional[str] = None, + sort_order: Optional[str] = None, + ) -> List[NotificationSetting]: + """List notification settings for an organization. + + Args: + org_id: Organization ID + page: Page number (1-based) + per_page: Items per page + sort_by: Sort field (default: priority) + sort_order: Sort order (ASC or DESC) + + Returns: + List of organization notification settings + """ + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + if sort_by is not None: + params["sort_by"] = sort_by + if sort_order is not None: + params["sort_order"] = sort_order + + path = f"/orgs/{org_id}/notification_settings" + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def org_create( + self, org_id: int, data: Union[NotificationSettingCreate, Dict[str, Any]] + ) -> NotificationSetting: + """Create a notification setting for an organization. + + Args: + org_id: Organization ID + data: Notification setting creation data + + Returns: + Created notification setting + """ + serialized_data = self._serialize_data(data) + path = f"/orgs/{org_id}/notification_settings" + response = self._make_request("POST", path, json=serialized_data) + return self._parse_response(response) + + def org_update( + self, + org_id: int, + notification_settings_id: int, + data: Union[NotificationSettingUpdate, Dict[str, Any]], + ) -> NotificationSetting: + """Update an organization notification setting. + + Args: + org_id: Organization ID + notification_settings_id: Notification setting ID + data: Updated notification setting data + + Returns: + Updated notification setting + """ + serialized_data = self._serialize_data(data) + path = f"/orgs/{org_id}/notification_settings/{notification_settings_id}" + response = self._make_request("PUT", path, json=serialized_data) + return self._parse_response(response) + + def org_delete(self, org_id: int, notification_settings_id: int) -> Dict[str, Any]: + """Delete an organization notification setting. + + Args: + org_id: Organization ID + notification_settings_id: Notification setting ID + + Returns: + Response with status + """ + path = f"/orgs/{org_id}/notification_settings/{notification_settings_id}" + return self._make_request("DELETE", path) diff --git a/nexla_sdk/resources/notification_types.py b/nexla_sdk/resources/notification_types.py new file mode 100644 index 0000000..f9a19a7 --- /dev/null +++ b/nexla_sdk/resources/notification_types.py @@ -0,0 +1,21 @@ +from typing import List + +from nexla_sdk.models.notification_types.responses import NotificationType +from nexla_sdk.resources.base_resource import BaseResource + + +class NotificationTypesResource(BaseResource): + """Resource for listing notification types.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/notification_types" + self._model_class = NotificationType + + def list(self) -> List[NotificationType]: + response = self._make_request("GET", self._path) + return self._parse_response(response) + + def list_all(self) -> List[NotificationType]: + response = self._make_request("GET", f"{self._path}/list") + return self._parse_response(response) diff --git a/nexla_sdk/resources/notifications.py b/nexla_sdk/resources/notifications.py index 9430aee..beb68db 100644 --- a/nexla_sdk/resources/notifications.py +++ b/nexla_sdk/resources/notifications.py @@ -53,6 +53,8 @@ def list( self, read: Optional[int] = None, level: Optional[str] = None, + resource_id: Optional[int] = None, + resource_type: Optional[str] = None, from_timestamp: Optional[int] = None, to_timestamp: Optional[int] = None, **kwargs, @@ -80,6 +82,10 @@ def list( params["read"] = read if level: params["level"] = level + if resource_id is not None: + params["resource_id"] = resource_id + if resource_type is not None: + params["resource_type"] = resource_type if from_timestamp: params["from"] = from_timestamp if to_timestamp: @@ -87,7 +93,9 @@ def list( return super().list(**params) - def delete_all(self) -> Dict[str, Any]: + def delete_all( + self, payload: Optional[Dict[str, Any]] = None, async_mode: bool = False + ) -> Dict[str, Any]: """ Delete all notifications. @@ -95,7 +103,10 @@ def delete_all(self) -> Dict[str, Any]: Response status """ path = f"{self._path}/all" - return self._make_request("DELETE", path) + params = {"async": 1} if async_mode else None + return self._make_request( + "DELETE", path, json=payload or {}, params=params or {} + ) def get_count(self, read: Optional[int] = None) -> NotificationCount: """ @@ -148,6 +159,21 @@ def mark_unread(self, notification_ids: Union[List[int], str]) -> Dict[str, Any] else: return self._make_request("PUT", path, json=notification_ids) + def mark_read_for( + self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{notification_id}/mark_read" + return self._make_request("PUT", path, json=payload or {}) + + def mark_unread_for( + self, notification_id: Union[int, str], payload: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{notification_id}/mark_unread" + return self._make_request("PUT", path, json=payload or {}) + + def publish_raw(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/raw", json=payload) + # Notification Types def get_types(self, status: Optional[str] = None) -> List[NotificationType]: """ diff --git a/nexla_sdk/resources/org_auth_configs.py b/nexla_sdk/resources/org_auth_configs.py index 31fa650..dbd25b6 100644 --- a/nexla_sdk/resources/org_auth_configs.py +++ b/nexla_sdk/resources/org_auth_configs.py @@ -23,6 +23,18 @@ def list_all(self) -> List[AuthConfig]: response = self._make_request("GET", f"{self._path}/all") return self._parse_response(response) + def list_sign_on_options(self) -> Dict[str, Any]: + """List sign-on options (public).""" + return self._make_request("GET", "/sign_on_options") + + def client_config(self) -> Dict[str, Any]: + """Get client config for API auth.""" + return self._make_request("GET", f"{self._path}/client_config") + + def info(self) -> Dict[str, Any]: + """Get API auth info.""" + return self._make_request("GET", f"{self._path}/info") + def get(self, auth_config_id: int) -> AuthConfig: """Get a specific authentication configuration by ID.""" response = self._make_request("GET", f"{self._path}/{auth_config_id}") diff --git a/nexla_sdk/resources/org_tiers.py b/nexla_sdk/resources/org_tiers.py new file mode 100644 index 0000000..34a21a5 --- /dev/null +++ b/nexla_sdk/resources/org_tiers.py @@ -0,0 +1,28 @@ +from typing import Any, Dict, List + +from nexla_sdk.models.org_tiers.responses import OrgTier +from nexla_sdk.resources.base_resource import BaseResource + + +class OrgTiersResource(BaseResource): + """Resource for organization tiers.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/org_tiers" + self._model_class = OrgTier + + def list(self, **kwargs) -> List[OrgTier]: + return super().list(**kwargs) + + def get(self, org_tier_id: int) -> OrgTier: + return super().get(org_tier_id) + + def create(self, data: Dict[str, Any]) -> OrgTier: + return super().create(data) + + def update(self, org_tier_id: int, data: Dict[str, Any]) -> OrgTier: + return super().update(org_tier_id, data) + + def delete(self, org_tier_id: int) -> Dict[str, Any]: + return super().delete(org_tier_id) diff --git a/nexla_sdk/resources/organizations.py b/nexla_sdk/resources/organizations.py index 0a8e6ce..7579a64 100644 --- a/nexla_sdk/resources/organizations.py +++ b/nexla_sdk/resources/organizations.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Union +from typing import Any, Dict, List, Optional, Union from nexla_sdk.models.common import LogEntry from nexla_sdk.models.metrics.enums import ResourceType @@ -45,6 +45,10 @@ def list(self, **kwargs) -> List[Organization]: """ return super().list(**kwargs) + def list_all(self, **params) -> List[Organization]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + def get(self, org_id: int, expand: bool = False) -> Organization: """ Get single organization by ID. @@ -95,6 +99,19 @@ def delete(self, org_id: int) -> Dict[str, Any]: """ return super().delete(org_id) + def get_login_history(self, org_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{org_id}/login_history" + response = self._make_request("GET", path, params=params) + return response or [] + + def get_metrics( + self, org_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + def get_members(self, org_id: int) -> List[OrgMember]: """ Get all members in organization. @@ -212,6 +229,93 @@ def get_current_account_summary(self) -> AccountSummary: response = self._make_request("GET", path) return AccountSummary.model_validate(response) + def get_account_rate_limited(self, org_id: int) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/account_rate_limited" + return self._make_request("GET", path) + + def activate_rate_limited_sources( + self, org_id: int, status: Optional[str] = None, activate: bool = True + ) -> Dict[str, Any]: + action = "source_activate" if activate else "source_pause" + path = f"{self._path}/{org_id}/{action}" + if status: + path = f"{path}/{status}" + return self._make_request("PUT", path) + + def activate_org(self, org_id: int, activate: bool = True) -> Dict[str, Any]: + path = ( + f"{self._path}/{org_id}/activate" + if activate + else f"{self._path}/{org_id}/deactivate" + ) + return self._make_request("PUT", path) + + def set_rate_limits(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/rate_limits" + return self._make_request("PUT", path, json=payload) + + def throttle(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/throttle" + return self._make_request("PUT", path, json=payload) + + def get_flows_report(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/flows_report" + return self._make_request("GET", path, params=params) + + def get_clusters(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/clusters" + return self._make_request("GET", path, params=params) + + def update_cluster(self, org_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/cluster" + return self._make_request("PUT", path, json=payload) + + def activate_cluster(self, org_id: int) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/cluster/activate" + return self._make_request("PUT", path) + + def revert_cluster(self, org_id: int) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/cluster/revert" + return self._make_request("PUT", path) + + def list_notification_settings(self, org_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{org_id}/notification_settings" + return self._make_request("GET", path, params=params) or [] + + def create_notification_settings( + self, org_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/notification_settings" + return self._make_request("POST", path, json=payload) + + def update_notification_settings( + self, org_id: int, notification_settings_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/notification_settings/{notification_settings_id}" + return self._make_request("PUT", path, json=payload) + + def delete_notification_settings( + self, org_id: int, notification_settings_id: int + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/notification_settings/{notification_settings_id}" + return self._make_request("DELETE", path) + + def list_data_sets_catalog_configs(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/data_sets_catalog_configs" + return self._make_request("GET", path, params=params) + + def get_data_sets_catalog_config(self, config_id: int) -> Dict[str, Any]: + path = f"{self._path}/data_sets_catalog_configs/{config_id}" + return self._make_request("GET", path) + + def enable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/features/{feature_name}/enable" + return self._make_request("PUT", path) + + def disable_feature(self, org_id: int, feature_name: str) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/features/{feature_name}/disable" + return self._make_request("PUT", path) + def get_org_flow_account_metrics( self, org_id: int, from_date: str, to_date: str = None, aggregate: str = None ) -> Dict[str, Any]: @@ -224,6 +328,38 @@ def get_org_flow_account_metrics( params["aggregate"] = aggregate return self._make_request("GET", path, params=params) + def get_dashboard_transforms(self, org_id: int) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/dashboard_transforms" + return self._make_request("GET", path) + + def create_dashboard_transforms( + self, org_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/dashboard_transforms" + return self._make_request("POST", path, json=payload) + + def update_dashboard_transforms( + self, org_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/dashboard_transforms" + return self._make_request("PUT", path, json=payload) + + def delete_dashboard_transforms(self, org_id: int) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/dashboard_transforms" + return self._make_request("DELETE", path) + + def get_flows_dashboard(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/flows/dashboard" + return self._make_request("GET", path, params=params) + + def get_flows_status_metrics(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/flows/status_metrics" + return self._make_request("GET", path, params=params) + + def get_flows_account_metrics(self, org_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{org_id}/flows/account_metrics" + return self._make_request("GET", path, params=params) + def get_audit_log( self, org_id: int, diff --git a/nexla_sdk/resources/projects.py b/nexla_sdk/resources/projects.py index 1961f66..85ed2ae 100644 --- a/nexla_sdk/resources/projects.py +++ b/nexla_sdk/resources/projects.py @@ -96,6 +96,20 @@ def delete(self, project_id: int) -> Dict[str, Any]: """ return super().delete(project_id) + def copy( + self, project_id: int, payload: Optional[Dict[str, Any]] = None + ) -> Project: + return super().copy(project_id, payload) + + def search(self, filters: Dict[str, Any], **params) -> List[Project]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Project]: + return super().search_tags(tags, **params) + + def get_resources_access(self, project_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/{project_id}/resources_access") + def get_flows(self, project_id: int) -> FlowResponse: """ Get flows in project. @@ -108,7 +122,7 @@ def get_flows(self, project_id: int) -> FlowResponse: """ path = f"{self._path}/{project_id}/flows" response = self._make_request("GET", path) - return FlowResponse(**response) + return FlowResponse.model_validate(response) def add_flows( self, project_id: int, flows: ProjectFlowList @@ -177,6 +191,17 @@ def add_data_flows( """ return self.add_flows(project_id, flows) + def get_data_flows_legacy(self, project_id: int) -> List[ProjectDataFlow]: + """ + Legacy project flow listing endpoint. + + This calls '/projects/{id}/data_flows', which the backend still supports + for backward compatibility. + """ + path = f"{self._path}/{project_id}/data_flows" + response = self._make_request("GET", path) + return [ProjectDataFlow.model_validate(item) for item in response] + def replace_data_flows( self, project_id: int, flows: ProjectFlowList ) -> List[ProjectDataFlow]: @@ -187,6 +212,24 @@ def replace_data_flows( """ return self.replace_flows(project_id, flows) + def add_data_flows_legacy( + self, project_id: int, flows: ProjectFlowList + ) -> List[ProjectDataFlow]: + """Legacy add endpoint: '/projects/{id}/data_flows'.""" + path = f"{self._path}/{project_id}/data_flows" + payload = self._serialize_data(flows) + response = self._make_request("PUT", path, json=payload) + return [ProjectDataFlow.model_validate(item) for item in response] + + def replace_data_flows_legacy( + self, project_id: int, flows: ProjectFlowList + ) -> List[ProjectDataFlow]: + """Legacy replace endpoint: '/projects/{id}/data_flows'.""" + path = f"{self._path}/{project_id}/data_flows" + payload = self._serialize_data(flows) + response = self._make_request("POST", path, json=payload) + return [ProjectDataFlow.model_validate(item) for item in response] + def remove_data_flows( self, project_id: int, flows: Optional[ProjectFlowList] = None ) -> List[ProjectDataFlow]: @@ -197,6 +240,15 @@ def remove_data_flows( """ return self.remove_flows(project_id, flows) + def remove_data_flows_legacy( + self, project_id: int, flows: Optional[ProjectFlowList] = None + ) -> List[ProjectDataFlow]: + """Legacy remove endpoint: '/projects/{id}/data_flows'.""" + path = f"{self._path}/{project_id}/data_flows" + data = self._serialize_data(flows) if flows else None + response = self._make_request("DELETE", path, json=data) + return [ProjectDataFlow.model_validate(item) for item in response] + def search_flows( self, project_id: int, filters: List[Dict[str, Any]] ) -> FlowResponse: @@ -213,4 +265,4 @@ def search_flows( path = f"{self._path}/{project_id}/flows/search" payload = {"filters": filters} response = self._make_request("POST", path, json=payload) - return FlowResponse(**response) + return FlowResponse.model_validate(response) diff --git a/nexla_sdk/resources/quarantine_settings.py b/nexla_sdk/resources/quarantine_settings.py new file mode 100644 index 0000000..5fa20c9 --- /dev/null +++ b/nexla_sdk/resources/quarantine_settings.py @@ -0,0 +1,23 @@ +from typing import List + +from nexla_sdk.models.quarantine_settings.responses import QuarantineSetting +from nexla_sdk.resources.base_resource import BaseResource + + +class QuarantineSettingsResource(BaseResource): + """Resource for listing quarantine settings (global endpoints).""" + + def __init__(self, client): + super().__init__(client) + self._path = "/quarantine_settings" + self._model_class = QuarantineSetting + + def list(self, **kwargs) -> List[QuarantineSetting]: + return super().list(**kwargs) + + def get(self, quarantine_setting_id: int) -> QuarantineSetting: + return super().get(quarantine_setting_id) + + def list_all(self, **params) -> List[QuarantineSetting]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) diff --git a/nexla_sdk/resources/resource_parameters.py b/nexla_sdk/resources/resource_parameters.py new file mode 100644 index 0000000..b91c7c8 --- /dev/null +++ b/nexla_sdk/resources/resource_parameters.py @@ -0,0 +1,38 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.resource_parameters.requests import ( + ResourceParameterCreate, + ResourceParameterUpdate, +) +from nexla_sdk.models.resource_parameters.responses import ResourceParameter +from nexla_sdk.resources.base_resource import BaseResource + + +class ResourceParametersResource(BaseResource): + """Resource for managing resource parameters.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/resource_parameters" + self._model_class = ResourceParameter + + def list(self, **kwargs) -> List[ResourceParameter]: + return super().list(**kwargs) + + def get(self, resource_parameter_id: int) -> ResourceParameter: + return super().get(resource_parameter_id) + + def create( + self, data: Union[ResourceParameterCreate, Dict[str, Any]] + ) -> ResourceParameter: + return super().create(data) + + def update( + self, + resource_parameter_id: int, + data: Union[ResourceParameterUpdate, Dict[str, Any]], + ) -> ResourceParameter: + return super().update(resource_parameter_id, data) + + def delete(self, resource_parameter_id: int) -> Dict[str, Any]: + return super().delete(resource_parameter_id) diff --git a/nexla_sdk/resources/search_health.py b/nexla_sdk/resources/search_health.py new file mode 100644 index 0000000..fb0ba37 --- /dev/null +++ b/nexla_sdk/resources/search_health.py @@ -0,0 +1,18 @@ +from typing import Any, Dict + +from nexla_sdk.resources.base_resource import BaseResource + + +class SearchHealthResource(BaseResource): + """Resource for search health endpoints.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/search_health" + self._model_class = None + + def get(self) -> Dict[str, Any]: + return self._make_request("GET", self._path) + + def test(self) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/test") diff --git a/nexla_sdk/resources/self_signup.py b/nexla_sdk/resources/self_signup.py index b5fd778..e632ed3 100644 --- a/nexla_sdk/resources/self_signup.py +++ b/nexla_sdk/resources/self_signup.py @@ -27,8 +27,9 @@ def list_requests(self) -> List[SelfSignupRequest]: return [SelfSignupRequest.model_validate(item) for item in (response or [])] def approve_request(self, request_id: str) -> SelfSignupRequest: + # Backend routes use POST; OpenAPI may advertise PUT in some versions. response = self._make_request( - "PUT", f"/self_signup_requests/{request_id}/approve" + "POST", f"/self_signup_requests/{request_id}/approve" ) return SelfSignupRequest.model_validate(response) diff --git a/nexla_sdk/resources/self_signup_blocked_domains.py b/nexla_sdk/resources/self_signup_blocked_domains.py new file mode 100644 index 0000000..1c79c7e --- /dev/null +++ b/nexla_sdk/resources/self_signup_blocked_domains.py @@ -0,0 +1,24 @@ +from typing import Any, Dict, List + +from nexla_sdk.resources.base_resource import BaseResource + + +class SelfSignupBlockedDomainsResource(BaseResource): + """Resource for self-signup blocked domains.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/self_signup_blocked_domains" + self._model_class = None + + def list(self, **kwargs) -> List[Dict[str, Any]]: + return self._make_request("GET", self._path, params=kwargs) or [] + + def create(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", self._path, json=payload) + + def update(self, domain_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("PUT", f"{self._path}/{domain_id}", json=payload) + + def delete(self, domain_id: int) -> Dict[str, Any]: + return self._make_request("DELETE", f"{self._path}/{domain_id}") diff --git a/nexla_sdk/resources/service_keys.py b/nexla_sdk/resources/service_keys.py new file mode 100644 index 0000000..f9ef076 --- /dev/null +++ b/nexla_sdk/resources/service_keys.py @@ -0,0 +1,177 @@ +"""Resource for managing service keys.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.service_keys.requests import ServiceKeyCreate, ServiceKeyUpdate +from nexla_sdk.models.service_keys.responses import ServiceKey +from nexla_sdk.resources.base_resource import BaseResource + + +class ServiceKeysResource(BaseResource): + """Resource for managing service keys. + + Service keys are long-lived credentials for programmatic API access. + Unlike session tokens, service keys don't expire but can be rotated + and have lifecycle management (activate/pause). + + Examples: + # List service keys + keys = client.service_keys.list() + + # List all keys in org (admin only) + all_keys = client.service_keys.list(all_keys=True) + + # Create a service key + key = client.service_keys.create(ServiceKeyCreate( + name="My Service Key", + description="For automated pipelines" + )) + + # Rotate a key + rotated_key = client.service_keys.rotate(key.id) + + # Pause a key + client.service_keys.pause(key.id) + """ + + def __init__(self, client): + """Initialize the service keys resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/service_keys" + self._model_class = ServiceKey + + def list( + self, + access_role: Optional[str] = None, + all_keys: bool = False, + page: Optional[int] = None, + per_page: Optional[int] = None, + **kwargs, + ) -> List[ServiceKey]: + """List service keys. + + Args: + access_role: Filter by access role + all_keys: If True and user has admin access, list all keys in org. + Super users can see all keys across orgs. + page: Page number (1-based) + per_page: Items per page + + Returns: + List of service keys + """ + params = kwargs.copy() + if access_role is not None: + params["access_role"] = access_role + if all_keys: + params["all"] = True + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def get(self, key_id: Union[int, str]) -> ServiceKey: + """Get service key by ID or key value. + + Args: + key_id: Service key ID (int) or the api_key string itself + + Returns: + ServiceKey instance + """ + path = f"{self._path}/{key_id}" + response = self._make_request("GET", path) + return self._parse_response(response) + + def create(self, data: Union[ServiceKeyCreate, Dict[str, Any]]) -> ServiceKey: + """Create a new service key. + + Args: + data: Service key creation data (name and description required) + + Returns: + Created service key with the api_key value + """ + return super().create(data) + + def update( + self, key_id: Union[int, str], data: Union[ServiceKeyUpdate, Dict[str, Any]] + ) -> ServiceKey: + """Update a service key. + + Args: + key_id: Service key ID or api_key string + data: Updated service key data + + Returns: + Updated service key + """ + path = f"{self._path}/{key_id}" + serialized_data = self._serialize_data(data) + response = self._make_request("PUT", path, json=serialized_data) + return self._parse_response(response) + + def delete(self, key_id: Union[int, str]) -> Dict[str, Any]: + """Delete a service key. + + Note: Cannot delete a service key that is associated with an active + data source/flow. Returns 405 Method Not Allowed in that case. + + Args: + key_id: Service key ID or api_key string + + Returns: + Response with status + """ + path = f"{self._path}/{key_id}" + return self._make_request("DELETE", path) + + def rotate(self, key_id: Union[int, str]) -> ServiceKey: + """Rotate a service key to generate a new key value. + + The old key becomes invalid immediately. The previous key value + is stored in `last_rotated_key` for reference. + + Args: + key_id: Service key ID or api_key string + + Returns: + Service key with the new api_key value + """ + path = f"{self._path}/{key_id}/rotate" + response = self._make_request("PUT", path) + return self._parse_response(response) + + def activate(self, key_id: Union[int, str]) -> ServiceKey: + """Activate a paused service key. + + Args: + key_id: Service key ID or api_key string + + Returns: + Activated service key + """ + path = f"{self._path}/{key_id}/activate" + response = self._make_request("PUT", path) + return self._parse_response(response) + + def pause(self, key_id: Union[int, str]) -> ServiceKey: + """Pause a service key (temporarily disable). + + A paused key cannot be used for authentication until reactivated. + + Args: + key_id: Service key ID or api_key string + + Returns: + Paused service key + """ + path = f"{self._path}/{key_id}/pause" + response = self._make_request("PUT", path) + return self._parse_response(response) diff --git a/nexla_sdk/resources/sources.py b/nexla_sdk/resources/sources.py index bf4f8ea..a108a44 100644 --- a/nexla_sdk/resources/sources.py +++ b/nexla_sdk/resources/sources.py @@ -39,6 +39,32 @@ def list(self, **kwargs) -> List[Source]: """ return super().list(**kwargs) + def search(self, filters: Dict[str, Any], **params) -> List[Source]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Source]: + return super().search_tags(tags, **params) + + def list_all(self, **params) -> List[Source]: + response = self._make_request("GET", f"{self._path}/all", params=params) + return self._parse_response(response) + + def list_all_condensed(self, **params) -> List[Dict[str, Any]]: + return self._make_request("GET", f"{self._path}/all/condensed", params=params) + + def list_all_ids(self, **params) -> List[int]: + return self._make_request("GET", f"{self._path}/all/ids", params=params) + + def list_accessible(self, **params) -> List[Source]: + return super().list_accessible(**params) + + def script_source_config(self) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/script_source_config") + + def update_runtime_status(self, source_id: int, status: str) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/runtime_status/{status}" + return self._make_request("PUT", path) + def get(self, source_id: int, expand: bool = False) -> Source: """ Get single source by ID. @@ -95,6 +121,53 @@ def delete(self, source_id: int) -> Dict[str, Any]: """ return super().delete(source_id) + def get_flow(self, source_id: int) -> Dict[str, Any]: + return self._make_request("GET", f"{self._path}/{source_id}/flow") + + def get_flow_dashboard(self, source_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{source_id}/flow/dashboard", params=params + ) + + def get_flow_status_metrics(self, source_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{source_id}/flow/status_metrics", params=params + ) + + def get_flow_metrics(self, source_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{source_id}/flow/metrics", params=params + ) + + def get_flow_logs(self, source_id: int, **params) -> Dict[str, Any]: + return self._make_request( + "GET", f"{self._path}/{source_id}/flow/logs", params=params + ) + + def get_metrics( + self, source_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + + def get_quarantine_offset( + self, source_id: int, data_set_id: Optional[int] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine/offset" + if data_set_id: + path = f"{path}/{data_set_id}" + return self._make_request("GET", path) + + def get_offset( + self, source_id: int, data_set_id: Optional[int] = None + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/offset" + if data_set_id: + path = f"{path}/{data_set_id}" + return self._make_request("GET", path) + def activate(self, source_id: int) -> Source: """ Activate source. @@ -134,3 +207,192 @@ def copy( """ data = options.to_dict() if options else {} return super().copy(source_id, data) + + def probe_list_buckets(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe" + return self._make_request("GET", path) + + def probe_summary(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/summary" + return self._make_request("GET", path) + + def probe_authenticate(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/authenticate" + return self._make_request("GET", path) + + def probe_list_files( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/buckets" + return self._make_request("POST", path, json=payload) + + def probe_tree(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/tree" + return self._make_request("POST", path, json=payload) + + def probe_read_file( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/files" + return self._make_request("POST", path, json=payload) + + def probe_detect_schemas( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/schemas" + return self._make_request("POST", path, json=payload) + + def probe_quarantine_sample( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/quarantine/sample" + return self._make_request("POST", path, json=payload) + + def probe_sample(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/probe/sample" + return self._make_request("POST", path, json=payload) + + def get_reingested_files(self, source_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/file/ingest" + return self._make_request("GET", path, params=params) + + def reingest_files(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/file/ingest" + return self._make_request("POST", path, json=payload) + + def get_quarantine_settings(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine_settings" + return self._make_request("GET", path) + + def create_quarantine_settings( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine_settings" + return self._make_request("POST", path, json=payload) + + def update_quarantine_settings( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine_settings" + return self._make_request("PUT", path, json=payload) + + def delete_quarantine_settings(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine_settings" + return self._make_request("DELETE", path) + + def get_dashboard_transforms(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/dashboard_transforms" + return self._make_request("GET", path) + + def create_dashboard_transforms( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/dashboard_transforms" + return self._make_request("POST", path, json=payload) + + def update_dashboard_transforms( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/dashboard_transforms" + return self._make_request("PUT", path, json=payload) + + def delete_dashboard_transforms(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/dashboard_transforms" + return self._make_request("DELETE", path) + + def validate_config(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/config/validate", json=payload) + + def test_config(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", f"{self._path}/test_config", json=payload) + + def list_data_sinks(self, source_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/data_sinks" + return self._make_request("GET", path, params=params) + + def run_now(self, source_id: int, method: str = "POST") -> Dict[str, Any]: + path = f"{self._path}/{source_id}/run_now" + return self._make_request(method.upper(), path) + + def ready(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/ready" + return self._make_request("POST", path) + + def list_runs(self, source_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/runs" + return self._make_request("GET", path, params=params) + + def list_flow_triggers(self, source_id: int) -> List[Dict[str, Any]]: + path = f"{self._path}/{source_id}/flow_triggers" + return self._make_request("GET", path) or [] + + def edit_flow_triggers( + self, + source_id: int, + payload: Dict[str, Any], + mode: str, + all_triggers: bool = False, + ) -> List[Dict[str, Any]]: + path = f"{self._path}/{source_id}/flow_triggers" + if mode in {"pause", "activate"}: + path = f"{path}/{mode}" + if all_triggers: + path = f"{path}/all" + method = "PUT" if mode in {"add", "pause", "activate"} else "POST" + if mode == "remove": + method = "DELETE" + return self._make_request(method, path, json=payload) or [] + + def list_api_keys(self, source_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys" + return self._make_request("GET", path, params=params) + + def search_api_keys( + self, source_id: int, filters: Dict[str, Any], **params + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/search" + return self._make_request("POST", path, json=filters, params=params) + + def get_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}" + return self._make_request("GET", path) + + def create_api_key(self, source_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys" + return self._make_request("POST", path, json=payload) + + def update_api_key( + self, source_id: int, api_key_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}" + return self._make_request("PUT", path, json=payload) + + def rotate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}/rotate" + return self._make_request("PUT", path) + + def activate_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}/activate" + return self._make_request("PUT", path) + + def pause_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}/pause" + return self._make_request("PUT", path) + + def pause_all_api_keys(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/pause" + return self._make_request("PUT", path) + + def delete_api_key(self, source_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/api_keys/{api_key_id}" + return self._make_request("DELETE", path) + + def trigger_quarantine_aggregation( + self, source_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/trigger_quarantine_aggregation" + return self._make_request("POST", path, json=payload) + + def get_quarantine_aggregation(self, source_id: int) -> Dict[str, Any]: + path = f"{self._path}/{source_id}/quarantine_aggregation" + return self._make_request("GET", path) diff --git a/nexla_sdk/resources/teams.py b/nexla_sdk/resources/teams.py index 162828b..5a03487 100644 --- a/nexla_sdk/resources/teams.py +++ b/nexla_sdk/resources/teams.py @@ -1,5 +1,6 @@ from typing import Any, Dict, List, Optional +from nexla_sdk.models.common import LogEntry from nexla_sdk.models.teams.requests import TeamCreate, TeamMemberList, TeamUpdate from nexla_sdk.models.teams.responses import Team, TeamMember from nexla_sdk.resources.base_resource import BaseResource @@ -150,3 +151,8 @@ def remove_members( data = members.to_dict() if members else None response = self._make_request("DELETE", path, json=data) return [TeamMember(**member) for member in response] + + def get_audit_log(self, team_id: int, **params) -> List[LogEntry]: + path = f"{self._path}/{team_id}/audit_log" + response = self._make_request("GET", path, params=params) + return [LogEntry.model_validate(item) for item in (response or [])] diff --git a/nexla_sdk/resources/tokens.py b/nexla_sdk/resources/tokens.py new file mode 100644 index 0000000..136f384 --- /dev/null +++ b/nexla_sdk/resources/tokens.py @@ -0,0 +1,43 @@ +from typing import Any, Dict, Optional + +from nexla_sdk.resources.base_resource import BaseResource + + +class TokensResource(BaseResource): + """Resource for auth/token endpoints.""" + + def __init__(self, client): + super().__init__(client) + self._path = "" + self._model_class = None + + def create_token(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/token", json=payload) + + def update_token(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("PUT", "/token", json=payload) + + def create_google_token(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/gtoken", json=payload) + + def refresh_token(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/token/refresh", json=payload) + + def logout(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: + return self._make_request("POST", "/token/logout", json=payload or {}) + + def create_idp_token( + self, uid: Optional[str], payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = "/token" if uid is None else f"/token/{uid}" + return self._make_request("POST", path, json=payload) + + def metadata(self, uid: Optional[str] = None) -> Dict[str, Any]: + path = "/metadata" if uid is None else f"/metadata/{uid}" + return self._make_request("GET", path) + + def aws_marketplace_token(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/aws_marketplace_token", json=payload) + + def resource_authorize(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/resource_authorize", json=payload) diff --git a/nexla_sdk/resources/transforms.py b/nexla_sdk/resources/transforms.py index c9b086b..a071dfd 100644 --- a/nexla_sdk/resources/transforms.py +++ b/nexla_sdk/resources/transforms.py @@ -56,3 +56,19 @@ def list_public(self) -> List[Transform]: path = f"{self._path}/public" response = self._make_request("GET", path) return self._parse_response(response) + + def search(self, filters: Dict[str, Any], **params) -> List[Transform]: + return super().search(filters, **params) + + def search_tags(self, tags: List[str], **params) -> List[Transform]: + return super().search_tags(tags, **params) + + def transform(self, transform_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{transform_id}/transform" + return self._make_request("POST", path, json=payload) + + def transform_features(self) -> Dict[str, Any]: + return self._make_request("GET", "/transform/features") + + def transform_data(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/transform", json=payload) diff --git a/nexla_sdk/resources/user_settings.py b/nexla_sdk/resources/user_settings.py new file mode 100644 index 0000000..ed5d484 --- /dev/null +++ b/nexla_sdk/resources/user_settings.py @@ -0,0 +1,38 @@ +from typing import Any, Dict, List, Union + +from nexla_sdk.models.user_settings.requests import UserSettingCreate, UserSettingUpdate +from nexla_sdk.models.user_settings.responses import UserSetting +from nexla_sdk.resources.base_resource import BaseResource + + +class UserSettingsResource(BaseResource): + """Resource for managing user settings.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/user_settings" + self._model_class = UserSetting + + def list(self, **kwargs) -> List[UserSetting]: + return super().list(**kwargs) + + def search(self, filters: Dict[str, Any], **params) -> List[UserSetting]: + path = f"{self._path}/search" + response = self._make_request("POST", path, json=filters, params=params) + return self._parse_response(response) + + def get(self, user_setting_id: int) -> UserSetting: + return super().get(user_setting_id) + + def create(self, data: Union[UserSettingCreate, Dict[str, Any]]) -> UserSetting: + return super().create(data) + + def update( + self, + user_setting_id: int, + data: Union[UserSettingUpdate, Dict[str, Any]], + ) -> UserSetting: + return super().update(user_setting_id, data) + + def delete(self, user_setting_id: int) -> Dict[str, Any]: + return super().delete(user_setting_id) diff --git a/nexla_sdk/resources/user_tiers.py b/nexla_sdk/resources/user_tiers.py new file mode 100644 index 0000000..56e348f --- /dev/null +++ b/nexla_sdk/resources/user_tiers.py @@ -0,0 +1,28 @@ +from typing import Any, Dict, List + +from nexla_sdk.models.user_tiers.responses import UserTier +from nexla_sdk.resources.base_resource import BaseResource + + +class UserTiersResource(BaseResource): + """Resource for user tiers.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/user_tiers" + self._model_class = UserTier + + def list(self, **kwargs) -> List[UserTier]: + return super().list(**kwargs) + + def get(self, user_tier_id: int) -> UserTier: + return super().get(user_tier_id) + + def create(self, data: Dict[str, Any]) -> UserTier: + return super().create(data) + + def update(self, user_tier_id: int, data: Dict[str, Any]) -> UserTier: + return super().update(user_tier_id, data) + + def delete(self, user_tier_id: int) -> Dict[str, Any]: + return super().delete(user_tier_id) diff --git a/nexla_sdk/resources/users.py b/nexla_sdk/resources/users.py index 3456915..da96433 100644 --- a/nexla_sdk/resources/users.py +++ b/nexla_sdk/resources/users.py @@ -1,6 +1,7 @@ from typing import Any, Dict, List, Optional, Union from nexla_sdk.models.metrics.enums import UserMetricResourceType +from nexla_sdk.models.users.credits import UserCredit, UserCreditCreate from nexla_sdk.models.users.requests import UserCreate, UserUpdate from nexla_sdk.models.users.responses import User, UserExpanded, UserSettings from nexla_sdk.resources.base_resource import BaseResource @@ -40,6 +41,9 @@ def list(self, expand: bool = False, **kwargs) -> List[User]: return super().list(**kwargs) + def list_sso_options(self) -> Dict[str, Any]: + return self._make_request("GET", "/users/sso_options") + def get(self, user_id: int, expand: bool = False) -> User: """ Get user by ID. @@ -102,6 +106,40 @@ def delete(self, user_id: int) -> Dict[str, Any]: """ return super().delete(user_id) + # Account summary methods + def get_account_summary(self) -> Dict[str, Any]: + """Get current user's account summary.""" + return self._make_request("GET", "/users/account_summary") + + def get_user_account_summary(self, user_id: int) -> Dict[str, Any]: + """Get account summary for a specific user.""" + path = f"{self._path}/{user_id}/account_summary" + return self._make_request("GET", path) + + # Password and authentication methods + def reset_password(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/reset_password", json=payload) + + def set_password(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/set_password", json=payload) + + def password_entropy(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/password_entropy", json=payload) + + def send_invite(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("POST", "/users/send_invite", json=payload) + + def change_password(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/change_password" + return self._make_request("PUT", path, json=payload) + + def get_sso_options(self, email: Optional[str] = None) -> Dict[str, Any]: + params = {} + if email: + params["email"] = email + return self._make_request("GET", "/users/sso_options", params=params) + + # User settings and current user def get_settings(self) -> List[UserSettings]: """ Get current user's settings. @@ -118,6 +156,40 @@ def get_current(self) -> Dict[str, Any]: path = "/users/current" return self._make_request("GET", path) + # Audit and history methods + def get_audit_history(self, user_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{user_id}/audit_history" + return self._make_request("GET", path, params=params) or [] + + def get_login_history(self, user_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{user_id}/login_history" + return self._make_request("GET", path, params=params) or [] + + def get_api_key_events(self, user_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{user_id}/api_keys/events" + return self._make_request("GET", path, params=params) or [] + + def get_resource_audit_log( + self, user_id: int, resource_type: str, **params + ) -> List[Dict[str, Any]]: + path = f"{self._path}/{user_id}/{resource_type}/audit_log" + response = self._make_request("GET", path, params=params) + return response or [] + + # Metrics methods + def get_metrics( + self, user_id: int, metrics_name: Optional[str] = None, **params + ) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/metrics" + if metrics_name: + path = f"{path}/{metrics_name}" + return self._make_request("GET", path, params=params) + + def get_orgs(self, user_id: int, **params) -> List[Dict[str, Any]]: + path = f"{self._path}/{user_id}/orgs" + return self._make_request("GET", path, params=params) or [] + + # Quarantine settings def get_quarantine_settings(self, user_id: int) -> Dict[str, Any]: """ Get quarantine data export settings for user. @@ -178,6 +250,11 @@ def delete_quarantine_settings(self, user_id: int) -> Dict[str, Any]: path = f"{self._path}/{user_id}/quarantine_settings" return self._make_request("DELETE", path) + # Dashboard transforms + def get_dashboard_transforms(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/dashboard_transforms" + return self._make_request("GET", path) + def get_audit_log( self, user_id: int, @@ -222,6 +299,63 @@ def get_audit_log( return response return [] + def create_dashboard_transforms( + self, user_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/dashboard_transforms" + return self._make_request("POST", path, json=payload) + + def update_dashboard_transforms( + self, user_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/dashboard_transforms" + return self._make_request("PUT", path, json=payload) + + def delete_dashboard_transforms(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/dashboard_transforms" + return self._make_request("DELETE", path) + + # Flows dashboard and metrics + def get_flows_dashboard(self, user_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/flows/dashboard" + return self._make_request("GET", path, params=params) + + def get_flows_status_metrics(self, user_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/flows/status_metrics" + return self._make_request("GET", path, params=params) + + def get_flows_account_metrics(self, user_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/flows/account_metrics" + return self._make_request("GET", path, params=params) + + # Account activation and locking + def activate(self, user_id: int, activate: bool = True) -> Dict[str, Any]: + action = "activate" if activate else "deactivate" + path = f"{self._path}/{user_id}/{action}" + return self._make_request("PUT", path) + + def lock_account(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/lock_account" + return self._make_request("PUT", path) + + def unlock_account(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/unlock_account" + return self._make_request("PUT", path) + + def activate_rate_limited_sources( + self, user_id: int, status: Optional[str] = None, activate: bool = True + ) -> Dict[str, Any]: + action = "source_activate" if activate else "source_pause" + path = f"{self._path}/{user_id}/{action}" + if status: + path = f"{path}/{status}" + return self._make_request("PUT", path) + + def get_account_rate_limited(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/account_rate_limited" + return self._make_request("GET", path) + + # Resource transfer def get_transferable_resources(self, user_id: int, org_id: int) -> Dict[str, Any]: """ Get a list of resources owned by a user that can be transferred. @@ -255,6 +389,93 @@ def transfer_resources( data = {"org_id": org_id, "delegate_owner_id": delegate_owner_id} return self._make_request("PUT", path, json=data) + # User credits + def list_credits(self, user_id: int, **params) -> List[UserCredit]: + path = f"{self._path}/{user_id}/credits" + response = self._make_request("GET", path, params=params) + return [UserCredit.model_validate(item) for item in (response or [])] + + def create_credit(self, user_id: int, payload: UserCreditCreate) -> UserCredit: + path = f"{self._path}/{user_id}/credits" + data = self._serialize_data(payload) + response = self._make_request("POST", path, json=data) + return UserCredit.model_validate(response) + + def get_credit(self, user_id: int, credit_id: int) -> UserCredit: + path = f"{self._path}/{user_id}/credits/{credit_id}" + response = self._make_request("GET", path) + return UserCredit.model_validate(response) + + def use_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/credits/use" + return self._make_request("PUT", path, json=payload) + + def use_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + """Alias for use_credits.""" + return self.use_credits(user_id, payload) + + def refresh_credits(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/credits/refresh" + return self._make_request("PUT", path, json=payload) + + def refresh_credit(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + """Alias for refresh_credits.""" + return self.refresh_credits(user_id, payload) + + def expire_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/credits/{credit_id}/expire" + return self._make_request("PUT", path) + + def delete_credit(self, user_id: int, credit_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/credits/{credit_id}" + return self._make_request("DELETE", path) + + # API keys + def list_api_keys(self, user_id: int, **params) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys" + return self._make_request("GET", path, params=params) + + def search_api_keys( + self, user_id: int, filters: Dict[str, Any], **params + ) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/search" + return self._make_request("POST", path, json=filters, params=params) + + def get_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}" + return self._make_request("GET", path) + + def create_api_key(self, user_id: int, payload: Dict[str, Any]) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys" + return self._make_request("POST", path, json=payload) + + def update_api_key( + self, user_id: int, api_key_id: int, payload: Dict[str, Any] + ) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}" + return self._make_request("PUT", path, json=payload) + + def rotate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}/rotate" + return self._make_request("PUT", path) + + def activate_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}/activate" + return self._make_request("PUT", path) + + def pause_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}/pause" + return self._make_request("PUT", path) + + def pause_all_api_keys(self, user_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/pause" + return self._make_request("PUT", path) + + def delete_api_key(self, user_id: int, api_key_id: int) -> Dict[str, Any]: + path = f"{self._path}/{user_id}/api_keys/{api_key_id}" + return self._make_request("DELETE", path) + + # Extended metrics def get_account_metrics( self, user_id: int, diff --git a/nexla_sdk/resources/validators.py b/nexla_sdk/resources/validators.py new file mode 100644 index 0000000..4e34511 --- /dev/null +++ b/nexla_sdk/resources/validators.py @@ -0,0 +1,178 @@ +"""Resource for managing validators (data validation rules).""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.validators.requests import ( + ValidatorCopyOptions, + ValidatorCreate, + ValidatorUpdate, +) +from nexla_sdk.models.validators.responses import Validator +from nexla_sdk.resources.base_resource import BaseResource + + +class ValidatorsResource(BaseResource): + """Resource for managing validators (data validation rules). + + Validators are code containers used to validate data within flows. + They support various code types including Python, JavaScript, and Jolt. + + Examples: + # List validators + validators = client.validators.list() + + # Get a specific validator + validator = client.validators.get(123) + + # Create a Python validator + validator = client.validators.create(ValidatorCreate( + name="My Validator", + code_type="python", + code="def validate(record): return record['value'] > 0" + )) + + # List public validators + public_validators = client.validators.list_public() + """ + + def __init__(self, client): + """Initialize the validators resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/validators" + self._model_class = Validator + + def list( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + access_role: Optional[str] = None, + expand: bool = False, + **kwargs, + ) -> List[Validator]: + """List validators with optional filters. + + Args: + page: Page number (1-based) + per_page: Items per page + access_role: Filter by access role (owner, collaborator, operator, admin) + expand: Include full details for each validator + **kwargs: Additional query parameters + + Returns: + List of validators + """ + if expand: + kwargs["expand"] = 1 + return super().list( + page=page, per_page=per_page, access_role=access_role, **kwargs + ) + + def list_public( + self, + page: Optional[int] = None, + per_page: Optional[int] = None, + ) -> List[Validator]: + """List publicly available validators. + + Args: + page: Page number (1-based) + per_page: Items per page + + Returns: + List of public validators + """ + path = f"{self._path}/public" + params = {} + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def get(self, validator_id: int, expand: bool = False) -> Validator: + """Get validator by ID. + + Args: + validator_id: Validator ID + expand: Include expanded references + + Returns: + Validator instance + """ + return super().get(validator_id, expand=expand) + + def create(self, data: Union[ValidatorCreate, Dict[str, Any]]) -> Validator: + """Create a new validator. + + Args: + data: Validator creation data + + Returns: + Created validator + """ + return super().create(data) + + def update( + self, validator_id: int, data: Union[ValidatorUpdate, Dict[str, Any]] + ) -> Validator: + """Update a validator. + + Args: + validator_id: Validator ID + data: Updated validator data + + Returns: + Updated validator + """ + return super().update(validator_id, data) + + def delete(self, validator_id: int) -> Dict[str, Any]: + """Delete a validator. + + Args: + validator_id: Validator ID + + Returns: + Response with status + """ + return super().delete(validator_id) + + def copy( + self, + validator_id: int, + options: Optional[Union[ValidatorCopyOptions, Dict[str, Any]]] = None, + ) -> Validator: + """Copy a validator. + + Args: + validator_id: Validator ID to copy + options: Copy options (owner_id, org_id, etc.) + + Returns: + Copied validator + """ + return super().copy(validator_id, options) + + def search_tags(self, tags: List[str]) -> List[Validator]: + """Search validators by tags. + + Args: + tags: List of tags to search for + + Returns: + List of validators matching the tags + """ + path = f"{self._path}/search_tags" + response = self._make_request("POST", path, json=tags) + return self._parse_response(response) + + def search(self, filters: Dict[str, Any]) -> List[Validator]: + """Search validators (alias to search_tags endpoint).""" + path = f"{self._path}/search" + response = self._make_request("POST", path, json=filters) + return self._parse_response(response) diff --git a/nexla_sdk/resources/vendor_endpoints.py b/nexla_sdk/resources/vendor_endpoints.py new file mode 100644 index 0000000..bef8073 --- /dev/null +++ b/nexla_sdk/resources/vendor_endpoints.py @@ -0,0 +1,44 @@ +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.vendor_endpoints.requests import ( + VendorEndpointCreate, + VendorEndpointUpdate, +) +from nexla_sdk.models.vendor_endpoints.responses import VendorEndpoint +from nexla_sdk.resources.base_resource import BaseResource + + +class VendorEndpointsResource(BaseResource): + """Resource for managing vendor endpoints.""" + + def __init__(self, client): + super().__init__(client) + self._path = "/vendor_endpoints" + self._model_class = VendorEndpoint + + def list(self, **kwargs) -> List[VendorEndpoint]: + return super().list(**kwargs) + + def get(self, vendor_endpoint_id: int) -> VendorEndpoint: + return super().get(vendor_endpoint_id) + + def create( + self, data: Union[VendorEndpointCreate, Dict[str, Any]] + ) -> VendorEndpoint: + return super().create(data) + + def update( + self, + vendor_endpoint_id: int, + data: Union[VendorEndpointUpdate, Dict[str, Any]], + ) -> VendorEndpoint: + return super().update(vendor_endpoint_id, data) + + def delete(self, vendor_endpoint_id: int) -> Dict[str, Any]: + return super().delete(vendor_endpoint_id) + + def update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return self._make_request("PUT", self._path, json=payload) + + def delete_all(self, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: + return self._make_request("DELETE", self._path, json=payload) diff --git a/nexla_sdk/resources/vendors.py b/nexla_sdk/resources/vendors.py new file mode 100644 index 0000000..fdbe791 --- /dev/null +++ b/nexla_sdk/resources/vendors.py @@ -0,0 +1,199 @@ +"""Resource for managing vendors.""" + +from typing import Any, Dict, List, Optional, Union + +from nexla_sdk.models.vendors.requests import VendorCreate, VendorUpdate +from nexla_sdk.models.vendors.responses import Vendor +from nexla_sdk.resources.base_resource import BaseResource + + +class VendorsResource(BaseResource): + """Resource for managing vendors. + + Vendors represent third-party service providers that can be + connected via auth templates and endpoints. + + Write operations (create, update, delete) require super user access. + + Examples: + # List all vendors + vendors = client.vendors.list() + + # Get a vendor by ID + vendor = client.vendors.get(123) + + # Get a vendor by name + vendor = client.vendors.get_by_name("salesforce") + + # Create a vendor (super user only) + vendor = client.vendors.create(VendorCreate( + name="new_vendor", + display_name="New Vendor" + )) + + # Update a vendor (super user only) + vendor = client.vendors.update(123, VendorUpdate( + description="Updated description" + )) + + # Delete a vendor (super user only) + client.vendors.delete(123) + """ + + def __init__(self, client): + """Initialize the vendors resource. + + Args: + client: Nexla client instance + """ + super().__init__(client) + self._path = "/vendors" + self._model_class = Vendor + + def list( + self, + expand: bool = False, + page: Optional[int] = None, + per_page: Optional[int] = None, + **kwargs, + ) -> List[Vendor]: + """List vendors. + + Args: + expand: Include nested auth_templates and vendor_endpoints + page: Page number (1-based) + per_page: Items per page + + Returns: + List of vendors + """ + params = kwargs.copy() + if expand: + params["expand"] = "true" + if page is not None: + params["page"] = page + if per_page is not None: + params["per_page"] = per_page + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def get(self, vendor_id: int, expand: bool = False) -> Vendor: + """Get vendor by ID. + + Args: + vendor_id: Vendor ID + expand: Include nested auth_templates and vendor_endpoints + + Returns: + Vendor instance + """ + path = f"{self._path}/{vendor_id}" + params = {"expand": "true"} if expand else {} + response = self._make_request("GET", path, params=params) + return self._parse_response(response) + + def get_by_name(self, vendor_name: str, expand: bool = False) -> Vendor: + """Get vendor by name. + + Args: + vendor_name: Vendor name + expand: Include nested auth_templates and vendor_endpoints + + Returns: + Vendor instance + """ + params = {"vendor_name": vendor_name} + if expand: + params["expand"] = "true" + response = self._make_request("GET", self._path, params=params) + return self._parse_response(response) + + def create(self, data: Union[VendorCreate, Dict[str, Any]]) -> Vendor: + """Create a new vendor (super user only). + + Args: + data: Vendor creation data + + Returns: + Created vendor + """ + return super().create(data) + + def update( + self, vendor_id: int, data: Union[VendorUpdate, Dict[str, Any]] + ) -> Vendor: + """Update a vendor (super user only). + + Args: + vendor_id: Vendor ID + data: Updated vendor data + + Returns: + Updated vendor + """ + return super().update(vendor_id, data) + + def update_by_name( + self, vendor_name: str, data: Union[VendorUpdate, Dict[str, Any]] + ) -> Vendor: + """Update a vendor by name (super user only). + + Args: + vendor_name: Vendor name + data: Updated vendor data + + Returns: + Updated vendor + """ + params = {"vendor_name": vendor_name} + serialized_data = self._serialize_data(data) + response = self._make_request( + "PUT", self._path, json=serialized_data, params=params + ) + return self._parse_response(response) + + def delete(self, vendor_id: int) -> Dict[str, Any]: + """Delete a vendor (super user only). + + Args: + vendor_id: Vendor ID + + Returns: + Response with status + """ + return super().delete(vendor_id) + + def delete_by_name(self, vendor_name: str) -> Dict[str, Any]: + """Delete a vendor by name (super user only). + + Args: + vendor_name: Vendor name + + Returns: + Response with status + """ + params = {"vendor_name": vendor_name} + return self._make_request("DELETE", self._path, params=params) + + def update_all(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """Update vendors via collection endpoint.""" + return self._make_request("PUT", self._path, json=payload) + + def delete_all(self, payload: Dict[str, Any] = None) -> Dict[str, Any]: + """Delete vendors via collection endpoint.""" + return self._make_request("DELETE", self._path, json=payload or {}) + + def delete_auth_template( + self, vendor_id: int, auth_template_id: int + ) -> Dict[str, Any]: + """Delete an auth template from a vendor (super user only). + + Args: + vendor_id: Vendor ID + auth_template_id: Auth template ID + + Returns: + Response with status + """ + path = f"{self._path}/{vendor_id}/auth_templates/{auth_template_id}" + return self._make_request("DELETE", path) diff --git a/nexla_sdk/telemetry.py b/nexla_sdk/telemetry.py index 87e3805..85318bc 100644 --- a/nexla_sdk/telemetry.py +++ b/nexla_sdk/telemetry.py @@ -41,9 +41,7 @@ def is_recording(self) -> bool: class _NoOpTracer: - def start_as_current_span( - self, *args: Any, **kwargs: Any - ) -> _NoOpSpan: # noqa: D401 + def start_as_current_span(self, *args: Any, **kwargs: Any) -> _NoOpSpan: # noqa: D401 return _NoOpSpan() def start_span(self, *args: Any, **kwargs: Any) -> _NoOpSpan: # noqa: D401 diff --git a/pyproject.toml b/pyproject.toml index 208c835..35dd203 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ dev = [ "pytest-asyncio>=0.21.0", "hypothesis>=6.0.0", "faker>=18.0.0", + "PyYAML>=6.0.0", "responses>=0.23.0", "freezegun>=1.2.0", "factory-boy>=3.2.0", @@ -49,9 +50,9 @@ tracing = [ ] [project.urls] -Homepage = "https://github.com/nexla/nexla-sdk" -Documentation = "https://github.com/nexla/nexla-sdk" -"Bug Tracker" = "https://github.com/nexla/nexla-sdk/issues" +Homepage = "https://github.com/nexla-opensource/nexla-sdk-python" +Documentation = "https://github.com/nexla-opensource/nexla-sdk-python" +"Bug Tracker" = "https://github.com/nexla-opensource/nexla-sdk-python/issues" [tool.setuptools_scm] version_scheme = "no-guess-dev" @@ -62,6 +63,9 @@ local_scheme = "no-local-version" [tool.setuptools.packages.find] include = ["nexla_sdk*"] +[tool.setuptools.package-data] +nexla_sdk = ["py.typed"] + [tool.pytest.ini_options] markers = [ "integration: marks tests as integration tests (require API credentials)", diff --git a/scripts/parity/README.md b/scripts/parity/README.md new file mode 100644 index 0000000..182604f --- /dev/null +++ b/scripts/parity/README.md @@ -0,0 +1,24 @@ +# Parity Tooling + +This folder contains local tooling for validating Python SDK parity against: + +- `plugin-redoc-0.yaml` (OpenAPI spec in this repo) +- `config/routes.rb` from the admin API codebase +- `nexla_sdk/resources/*.py` request surfaces + +## Commands + +Generate operation map used by `NexlaClient.raw`: + +```bash +python scripts/parity/generate_operation_map.py +``` + +Build parity matrices and diffs: + +```bash +python scripts/parity/build_matrices.py \ + --admin-routes /Users/sakshammittal/Documents/GitHub/admin-api/config/routes.rb +``` + +Outputs are written under `artifacts/parity/`. diff --git a/scripts/parity/build_matrices.py b/scripts/parity/build_matrices.py new file mode 100755 index 0000000..25e5e24 --- /dev/null +++ b/scripts/parity/build_matrices.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python3 +"""Build route/spec/SDK parity matrices for Nexla SDK verification.""" + +from __future__ import annotations + +import argparse +import json +import os +import re +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple + +import yaml + +HTTP_METHODS = {"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"} +SDK_REQUEST_RE = re.compile(r'_make_request\(\s*"([A-Z]+)"\s*,\s*([^)]+?)\s*(?:,|\))') +ROUTE_RE = re.compile(r"^\s*(get|post|put|delete|patch|match)\s+['\"]([^'\"]+)['\"]") +ROUTE_VIA_ARRAY_RE = re.compile(r":via\s*=>\s*\[([^\]]+)\]") +ROUTE_VIA_SINGLE_RE = re.compile(r"(?:via:|:via\s*=>)\s*:(\w+)") +PATH_VAR_RE = re.compile(r":([a-zA-Z_][a-zA-Z0-9_]*)") +ASSIGNMENT_RE = re.compile(r'^\s*(\w+)\s*=\s*(f?)"([^"]+)"') +DEF_RE = re.compile(r"^\s*def\s+\w+\(") +PATH_EQ_RE = re.compile(r'^\s*self\._path\s*=\s*"([^"]+)"') + + +@dataclass(frozen=True) +class Endpoint: + method: str + path: str + source: str + operation_id: Optional[str] = None + + def key(self) -> Tuple[str, str]: + return self.method, self.path + + +def normalize_path(path: str) -> str: + normalized = path.strip() + normalized = normalized.replace("(.:format)", "") + normalized = re.sub(r"\((/:([a-zA-Z_][a-zA-Z0-9_]*))\)", r"/:\2", normalized) + normalized = re.sub(r"\(/([a-zA-Z_][a-zA-Z0-9_]*)\)", r"/\1", normalized) + normalized = PATH_VAR_RE.sub(r"{\1}", normalized) + normalized = re.sub(r"//+", "/", normalized) + if not normalized.startswith("/"): + normalized = f"/{normalized}" + if len(normalized) > 1 and normalized.endswith("/"): + normalized = normalized[:-1] + return normalized + + +def load_openapi_endpoints(spec_path: Path) -> List[Endpoint]: + spec = yaml.safe_load(spec_path.read_text()) + endpoints: List[Endpoint] = [] + for path, path_item in (spec.get("paths") or {}).items(): + if not isinstance(path_item, dict): + continue + for method, operation in path_item.items(): + upper_method = method.upper() + if upper_method not in HTTP_METHODS: + continue + if not isinstance(operation, dict): + continue + endpoints.append( + Endpoint( + method=upper_method, + path=normalize_path(path), + source="openapi", + operation_id=operation.get("operationId"), + ) + ) + return endpoints + + +def _extract_match_methods(line: str) -> List[str]: + via_array = ROUTE_VIA_ARRAY_RE.search(line) + if via_array: + tokens = [token.strip() for token in via_array.group(1).split(",")] + return [token.lstrip(":").upper() for token in tokens if token.strip()] + via_single = ROUTE_VIA_SINGLE_RE.search(line) + if via_single: + return [via_single.group(1).upper()] + return [] + + +def load_admin_routes(routes_path: Path) -> List[Endpoint]: + endpoints: List[Endpoint] = [] + for line in routes_path.read_text().splitlines(): + route_match = ROUTE_RE.search(line) + if not route_match: + continue + method = route_match.group(1).upper() + path = normalize_path(route_match.group(2)) + methods: List[str] + if method == "MATCH": + methods = _extract_match_methods(line) + else: + methods = [method] + + for verb in methods: + if verb in HTTP_METHODS: + endpoints.append( + Endpoint(method=verb, path=path, source="admin_routes") + ) + return endpoints + + +def _resolve_sdk_path_expr( + expr: str, base_path: str, path_vars: Mapping[str, str] +) -> str: + candidate = expr.strip() + if candidate in path_vars: + candidate = path_vars[candidate] + + if candidate.startswith('f"') and candidate.endswith('"'): + candidate = candidate[2:-1] + elif candidate.startswith('"') and candidate.endswith('"'): + candidate = candidate[1:-1] + elif candidate.startswith("'") and candidate.endswith("'"): + candidate = candidate[1:-1] + + candidate = candidate.replace("{self._path}", base_path) + if candidate == "self._path": + candidate = base_path + + if "{self._path}" in candidate: + candidate = candidate.replace("{self._path}", base_path) + if "self._path" in candidate and candidate.startswith("self._path"): + candidate = candidate.replace("self._path", base_path, 1) + if candidate.startswith(base_path) or candidate.startswith("/"): + return normalize_path(candidate) + return normalize_path(f"{base_path}/{candidate}") + + +def load_sdk_endpoints(resources_dir: Path) -> List[Endpoint]: + endpoints: List[Endpoint] = [] + for resource_file in sorted(resources_dir.glob("*.py")): + text = resource_file.read_text() + if "_make_request(" not in text: + continue + + base_path = "" + path_assign = PATH_EQ_RE.search(text) + if path_assign: + base_path = path_assign.group(1) + + path_vars: Dict[str, str] = {} + for raw_line in text.splitlines(): + if DEF_RE.search(raw_line): + path_vars = {} + assign_match = ASSIGNMENT_RE.match(raw_line) + if assign_match: + var_name, is_f, value = assign_match.groups() + path_vars[var_name] = f'f"{value}"' if is_f else f'"{value}"' + + request_match = SDK_REQUEST_RE.search(raw_line) + if not request_match: + continue + + method, path_expr = request_match.groups() + if method not in HTTP_METHODS: + continue + if not base_path and "self._path" in path_expr: + continue + + try: + resolved_path = _resolve_sdk_path_expr(path_expr, base_path, path_vars) + except Exception: + continue + + endpoints.append( + Endpoint( + method=method, + path=resolved_path, + source=str(resource_file), + ) + ) + return endpoints + + +def dedupe(endpoints: Iterable[Endpoint]) -> List[Endpoint]: + seen: Dict[Tuple[str, str], Endpoint] = {} + for endpoint in endpoints: + seen.setdefault(endpoint.key(), endpoint) + return sorted(seen.values(), key=lambda endpoint: endpoint.key()) + + +def build_diff( + canonical: Iterable[Endpoint], sdk: Iterable[Endpoint] +) -> Dict[str, List[Dict[str, str]]]: + canonical_set = {(endpoint.method, endpoint.path) for endpoint in canonical} + sdk_set = {(endpoint.method, endpoint.path) for endpoint in sdk} + + missing_in_sdk = sorted(canonical_set - sdk_set) + extra_in_sdk = sorted(sdk_set - canonical_set) + + return { + "missing_in_sdk": [ + {"method": method, "path": path} for method, path in missing_in_sdk + ], + "extra_in_sdk": [ + {"method": method, "path": path} for method, path in extra_in_sdk + ], + } + + +def serialize_endpoints(endpoints: Iterable[Endpoint]) -> List[Dict[str, Any]]: + return [ + { + "method": endpoint.method, + "path": endpoint.path, + "source": endpoint.source, + "operation_id": endpoint.operation_id, + } + for endpoint in endpoints + ] + + +def write_json(path: Path, payload: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2, sort_keys=True)) + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--spec", default="plugin-redoc-0.yaml") + admin_api_root = os.environ.get("NEXLA_ADMIN_API_PATH") + parser.add_argument( + "--admin-routes", + default=( + os.path.join(admin_api_root, "config/routes.rb") if admin_api_root else None + ), + help=( + "Path to admin-api config/routes.rb. Defaults to " + "$NEXLA_ADMIN_API_PATH/config/routes.rb when the env var is set." + ), + ) + parser.add_argument("--resources-dir", default="nexla_sdk/resources") + parser.add_argument("--out-dir", default="artifacts/parity") + args = parser.parse_args() + + if not args.admin_routes: + parser.error( + "--admin-routes was not provided and NEXLA_ADMIN_API_PATH is unset. " + "Pass the path explicitly or export the env var." + ) + + out_dir = Path(args.out_dir) + spec_endpoints = dedupe(load_openapi_endpoints(Path(args.spec))) + admin_endpoints = dedupe(load_admin_routes(Path(args.admin_routes))) + sdk_endpoints = dedupe(load_sdk_endpoints(Path(args.resources_dir))) + + write_json(out_dir / "openapi_matrix.json", serialize_endpoints(spec_endpoints)) + write_json( + out_dir / "admin_routes_matrix.json", serialize_endpoints(admin_endpoints) + ) + write_json(out_dir / "sdk_matrix.json", serialize_endpoints(sdk_endpoints)) + write_json( + out_dir / "diff_openapi_vs_sdk.json", + build_diff(spec_endpoints, sdk_endpoints), + ) + write_json( + out_dir / "diff_admin_routes_vs_sdk.json", + build_diff(admin_endpoints, sdk_endpoints), + ) + + print(f"Wrote parity matrices to {out_dir}") + print(f"OpenAPI endpoints: {len(spec_endpoints)}") + print(f"Admin route endpoints: {len(admin_endpoints)}") + print(f"SDK endpoints: {len(sdk_endpoints)}") + + +if __name__ == "__main__": + main() diff --git a/scripts/parity/check_operation_map_sync.py b/scripts/parity/check_operation_map_sync.py new file mode 100755 index 0000000..12bd155 --- /dev/null +++ b/scripts/parity/check_operation_map_sync.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Fail if generated operation map is out of sync with OpenAPI spec.""" + +from __future__ import annotations + +import argparse +import subprocess +import sys +import tempfile +from pathlib import Path + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--spec", default="plugin-redoc-0.yaml") + parser.add_argument("--target", default="nexla_sdk/generated/operation_map.py") + args = parser.parse_args() + + spec = Path(args.spec) + if not spec.exists(): + # The OpenAPI spec is sourced from upstream and not committed to this + # repo, so the parity check has nothing to compare against in CI or for + # contributors who have not checked it out locally. Match the skip + # behavior used in tests/unit/test_parity_tooling.py. + print( + f"Spec {spec} not present; skipping operation_map sync check.", + file=sys.stderr, + ) + return 0 + + target = Path(args.target) + if not target.exists(): + print(f"Target file does not exist: {target}", file=sys.stderr) + return 2 + + with tempfile.TemporaryDirectory() as tmpdir: + tmp_target = Path(tmpdir) / "operation_map.py" + cmd = [ + sys.executable, + "scripts/parity/generate_operation_map.py", + "--spec", + args.spec, + "--output", + str(tmp_target), + ] + result = subprocess.run(cmd, check=False, capture_output=True, text=True) + if result.returncode != 0: + sys.stderr.write(result.stderr) + return result.returncode + + current = target.read_text() + generated = tmp_target.read_text() + if current != generated: + print( + "operation_map.py is out of sync with plugin-redoc-0.yaml. " + "Run: python scripts/parity/generate_operation_map.py", + file=sys.stderr, + ) + return 1 + + print("operation_map.py is in sync.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/parity/generate_operation_map.py b/scripts/parity/generate_operation_map.py new file mode 100755 index 0000000..2f4eabc --- /dev/null +++ b/scripts/parity/generate_operation_map.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +"""Generate a Python operation map from the OpenAPI spec.""" + +from __future__ import annotations + +import argparse +import re +from pathlib import Path +from typing import Any, Dict, Iterable, List, Tuple + +import yaml + +HTTP_METHODS = {"get", "post", "put", "delete", "patch", "head", "options"} +SAFE_IDENTIFIER = re.compile(r"[^a-zA-Z0-9_]") + + +def normalize_operation_id(operation_id: str, fallback: str) -> str: + cleaned = SAFE_IDENTIFIER.sub("_", operation_id).strip("_") + if not cleaned: + cleaned = fallback + if cleaned[0].isdigit(): + cleaned = f"op_{cleaned}" + return cleaned + + +def iter_operations(spec: Dict[str, Any]) -> Iterable[Tuple[str, Dict[str, Any]]]: + paths = spec.get("paths", {}) + for path, path_item in paths.items(): + if not isinstance(path_item, dict): + continue + for method, operation in path_item.items(): + if method.lower() not in HTTP_METHODS or not isinstance(operation, dict): + continue + fallback = f"{method.lower()}_{path.strip('/').replace('/', '_')}" + raw_operation_id = operation.get("operationId") or fallback + operation_id = normalize_operation_id(raw_operation_id, fallback) + yield ( + operation_id, + { + "method": method.upper(), + "path": path, + "tags": operation.get("tags", []), + "summary": operation.get("summary", ""), + "path_params": sorted( + {match.group(1) for match in re.finditer(r"\{([^}]+)\}", path)} + ), + }, + ) + + +def render_output(operations: Dict[str, Dict[str, Any]]) -> str: + operation_ids = sorted(operations.keys()) + literal_values = ",\n ".join( + repr(operation_id) for operation_id in operation_ids + ) + lines: List[str] = [] + lines.append( + '"""Auto-generated operation map from OpenAPI. Do not edit manually."""' + ) + lines.append("") + lines.append("from typing import Dict, List, Literal, TypedDict") + lines.append("") + lines.append("") + lines.append("class OperationSpec(TypedDict):") + lines.append(" method: str") + lines.append(" path: str") + lines.append(" tags: List[str]") + lines.append(" summary: str") + lines.append(" path_params: List[str]") + lines.append("") + lines.append("") + lines.append("OperationId = Literal[") + if literal_values: + lines.append(f" {literal_values}") + lines.append("]") + lines.append("") + lines.append("") + lines.append("OPERATION_MAP: Dict[str, OperationSpec] = {") + for operation_id in operation_ids: + spec = operations[operation_id] + lines.append(f" {operation_id!r}: {{") + lines.append(f" 'method': {spec['method']!r},") + lines.append(f" 'path': {spec['path']!r},") + lines.append(f" 'tags': {spec['tags']!r},") + lines.append(f" 'summary': {spec['summary']!r},") + lines.append(f" 'path_params': {spec['path_params']!r},") + lines.append(" },") + lines.append("}") + lines.append("") + return "\n".join(lines) + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument( + "--spec", + default="plugin-redoc-0.yaml", + help="Path to OpenAPI spec file", + ) + parser.add_argument( + "--output", + default="nexla_sdk/generated/operation_map.py", + help="Output Python module path", + ) + args = parser.parse_args() + + spec_path = Path(args.spec) + out_path = Path(args.output) + out_path.parent.mkdir(parents=True, exist_ok=True) + + spec = yaml.safe_load(spec_path.read_text()) + operations: Dict[str, Dict[str, Any]] = {} + + duplicates: Dict[str, int] = {} + for operation_id, operation_spec in iter_operations(spec): + if operation_id in operations: + duplicates[operation_id] = duplicates.get(operation_id, 1) + 1 + operation_id = f"{operation_id}_{duplicates[operation_id]}" + operations[operation_id] = operation_spec + + output = render_output(operations) + out_path.write_text(output) + + print(f"Generated {out_path} with {len(operations)} operations from {spec_path}.") + + +if __name__ == "__main__": + main() diff --git a/tests/unit/test_access_control.py b/tests/unit/test_access_control.py new file mode 100644 index 0000000..10a2e80 --- /dev/null +++ b/tests/unit/test_access_control.py @@ -0,0 +1,287 @@ +"""Unit tests for access control operations across resources. + +Note: Some tests use raw dict responses instead of model validation because +AccessorResponse is a Union type alias, and the SDK's model_validate call +on Union types has limitations. These tests focus on verifying the correct +HTTP requests are made and responses are handled appropriately. +""" + +import pytest + +from nexla_sdk.exceptions import AuthorizationError, NotFoundError +from nexla_sdk.models.access import TeamAccessorRequest, UserAccessorRequest +from tests.utils import create_http_error + + +@pytest.mark.unit +class TestAccessorCRUDOperations: + """Tests for accessor CRUD operations.""" + + def test_get_accessors_makes_correct_request(self, mock_client, mock_http_client): + """Test that get_accessors makes the correct HTTP request.""" + # Arrange + resource_id = 123 + # Return empty list to avoid model parsing issues + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + result = mock_client.sources.get_accessors(resource_id) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/accessors" + ) + + def test_get_accessors_empty_list(self, mock_client, mock_http_client): + """Test getting accessors returns empty list when none exist.""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + accessors = mock_client.sources.get_accessors(resource_id) + + # Assert + assert accessors == [] + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/accessors" + ) + + def test_add_accessors_makes_correct_request(self, mock_client, mock_http_client): + """Test that add_accessors makes PUT request with correct body.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["collaborator"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.add_accessors(resource_id, [accessor]) + + # Assert + mock_http_client.assert_request_made( + "PUT", f"/data_sources/{resource_id}/accessors" + ) + # Verify the request body contains the accessor data + last_request = mock_http_client.get_last_request() + assert last_request is not None + assert "accessors" in str(last_request.get("json", {})) + + def test_replace_accessors_uses_post(self, mock_client, mock_http_client): + """Test that replace_accessors uses POST method.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["owner"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.replace_accessors(resource_id, [accessor]) + + # Assert + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/accessors" + ) + + def test_delete_accessors_specific(self, mock_client, mock_http_client): + """Test deleting specific accessors.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["collaborator"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.delete_accessors(resource_id, [accessor]) + + # Assert + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/accessors" + ) + + def test_delete_accessors_all(self, mock_client, mock_http_client): + """Test deleting all accessors (passing None).""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + result = mock_client.sources.delete_accessors(resource_id, None) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/accessors" + ) + + +@pytest.mark.unit +class TestAccessControlErrorHandling: + """Tests for access control error scenarios.""" + + def test_accessor_not_found_returns_404(self, mock_client, mock_http_client): + """Test that accessing non-existent resource returns 404.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/accessors", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_accessors(resource_id) + + def test_insufficient_permissions_returns_403(self, mock_client, mock_http_client): + """Test that unauthorized access returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/accessors", + create_http_error(403, "Forbidden"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_accessors(resource_id) + + +@pytest.mark.unit +class TestAccessControlAcrossResources: + """Tests verifying accessor operations work across resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ("lookups", "/data_maps"), + ("projects", "/projects"), + ("teams", "/teams"), + ], + ) + def test_get_accessors_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_accessors works for different resource types.""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"{endpoint}/{resource_id}/accessors", []) + + # Act + resource = getattr(mock_client, resource_name) + accessors = resource.get_accessors(resource_id) + + # Assert + assert accessors == [] + mock_http_client.assert_request_made( + "GET", f"{endpoint}/{resource_id}/accessors" + ) + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_add_accessors_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test add_accessors works for different resource types.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["collaborator"]) + mock_http_client.add_response(f"{endpoint}/{resource_id}/accessors", []) + + # Act + resource = getattr(mock_client, resource_name) + resource.add_accessors(resource_id, [accessor]) + + # Assert + mock_http_client.assert_request_made( + "PUT", f"{endpoint}/{resource_id}/accessors" + ) + + +@pytest.mark.unit +class TestAccessorRequestTypes: + """Tests for different accessor request types (USER, TEAM).""" + + def test_user_accessor_request(self, mock_client, mock_http_client): + """Test creating a USER type accessor request.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["collaborator"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.add_accessors(resource_id, [accessor]) + + # Assert + last_request = mock_http_client.get_last_request() + request_data = last_request.get("json", {}) + assert "accessors" in request_data + accessor_data = request_data["accessors"][0] + assert accessor_data["type"] == "USER" + + def test_team_accessor_request(self, mock_client, mock_http_client): + """Test creating a TEAM type accessor request.""" + # Arrange + resource_id = 123 + accessor = TeamAccessorRequest(id=789, access_roles=["collaborator"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.add_accessors(resource_id, [accessor]) + + # Assert + last_request = mock_http_client.get_last_request() + request_data = last_request.get("json", {}) + assert "accessors" in request_data + accessor_data = request_data["accessors"][0] + assert accessor_data["type"] == "TEAM" + + def test_multiple_access_roles(self, mock_client, mock_http_client): + """Test accessor with multiple access roles.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=["collaborator", "admin"]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.add_accessors(resource_id, [accessor]) + + # Assert + last_request = mock_http_client.get_last_request() + request_data = last_request.get("json", {}) + accessor_data = request_data["accessors"][0] + assert "collaborator" in accessor_data["access_roles"] + assert "admin" in accessor_data["access_roles"] + + +@pytest.mark.unit +class TestAccessRoleTypes: + """Tests for different access role values.""" + + @pytest.mark.parametrize( + "access_role", + ["owner", "collaborator", "admin", "operator"], + ) + def test_supported_access_roles(self, mock_client, mock_http_client, access_role): + """Test that common access roles are accepted.""" + # Arrange + resource_id = 123 + accessor = UserAccessorRequest(id=456, access_roles=[access_role]) + mock_http_client.add_response(f"/data_sources/{resource_id}/accessors", []) + + # Act + mock_client.sources.add_accessors(resource_id, [accessor]) + + # Assert + last_request = mock_http_client.get_last_request() + request_data = last_request.get("json", {}) + accessor_data = request_data["accessors"][0] + assert access_role in accessor_data["access_roles"] diff --git a/tests/unit/test_access_insights.py b/tests/unit/test_access_insights.py new file mode 100644 index 0000000..5bbc42d --- /dev/null +++ b/tests/unit/test_access_insights.py @@ -0,0 +1,426 @@ +"""Unit tests for access insights operations across resources. + +Tests cover: +- get_access_insights: Explain why the current user can access a resource +- get_users_access_insights: Get access insights for all users with access to a resource +- list_accessible: List resources accessible to the current user +""" + +import pytest + +from nexla_sdk.exceptions import AuthorizationError, NotFoundError +from tests.utils import MockResponseBuilder, create_http_error + + +@pytest.mark.unit +class TestGetAccessInsights: + """Tests for get_access_insights operation.""" + + def test_get_access_insights_returns_rules_list( + self, mock_client, mock_http_client + ): + """Test that get_access_insights returns access insights payload.""" + # Arrange + resource_id = 123 + access_insights_response = MockResponseBuilder.access_insights_response( + resource_id=resource_id, + access_granted=True, + access_reason="owner", + access_path=[{"type": "direct", "role": "owner"}], + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/access", access_insights_response + ) + + # Act + result = mock_client.sources.get_access_insights(resource_id) + + # Assert + assert result["access_granted"] is True + assert result["access_reason"] == "owner" + assert result["resource_id"] == resource_id + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/access" + ) + + def test_get_access_insights_with_accessor_user_id_parameter( + self, mock_client, mock_http_client + ): + """Test get_access_insights with accessor_user_id query parameter.""" + # Arrange + resource_id = 123 + accessor_user_id = 456 + access_insights_response = MockResponseBuilder.access_insights_response( + resource_id=resource_id, + access_granted=True, + access_reason="collaborator", + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/access", access_insights_response + ) + + # Act + result = mock_client.sources.get_access_insights( + resource_id, accessor_user_id=accessor_user_id + ) + + # Assert + assert result["access_granted"] is True + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/access" + ) + # Verify the query parameter was passed + last_request = mock_http_client.get_last_request() + assert last_request is not None + params = last_request.get("params", {}) + assert params.get("accessor_user_id") == accessor_user_id + + def test_get_access_insights_owner_rule_present( + self, mock_client, mock_http_client + ): + """Test that access insights correctly identifies owner access.""" + # Arrange + resource_id = 123 + access_insights_response = MockResponseBuilder.access_insights_response( + resource_id=resource_id, + access_granted=True, + access_reason="owner", + access_path=[ + {"type": "direct", "role": "owner"}, + ], + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/access", access_insights_response + ) + + # Act + result = mock_client.sources.get_access_insights(resource_id) + + # Assert + assert result["access_granted"] is True + assert result["access_reason"] == "owner" + assert len(result["access_path"]) > 0 + assert result["access_path"][0]["role"] == "owner" + assert result["access_path"][0]["type"] == "direct" + + def test_get_access_insights_team_member_access( + self, mock_client, mock_http_client + ): + """Test access insights for team member access path.""" + # Arrange + resource_id = 123 + access_insights_response = { + "access_granted": True, + "access_reason": "team_member", + "access_path": [ + { + "type": "team", + "role": "collaborator", + "team_id": 789, + "team_name": "Engineering Team", + } + ], + "resource_id": resource_id, + "resource_type": "data_source", + } + mock_http_client.add_response( + f"/data_sources/{resource_id}/access", access_insights_response + ) + + # Act + result = mock_client.sources.get_access_insights(resource_id) + + # Assert + assert result["access_granted"] is True + assert result["access_reason"] == "team_member" + assert result["access_path"][0]["type"] == "team" + assert result["access_path"][0]["team_id"] == 789 + + +@pytest.mark.unit +class TestGetUsersAccessInsights: + """Tests for get_users_access_insights operation.""" + + def test_get_users_access_insights_returns_user_access_list( + self, mock_client, mock_http_client + ): + """Test that get_users_access_insights returns user access list.""" + # Arrange + resource_id = 123 + users_access_response = { + "users": [ + { + "user_id": 1, + "email": "owner@example.com", + "full_name": "Owner User", + "access_roles": ["owner"], + "access_type": "direct", + }, + { + "user_id": 2, + "email": "collab@example.com", + "full_name": "Collaborator User", + "access_roles": ["collaborator"], + "access_type": "direct", + }, + { + "user_id": 3, + "email": "team@example.com", + "full_name": "Team Member", + "access_roles": ["collaborator"], + "access_type": "team", + "team_id": 789, + }, + ], + "resource_id": resource_id, + } + mock_http_client.add_response( + f"/data_sources/{resource_id}/users_access_insights", users_access_response + ) + + # Act + result = mock_client.sources.get_users_access_insights(resource_id) + + # Assert + assert "users" in result + assert len(result["users"]) == 3 + assert result["resource_id"] == resource_id + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/users_access_insights" + ) + + def test_get_users_access_insights_empty_list(self, mock_client, mock_http_client): + """Test get_users_access_insights when no users have access.""" + # Arrange + resource_id = 123 + users_access_response = { + "users": [], + "resource_id": resource_id, + } + mock_http_client.add_response( + f"/data_sources/{resource_id}/users_access_insights", users_access_response + ) + + # Act + result = mock_client.sources.get_users_access_insights(resource_id) + + # Assert + assert result["users"] == [] + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/users_access_insights" + ) + + +@pytest.mark.unit +class TestListAccessible: + """Tests for list_accessible operation.""" + + def test_list_accessible_returns_accessible_resources( + self, mock_client, mock_http_client + ): + """Test that list_accessible returns list of accessible resources.""" + # Arrange + accessible_sources = [ + MockResponseBuilder.source(source_id=1, name="Source 1"), + MockResponseBuilder.source(source_id=2, name="Source 2"), + MockResponseBuilder.source(source_id=3, name="Source 3"), + ] + mock_http_client.add_response("/data_sources/accessible", accessible_sources) + + # Act + result = mock_client.sources.list_accessible() + + # Assert + assert len(result) == 3 + mock_http_client.assert_request_made("GET", "/data_sources/accessible") + + def test_list_accessible_returns_empty_when_no_access( + self, mock_client, mock_http_client + ): + """Test list_accessible returns empty list when user has no access.""" + # Arrange + mock_http_client.add_response("/data_sources/accessible", []) + + # Act + result = mock_client.sources.list_accessible() + + # Assert + assert result == [] + mock_http_client.assert_request_made("GET", "/data_sources/accessible") + + def test_list_accessible_with_query_params(self, mock_client, mock_http_client): + """Test list_accessible passes additional query parameters.""" + # Arrange + accessible_sources = [MockResponseBuilder.source(source_id=1)] + mock_http_client.add_response("/data_sources/accessible", accessible_sources) + + # Act + result = mock_client.sources.list_accessible(include_metrics=True) + + # Assert + assert len(result) == 1 + mock_http_client.assert_request_made("GET", "/data_sources/accessible") + last_request = mock_http_client.get_last_request() + params = last_request.get("params", {}) + assert params.get("include_metrics") is True + + +@pytest.mark.unit +class TestAccessInsightsErrorHandling: + """Tests for access insights error scenarios.""" + + def test_access_insights_not_found_returns_404(self, mock_client, mock_http_client): + """Test that accessing non-existent resource returns 404.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/access", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_access_insights(resource_id) + + def test_access_insights_permission_denied_returns_403( + self, mock_client, mock_http_client + ): + """Test that unauthorized access returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/access", + create_http_error(403, "Forbidden - insufficient permissions"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_access_insights(resource_id) + + def test_users_access_insights_not_found(self, mock_client, mock_http_client): + """Test users_access_insights for non-existent resource.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/users_access_insights", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_users_access_insights(resource_id) + + def test_users_access_insights_permission_denied( + self, mock_client, mock_http_client + ): + """Test users_access_insights returns 403 for unauthorized access.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/users_access_insights", + create_http_error(403, "Forbidden - owner access required"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_users_access_insights(resource_id) + + +@pytest.mark.unit +class TestAccessInsightsAcrossResources: + """Tests verifying access insights operations work across resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ("lookups", "/data_maps"), + ("projects", "/projects"), + ], + ) + def test_get_access_insights_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_access_insights works for different resource types.""" + # Arrange + resource_id = 123 + access_insights_response = MockResponseBuilder.access_insights_response( + resource_id=resource_id + ) + mock_http_client.add_response( + f"{endpoint}/{resource_id}/access", access_insights_response + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_access_insights(resource_id) + + # Assert + assert result["access_granted"] is True + mock_http_client.assert_request_made("GET", f"{endpoint}/{resource_id}/access") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_get_users_access_insights_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_users_access_insights works for different resource types.""" + # Arrange + resource_id = 123 + users_access_response = { + "users": [ + { + "user_id": 1, + "email": "user@example.com", + "access_roles": ["owner"], + } + ], + "resource_id": resource_id, + } + mock_http_client.add_response( + f"{endpoint}/{resource_id}/users_access_insights", users_access_response + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_users_access_insights(resource_id) + + # Assert + assert "users" in result + mock_http_client.assert_request_made( + "GET", f"{endpoint}/{resource_id}/users_access_insights" + ) + + @pytest.mark.parametrize( + "resource_name,endpoint,builder_method", + [ + ("sources", "/data_sources", "source"), + ("destinations", "/data_sinks", "destination"), + ("nexsets", "/data_sets", "nexset"), + ], + ) + def test_list_accessible_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint, builder_method + ): + """Test list_accessible works for different resource types.""" + # Arrange + builder_func = getattr(MockResponseBuilder, builder_method) + accessible_resources = [builder_func() for _ in range(2)] + mock_http_client.add_response(f"{endpoint}/accessible", accessible_resources) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.list_accessible() + + # Assert + assert len(result) == 2 + mock_http_client.assert_request_made("GET", f"{endpoint}/accessible") diff --git a/tests/unit/test_api_keys.py b/tests/unit/test_api_keys.py new file mode 100644 index 0000000..e1ec21a --- /dev/null +++ b/tests/unit/test_api_keys.py @@ -0,0 +1,179 @@ +"""Unit tests for API keys resource.""" + +import pytest + +from nexla_sdk.models.api_keys.responses import ApiKey, ApiKeysIndex +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_API_KEY = { + "id": 123, + "owner_id": 1, + "org_id": 1, + "data_set_id": 456, + "name": "Dataset API Key", + "description": "API key for dataset access", + "status": "active", + "scope": "read", + "api_key": "ak_test_abc123", + "url": "https://api.nexla.com/v1/data_sets/456", + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_API_KEYS_LIST = [ + SAMPLE_API_KEY, + {**SAMPLE_API_KEY, "id": 124, "name": "Another API Key"}, + {**SAMPLE_API_KEY, "id": 125, "name": "Third API Key"}, +] + +SAMPLE_API_KEYS_GROUPED = { + "data_sets": [SAMPLE_API_KEY], + "data_sinks": [], + "data_sources": [], + "users": [], +} + + +@pytest.fixture +def sample_api_key_response(): + """Sample API key response.""" + return SAMPLE_API_KEY.copy() + + +@pytest.fixture +def sample_api_keys_list(): + """Sample API keys list response.""" + return [k.copy() for k in SAMPLE_API_KEYS_LIST] + + +@pytest.fixture +def sample_api_keys_grouped(): + """Sample grouped API keys response.""" + return SAMPLE_API_KEYS_GROUPED.copy() + + +@pytest.mark.unit +class TestApiKeysResource: + """Unit tests for ApiKeysResource using mocks.""" + + def test_list_api_keys_success( + self, mock_client, mock_http_client, sample_api_keys_list + ): + """Test listing API keys with successful response.""" + mock_http_client.add_response("/api_keys", sample_api_keys_list) + + keys = mock_client.api_keys.list() + + assert len(keys) == 3 + assert_model_list_valid(keys, ApiKey) + mock_http_client.assert_request_made("GET", "/api_keys") + + def test_list_grouped_api_keys_success( + self, mock_client, mock_http_client, sample_api_keys_grouped + ): + """Test listing grouped API keys.""" + mock_http_client.add_response("/api_keys", sample_api_keys_grouped) + + result = mock_client.api_keys.list_grouped() + + assert isinstance(result, ApiKeysIndex) + assert len(result.data_sets) == 1 + mock_http_client.assert_request_made("GET", "/api_keys") + + def test_get_api_key_success( + self, mock_client, mock_http_client, sample_api_key_response + ): + """Test getting a single API key.""" + key_id = 123 + mock_http_client.add_response(f"/api_keys/{key_id}", sample_api_key_response) + + key = mock_client.api_keys.get(key_id) + + assert_model_valid(key, {"id": key_id}) + mock_http_client.assert_request_made("GET", f"/api_keys/{key_id}") + + def test_get_api_key_by_value( + self, mock_client, mock_http_client, sample_api_key_response + ): + """Test getting an API key by its value.""" + key_value = "ak_test_abc123" + mock_http_client.add_response(f"/api_keys/{key_value}", sample_api_key_response) + + key = mock_client.api_keys.get(key_value) + + assert key.api_key == key_value + mock_http_client.assert_request_made("GET", f"/api_keys/{key_value}") + + def test_search_api_keys_success( + self, mock_client, mock_http_client, sample_api_keys_list + ): + """Test searching API keys.""" + mock_http_client.add_response("/api_keys/search", sample_api_keys_list) + + filters = {"scope": "read"} + keys = mock_client.api_keys.search(filters) + + assert len(keys) == 3 + mock_http_client.assert_request_made("POST", "/api_keys/search") + + +@pytest.mark.unit +class TestApiKeyModels: + """Unit tests for API key models.""" + + def test_api_key_model_validation(self, sample_api_key_response): + """Test ApiKey model parses valid data correctly.""" + key = ApiKey.model_validate(sample_api_key_response) + + assert key.id == 123 + assert key.name == "Dataset API Key" + assert key.scope == "read" + assert key.api_key == "ak_test_abc123" + + def test_api_keys_index_model_validation(self, sample_api_keys_grouped): + """Test ApiKeysIndex model parses valid data correctly.""" + index = ApiKeysIndex.model_validate(sample_api_keys_grouped) + + assert len(index.data_sets) == 1 + assert len(index.data_sinks) == 0 + + def test_api_key_model_with_minimal_data(self): + """Test ApiKey model with minimal required fields.""" + minimal_data = { + "id": 1, + } + key = ApiKey.model_validate(minimal_data) + + assert key.id == 1 + assert key.name is None + assert key.api_key is None + + +@pytest.mark.unit +class TestApiKeysUnsupportedOperations: + """Test that unsupported write operations raise NotImplementedError.""" + + def test_create_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.create({"name": "test"}) + + def test_update_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.update(123, {"name": "test"}) + + def test_delete_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.delete(123) + + def test_copy_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.copy(123) + + def test_activate_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.activate(123) + + def test_pause_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="read-only"): + mock_client.api_keys.pause(123) diff --git a/tests/unit/test_approval_requests.py b/tests/unit/test_approval_requests.py index f5f2d6c..a4bb61a 100644 --- a/tests/unit/test_approval_requests.py +++ b/tests/unit/test_approval_requests.py @@ -32,3 +32,11 @@ def test_lists_and_actions(self, client, mock_http_client): ) rj = client.approval_requests.reject(2, reason="not needed") assert rj.id == 2 + mock_http_client.assert_request_made("DELETE", "/approval_requests/2/reject") + + mock_http_client.clear_responses() + mock_http_client.add_response( + "/approval_requests/2/cancel", {"id": 2, "status": "cancelled"} + ) + cn = client.approval_requests.cancel(2) + assert cn.id == 2 diff --git a/tests/unit/test_audit_log.py b/tests/unit/test_audit_log.py new file mode 100644 index 0000000..6622211 --- /dev/null +++ b/tests/unit/test_audit_log.py @@ -0,0 +1,525 @@ +"""Unit tests for audit log operations across resources. + +Tests the get_audit_log functionality provided by BaseResource, which +retrieves audit history for resources via GET /{endpoint}/{id}/audit_log. +""" + +import pytest + +from nexla_sdk.exceptions import AuthorizationError, NotFoundError +from tests.utils import MockResponseBuilder, create_http_error + + +@pytest.mark.unit +class TestGetAuditLog: + """Tests for get_audit_log operations.""" + + def test_get_audit_log_returns_list(self, mock_client, mock_http_client): + """Test that get_audit_log returns a list of audit log entries.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="create"), + MockResponseBuilder.audit_log_entry(event="update"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert isinstance(result, list) + assert len(result) == 2 + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/audit_log" + ) + + def test_get_audit_log_empty_list(self, mock_client, mock_http_client): + """Test getting audit log returns empty list when no entries exist.""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"/data_sources/{resource_id}/audit_log", []) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "GET", f"/data_sources/{resource_id}/audit_log" + ) + + def test_get_audit_log_single_entry(self, mock_client, mock_http_client): + """Test getting audit log with a single entry.""" + # Arrange + resource_id = 456 + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="create", + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + assert result[0]["event"] == "create" + assert result[0]["item_type"] == "DataSource" + + def test_get_audit_log_with_date_filters(self, mock_client, mock_http_client): + """Test get_audit_log passes from_date and to_date as query params.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="create"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log( + resource_id, from_date="2024-01-01", to_date="2024-01-31" + ) + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == {"from": "2024-01-01", "to": "2024-01-31"} + + def test_get_audit_log_with_event_filter(self, mock_client, mock_http_client): + """Test get_audit_log passes event_filter as query param.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="create"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log(resource_id, event_filter="create") + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == {"event_filter": "create"} + + def test_get_audit_log_with_change_filter(self, mock_client, mock_http_client): + """Test get_audit_log passes change_filter as query param.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="update"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log(resource_id, change_filter="attribute") + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == {"change_filter": "attribute"} + + def test_get_audit_log_with_pagination(self, mock_client, mock_http_client): + """Test get_audit_log passes page and per_page as query params.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="create"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log(resource_id, page=2, per_page=25) + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == {"page": 2, "per_page": 25} + + def test_get_audit_log_with_all_params(self, mock_client, mock_http_client): + """Test get_audit_log passes all optional params as query params.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="update"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log( + resource_id, + from_date="2024-01-01", + to_date="2024-01-31", + event_filter="create", + change_filter="attribute", + page=2, + per_page=25, + ) + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == { + "from": "2024-01-01", + "to": "2024-01-31", + "event_filter": "create", + "change_filter": "attribute", + "page": 2, + "per_page": 25, + } + + def test_get_audit_log_with_no_optional_params(self, mock_client, mock_http_client): + """Test get_audit_log sends no query params when none are provided.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry(event="create"), + ] + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", audit_entries + ) + + # Act + mock_client.sources.get_audit_log(resource_id) + + # Assert + params = mock_http_client.get_last_request()["params"] + assert params == {} + + +@pytest.mark.unit +class TestAuditLogEntryFields: + """Tests for verifying audit log entry structure and fields.""" + + def test_entry_has_required_fields(self, mock_client, mock_http_client): + """Test that audit log entry has required fields.""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="update", + object_changes={"name": ["Old Name", "New Name"]}, + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + entry = result[0] + # Verify required fields are present + assert "item_type" in entry + assert "item_id" in entry + assert "event" in entry + assert "object_changes" in entry + assert "created_at" in entry + + def test_entry_has_user_information(self, mock_client, mock_http_client): + """Test that audit log entry contains user information.""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + owner_id=456, + owner_email="user@example.com", + user={"id": 456, "email": "user@example.com"}, + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + entry = result[0] + assert "owner_id" in entry + assert "owner_email" in entry + assert "user" in entry + assert entry["user"]["email"] == "user@example.com" + + def test_entry_has_request_metadata(self, mock_client, mock_http_client): + """Test that audit log entry contains request metadata.""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + request_ip="192.168.1.1", + request_user_agent="Mozilla/5.0 Test", + request_url="/api/v1/data_sources/123", + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + entry = result[0] + assert "request_ip" in entry + assert "request_user_agent" in entry + assert "request_url" in entry + + +@pytest.mark.unit +class TestAuditLogEventTypes: + """Tests for different audit log event types.""" + + def test_create_event(self, mock_client, mock_http_client): + """Test audit log entry with create event.""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="create", + object_changes={}, + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + assert result[0]["event"] == "create" + + def test_update_event_includes_object_changes(self, mock_client, mock_http_client): + """Test audit log entry with update event includes object_changes.""" + # Arrange + resource_id = 123 + object_changes = { + "name": ["Original Name", "Updated Name"], + "status": ["DRAFT", "ACTIVE"], + } + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="update", + object_changes=object_changes, + change_summary=["name", "status"], + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + entry = result[0] + assert entry["event"] == "update" + assert "object_changes" in entry + assert entry["object_changes"]["name"] == ["Original Name", "Updated Name"] + assert entry["object_changes"]["status"] == ["DRAFT", "ACTIVE"] + + def test_destroy_event(self, mock_client, mock_http_client): + """Test audit log entry with destroy event.""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="destroy", + object_changes={}, + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + assert result[0]["event"] == "destroy" + + def test_association_event(self, mock_client, mock_http_client): + """Test audit log entry with association events (e.g., add_accessor).""" + # Arrange + resource_id = 123 + audit_entry = MockResponseBuilder.audit_log_entry( + item_type="DataSource", + item_id=resource_id, + event="add_accessor", + object_changes={ + "accessor_type": [None, "USER"], + "accessor_id": [None, 456], + }, + ) + mock_http_client.add_response( + f"/data_sources/{resource_id}/audit_log", [audit_entry] + ) + + # Act + result = mock_client.sources.get_audit_log(resource_id) + + # Assert + assert len(result) == 1 + assert result[0]["event"] == "add_accessor" + assert result[0]["object_changes"]["accessor_type"] == [None, "USER"] + + +@pytest.mark.unit +class TestAuditLogErrorHandling: + """Tests for audit log error scenarios.""" + + def test_audit_log_not_found_returns_404(self, mock_client, mock_http_client): + """Test that accessing audit log of non-existent resource returns 404.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/audit_log", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_audit_log(resource_id) + + def test_audit_log_permission_denied_returns_403( + self, mock_client, mock_http_client + ): + """Test that unauthorized access to audit log returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/audit_log", + create_http_error(403, "Forbidden"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_audit_log(resource_id) + + +@pytest.mark.unit +class TestAuditLogAcrossResources: + """Tests verifying audit log operations work across resource types. + + Note: TeamsResource has its own get_audit_log implementation that returns + LogEntry model objects instead of raw dicts. It is tested separately. + """ + + @pytest.mark.parametrize( + "resource_name,endpoint,item_type", + [ + ("sources", "/data_sources", "DataSource"), + ("destinations", "/data_sinks", "DataSink"), + ("nexsets", "/data_sets", "DataSet"), + ("credentials", "/data_credentials", "DataCredential"), + ("lookups", "/data_maps", "DataMap"), + ("projects", "/projects", "Project"), + ], + ) + def test_get_audit_log_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint, item_type + ): + """Test get_audit_log works for different resource types.""" + # Arrange + resource_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry( + item_type=item_type, + item_id=resource_id, + event="create", + ), + MockResponseBuilder.audit_log_entry( + item_type=item_type, + item_id=resource_id, + event="update", + ), + ] + mock_http_client.add_response( + f"{endpoint}/{resource_id}/audit_log", audit_entries + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_audit_log(resource_id) + + # Assert + assert len(result) == 2 + assert result[0]["item_type"] == item_type + mock_http_client.assert_request_made( + "GET", f"{endpoint}/{resource_id}/audit_log" + ) + + def test_teams_get_audit_log_returns_model_objects( + self, mock_client, mock_http_client + ): + """Test teams.get_audit_log returns LogEntry model objects. + + Note: TeamsResource has its own get_audit_log that parses responses + into LogEntry model objects rather than returning raw dicts. + """ + # Arrange + team_id = 123 + audit_entries = [ + MockResponseBuilder.audit_log_entry( + item_type="Team", + item_id=team_id, + event="create", + ), + MockResponseBuilder.audit_log_entry( + item_type="Team", + item_id=team_id, + event="update", + ), + ] + mock_http_client.add_response(f"/teams/{team_id}/audit_log", audit_entries) + + # Act + result = mock_client.teams.get_audit_log(team_id) + + # Assert + assert len(result) == 2 + # LogEntry is a model object, so access via attributes + assert result[0].item_type == "Team" + assert result[0].event == "create" + assert result[1].event == "update" + mock_http_client.assert_request_made("GET", f"/teams/{team_id}/audit_log") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_audit_log_empty_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_audit_log returns empty list for resource types with no history.""" + # Arrange + resource_id = 789 + mock_http_client.add_response(f"{endpoint}/{resource_id}/audit_log", []) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_audit_log(resource_id) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "GET", f"{endpoint}/{resource_id}/audit_log" + ) diff --git a/tests/unit/test_auth_templates.py b/tests/unit/test_auth_templates.py new file mode 100644 index 0000000..0efe1a9 --- /dev/null +++ b/tests/unit/test_auth_templates.py @@ -0,0 +1,204 @@ +"""Unit tests for auth templates resource.""" + +import pytest + +from nexla_sdk.models.auth_templates.requests import ( + AuthTemplateCreate, + AuthTemplateUpdate, +) +from nexla_sdk.models.auth_templates.responses import AuthTemplate +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_AUTH_TEMPLATE = { + "id": 123, + "name": "oauth2_standard", + "display_name": "OAuth 2.0 Standard", + "description": "Standard OAuth 2.0 authentication template", + "config": {}, + "credentials_type": "oauth2", + "vendor_id": 456, + "vendor": {"id": 456, "name": "salesforce", "display_name": "Salesforce"}, + "auth_parameters": [ + { + "id": 1, + "name": "client_id", + "display_name": "Client ID", + "param_type": "string", + "required": True, + }, + { + "id": 2, + "name": "client_secret", + "display_name": "Client Secret", + "param_type": "password", + "required": True, + }, + ], + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_AUTH_TEMPLATES_LIST = [ + SAMPLE_AUTH_TEMPLATE, + {**SAMPLE_AUTH_TEMPLATE, "id": 124, "name": "api_key", "display_name": "API Key"}, + { + **SAMPLE_AUTH_TEMPLATE, + "id": 125, + "name": "basic_auth", + "display_name": "Basic Auth", + }, +] + + +@pytest.fixture +def sample_auth_template_response(): + """Sample auth template response.""" + return SAMPLE_AUTH_TEMPLATE.copy() + + +@pytest.fixture +def sample_auth_templates_list(): + """Sample auth templates list response.""" + return [t.copy() for t in SAMPLE_AUTH_TEMPLATES_LIST] + + +@pytest.mark.unit +class TestAuthTemplatesResource: + """Unit tests for AuthTemplatesResource using mocks.""" + + def test_list_auth_templates_success( + self, mock_client, mock_http_client, sample_auth_templates_list + ): + """Test listing auth templates with successful response.""" + mock_http_client.add_response("/auth_templates", sample_auth_templates_list) + + templates = mock_client.auth_templates.list() + + assert len(templates) == 3 + assert_model_list_valid(templates, AuthTemplate) + mock_http_client.assert_request_made("GET", "/auth_templates") + + def test_get_auth_template_by_id( + self, mock_client, mock_http_client, sample_auth_template_response + ): + """Test getting an auth template by ID.""" + template_id = 123 + mock_http_client.add_response( + f"/auth_templates/{template_id}", sample_auth_template_response + ) + + template = mock_client.auth_templates.get(template_id) + + assert_model_valid(template, {"id": template_id}) + mock_http_client.assert_request_made("GET", f"/auth_templates/{template_id}") + + def test_get_auth_template_by_name( + self, mock_client, mock_http_client, sample_auth_template_response + ): + """Test getting an auth template by name.""" + mock_http_client.add_response("/auth_templates", sample_auth_template_response) + + template = mock_client.auth_templates.get_by_name("oauth2_standard") + + assert template.name == "oauth2_standard" + mock_http_client.assert_request_made("GET", "/auth_templates") + + def test_create_auth_template_success( + self, mock_client, mock_http_client, sample_auth_template_response + ): + """Test creating an auth template.""" + mock_http_client.add_response("/auth_templates", sample_auth_template_response) + + create_data = AuthTemplateCreate( + name="new_template", + vendor_id=456, + display_name="New Template", + ) + template = mock_client.auth_templates.create(create_data) + + assert_model_valid(template, {"name": "oauth2_standard"}) + mock_http_client.assert_request_made("POST", "/auth_templates") + + def test_update_auth_template_success( + self, mock_client, mock_http_client, sample_auth_template_response + ): + """Test updating an auth template.""" + template_id = 123 + updated_response = {**sample_auth_template_response, "description": "Updated"} + mock_http_client.add_response( + f"/auth_templates/{template_id}", updated_response + ) + + update_data = AuthTemplateUpdate(description="Updated") + template = mock_client.auth_templates.update(template_id, update_data) + + assert template.description == "Updated" + mock_http_client.assert_request_made("PUT", f"/auth_templates/{template_id}") + + def test_delete_auth_template_success(self, mock_client, mock_http_client): + """Test deleting an auth template.""" + template_id = 123 + mock_http_client.add_response( + f"/auth_templates/{template_id}", {"success": True} + ) + + result = mock_client.auth_templates.delete(template_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/auth_templates/{template_id}") + + +@pytest.mark.unit +class TestAuthTemplateModels: + """Unit tests for auth template models.""" + + def test_auth_template_model_validation(self, sample_auth_template_response): + """Test AuthTemplate model parses valid data correctly.""" + template = AuthTemplate.model_validate(sample_auth_template_response) + + assert template.id == 123 + assert template.name == "oauth2_standard" + assert template.display_name == "OAuth 2.0 Standard" + assert template.vendor.id == 456 + assert len(template.auth_parameters) == 2 + + def test_auth_template_model_with_minimal_data(self): + """Test AuthTemplate model with minimal required fields.""" + minimal_data = { + "id": 1, + } + template = AuthTemplate.model_validate(minimal_data) + + assert template.id == 1 + assert template.name is None + assert template.auth_parameters == [] + + def test_auth_template_create_model_serialization(self): + """Test AuthTemplateCreate model serialization.""" + create_data = AuthTemplateCreate( + name="new_template", + vendor_id=456, + display_name="New Template", + description="A new auth template", + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["name"] == "new_template" + assert data["vendor_id"] == 456 + assert data["display_name"] == "New Template" + + def test_auth_template_update_model_serialization(self): + """Test AuthTemplateUpdate model serialization.""" + update_data = AuthTemplateUpdate( + display_name="Updated Name", + description="Updated description", + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["display_name"] == "Updated Name" + assert data["description"] == "Updated description" + assert "name" not in data + assert "vendor_id" not in data diff --git a/tests/test_client_init.py b/tests/unit/test_client_init.py similarity index 93% rename from tests/test_client_init.py rename to tests/unit/test_client_init.py index f0f7ce3..df93f4c 100644 --- a/tests/test_client_init.py +++ b/tests/unit/test_client_init.py @@ -98,3 +98,10 @@ def test_create_webhook_client_shares_http_client(): # The webhook client should use the same HTTP client as the parent assert webhook_client._http_client is client.http_client + + +def test_client_does_not_expose_removed_mcp_resources(): + client = NexlaClient(service_key="test_service_key") + assert not hasattr(client, "tools") + assert not hasattr(client, "tool_sets") + assert not hasattr(client, "mcp_sessions") diff --git a/tests/unit/test_cluster_endpoints.py b/tests/unit/test_cluster_endpoints.py new file mode 100644 index 0000000..7db32ea --- /dev/null +++ b/tests/unit/test_cluster_endpoints.py @@ -0,0 +1,213 @@ +"""Unit tests for cluster endpoints resource.""" + +import pytest + +from nexla_sdk.models.clusters.requests import ( + ClusterEndpointCreate, + ClusterEndpointUpdate, +) +from nexla_sdk.models.clusters.responses import ClusterEndpoint +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_CLUSTER_ENDPOINT = { + "id": 456, + "cluster_id": 123, + "org_id": 1, + "service": "data_ingestion", + "protocol": "https", + "host": "ingestion.example.com", + "port": 443, + "context": "/api/v1", + "org": {"id": 1, "name": "Test Org", "email_domain": "example.com"}, + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_ENDPOINTS_LIST = [ + SAMPLE_CLUSTER_ENDPOINT, + {**SAMPLE_CLUSTER_ENDPOINT, "id": 457, "service": "metrics"}, + {**SAMPLE_CLUSTER_ENDPOINT, "id": 458, "service": "transform"}, +] + + +@pytest.fixture +def sample_endpoint_response(): + """Sample cluster endpoint response.""" + return SAMPLE_CLUSTER_ENDPOINT.copy() + + +@pytest.fixture +def sample_endpoints_list(): + """Sample cluster endpoints list response.""" + return [e.copy() for e in SAMPLE_ENDPOINTS_LIST] + + +@pytest.mark.unit +class TestClusterEndpointsResource: + """Unit tests for ClusterEndpointsResource using mocks.""" + + def test_list_endpoints_success( + self, mock_client, mock_http_client, sample_endpoints_list + ): + """Test listing cluster endpoints with successful response.""" + mock_http_client.add_response("/cluster_endpoints", sample_endpoints_list) + + endpoints = mock_client.cluster_endpoints.list() + + assert len(endpoints) == 3 + assert_model_list_valid(endpoints, ClusterEndpoint) + mock_http_client.assert_request_made("GET", "/cluster_endpoints") + + def test_list_endpoints_with_pagination( + self, mock_client, mock_http_client, sample_endpoints_list + ): + """Test listing endpoints with pagination.""" + mock_http_client.add_response("/cluster_endpoints", sample_endpoints_list) + + endpoints = mock_client.cluster_endpoints.list(page=1, per_page=10) + + assert len(endpoints) == 3 + request = mock_http_client.get_request() + assert "page" in str(request) or "per_page" in str(request) + + def test_get_endpoint_success( + self, mock_client, mock_http_client, sample_endpoint_response + ): + """Test getting a single cluster endpoint.""" + endpoint_id = 456 + mock_http_client.add_response( + f"/cluster_endpoints/{endpoint_id}", sample_endpoint_response + ) + + endpoint = mock_client.cluster_endpoints.get(endpoint_id) + + assert_model_valid(endpoint, {"id": endpoint_id}) + mock_http_client.assert_request_made("GET", f"/cluster_endpoints/{endpoint_id}") + + def test_create_endpoint_success( + self, mock_client, mock_http_client, sample_endpoint_response + ): + """Test creating a cluster endpoint.""" + mock_http_client.add_response("/cluster_endpoints", sample_endpoint_response) + + create_data = ClusterEndpointCreate( + cluster_id=123, + service="data_ingestion", + protocol="https", + host="ingestion.example.com", + port=443, + ) + endpoint = mock_client.cluster_endpoints.create(create_data) + + assert_model_valid(endpoint, {"service": "data_ingestion"}) + mock_http_client.assert_request_made("POST", "/cluster_endpoints") + + def test_update_endpoint_success( + self, mock_client, mock_http_client, sample_endpoint_response + ): + """Test updating a cluster endpoint.""" + endpoint_id = 456 + updated_response = {**sample_endpoint_response, "host": "new-host.example.com"} + mock_http_client.add_response( + f"/cluster_endpoints/{endpoint_id}", updated_response + ) + + update_data = ClusterEndpointUpdate(host="new-host.example.com") + endpoint = mock_client.cluster_endpoints.update(endpoint_id, update_data) + + assert endpoint.host == "new-host.example.com" + mock_http_client.assert_request_made("PUT", f"/cluster_endpoints/{endpoint_id}") + + def test_get_audit_log_success(self, mock_client, mock_http_client): + """Test getting audit log for an endpoint.""" + endpoint_id = 456 + audit_log = [ + {"action": "create", "timestamp": "2025-01-01T00:00:00Z"}, + {"action": "update", "timestamp": "2025-01-02T00:00:00Z"}, + ] + mock_http_client.add_response( + f"/cluster_endpoints/{endpoint_id}/audit_log", audit_log + ) + + result = mock_client.cluster_endpoints.get_audit_log(endpoint_id) + + assert len(result) == 2 + mock_http_client.assert_request_made( + "GET", f"/cluster_endpoints/{endpoint_id}/audit_log" + ) + + def test_get_audit_log_with_pagination(self, mock_client, mock_http_client): + """Test getting audit log with pagination.""" + endpoint_id = 456 + audit_log = [{"action": "create", "timestamp": "2025-01-01T00:00:00Z"}] + mock_http_client.add_response( + f"/cluster_endpoints/{endpoint_id}/audit_log", audit_log + ) + + result = mock_client.cluster_endpoints.get_audit_log( + endpoint_id, page=1, per_page=10 + ) + + assert len(result) == 1 + request = mock_http_client.get_request() + assert "page" in str(request) or "per_page" in str(request) + + +@pytest.mark.unit +class TestClusterEndpointModels: + """Unit tests for cluster endpoint models.""" + + def test_endpoint_model_validation(self, sample_endpoint_response): + """Test ClusterEndpoint model parses valid data correctly.""" + endpoint = ClusterEndpoint.model_validate(sample_endpoint_response) + + assert endpoint.id == 456 + assert endpoint.cluster_id == 123 + assert endpoint.service == "data_ingestion" + assert endpoint.protocol == "https" + assert endpoint.host == "ingestion.example.com" + assert endpoint.port == 443 + + def test_endpoint_model_with_minimal_data(self): + """Test ClusterEndpoint model with minimal required fields.""" + minimal_data = { + "id": 1, + } + endpoint = ClusterEndpoint.model_validate(minimal_data) + + assert endpoint.id == 1 + assert endpoint.service is None + assert endpoint.host is None + + def test_endpoint_create_model_serialization(self): + """Test ClusterEndpointCreate model serialization.""" + create_data = ClusterEndpointCreate( + cluster_id=123, + service="data_ingestion", + protocol="https", + host="api.example.com", + port=443, + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["cluster_id"] == 123 + assert data["service"] == "data_ingestion" + assert data["protocol"] == "https" + assert data["host"] == "api.example.com" + assert data["port"] == 443 + + def test_endpoint_update_model_serialization(self): + """Test ClusterEndpointUpdate model serialization.""" + update_data = ClusterEndpointUpdate( + host="new-host.example.com", + port=8443, + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["host"] == "new-host.example.com" + assert data["port"] == 8443 + assert "cluster_id" not in data + assert "service" not in data diff --git a/tests/unit/test_clusters.py b/tests/unit/test_clusters.py new file mode 100644 index 0000000..9f16304 --- /dev/null +++ b/tests/unit/test_clusters.py @@ -0,0 +1,287 @@ +"""Unit tests for clusters resource.""" + +import pytest + +from nexla_sdk.models.clusters.requests import ( + ClusterCreate, + ClusterEndpointItem, + ClusterUpdate, +) +from nexla_sdk.models.clusters.responses import Cluster +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_CLUSTER = { + "id": 123, + "org_id": 1, + "uid": "cluster-uid-123", + "is_default": False, + "is_private": False, + "name": "Production Cluster", + "description": "Main production cluster", + "status": "ACTIVE", + "region": "us-west-2", + "provider": "aws", + "org": {"id": 1, "name": "Test Org", "email_domain": "example.com"}, + "endpoints": [ + { + "id": 1, + "service": "data_ingestion", + "protocol": "https", + "host": "ingestion.example.com", + "port": 443, + } + ], + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_CLUSTERS_LIST = [ + SAMPLE_CLUSTER, + {**SAMPLE_CLUSTER, "id": 124, "name": "Staging Cluster"}, + {**SAMPLE_CLUSTER, "id": 125, "name": "Dev Cluster"}, +] + + +@pytest.fixture +def sample_cluster_response(): + """Sample cluster response.""" + return SAMPLE_CLUSTER.copy() + + +@pytest.fixture +def sample_clusters_list(): + """Sample clusters list response.""" + return [c.copy() for c in SAMPLE_CLUSTERS_LIST] + + +@pytest.mark.unit +class TestClustersResource: + """Unit tests for ClustersResource using mocks.""" + + def test_list_clusters_success( + self, mock_client, mock_http_client, sample_clusters_list + ): + """Test listing clusters with successful response.""" + mock_http_client.add_response("/clusters", sample_clusters_list) + + clusters = mock_client.clusters.list() + + assert len(clusters) == 3 + assert_model_list_valid(clusters, Cluster) + mock_http_client.assert_request_made("GET", "/clusters") + + def test_list_clusters_with_pagination( + self, mock_client, mock_http_client, sample_clusters_list + ): + """Test listing clusters with pagination.""" + mock_http_client.add_response("/clusters", sample_clusters_list) + + clusters = mock_client.clusters.list(page=1, per_page=10) + + assert len(clusters) == 3 + request = mock_http_client.get_request() + assert "page" in str(request) or "per_page" in str(request) + + def test_get_cluster_success( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test getting a single cluster.""" + cluster_id = 123 + mock_http_client.add_response( + f"/clusters/{cluster_id}", sample_cluster_response + ) + + cluster = mock_client.clusters.get(cluster_id) + + assert_model_valid(cluster, {"id": cluster_id}) + mock_http_client.assert_request_made("GET", f"/clusters/{cluster_id}") + + def test_create_cluster_success( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test creating a cluster.""" + mock_http_client.add_response("/clusters", sample_cluster_response) + + create_data = ClusterCreate( + org_id=1, + name="Production Cluster", + region="us-west-2", + provider="aws", + ) + cluster = mock_client.clusters.create(create_data) + + assert_model_valid(cluster, {"name": "Production Cluster"}) + mock_http_client.assert_request_made("POST", "/clusters") + + def test_create_cluster_with_endpoints( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test creating a cluster with endpoints.""" + mock_http_client.add_response("/clusters", sample_cluster_response) + + create_data = ClusterCreate( + org_id=1, + name="Production Cluster", + region="us-west-2", + endpoints=[ + ClusterEndpointItem( + service="data_ingestion", + protocol="https", + host="ingestion.example.com", + port=443, + ) + ], + ) + cluster = mock_client.clusters.create(create_data) + + assert cluster.endpoints is not None + mock_http_client.assert_request_made("POST", "/clusters") + + def test_update_cluster_success( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test updating a cluster.""" + cluster_id = 123 + updated_response = {**sample_cluster_response, "name": "Updated Cluster"} + mock_http_client.add_response(f"/clusters/{cluster_id}", updated_response) + + update_data = ClusterUpdate(name="Updated Cluster") + cluster = mock_client.clusters.update(cluster_id, update_data) + + assert cluster.name == "Updated Cluster" + mock_http_client.assert_request_made("PUT", f"/clusters/{cluster_id}") + + def test_delete_cluster_success(self, mock_client, mock_http_client): + """Test deleting a cluster.""" + cluster_id = 123 + mock_http_client.add_response(f"/clusters/{cluster_id}", {"success": True}) + + result = mock_client.clusters.delete(cluster_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/clusters/{cluster_id}") + + def test_activate_cluster_success( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test activating a cluster.""" + cluster_id = 123 + active_response = {**sample_cluster_response, "status": "ACTIVE"} + mock_http_client.add_response( + f"/clusters/{cluster_id}/activate", active_response + ) + + cluster = mock_client.clusters.activate(cluster_id) + + assert cluster.status == "ACTIVE" + mock_http_client.assert_request_made("PUT", f"/clusters/{cluster_id}/activate") + + def test_set_default_cluster_success( + self, mock_client, mock_http_client, sample_cluster_response + ): + """Test setting a cluster as default.""" + cluster_id = 123 + default_response = {**sample_cluster_response, "is_default": True} + mock_http_client.add_response( + f"/clusters/default/{cluster_id}", default_response + ) + + cluster = mock_client.clusters.set_default(cluster_id) + + assert cluster.is_default is True + mock_http_client.assert_request_made("PUT", f"/clusters/default/{cluster_id}") + + def test_delete_endpoint_success(self, mock_client, mock_http_client): + """Test deleting a cluster endpoint.""" + cluster_id = 123 + endpoint_id = 456 + mock_http_client.add_response( + f"/clusters/{cluster_id}/endpoints/{endpoint_id}", {"success": True} + ) + + result = mock_client.clusters.delete_endpoint(cluster_id, endpoint_id) + + assert result["success"] is True + mock_http_client.assert_request_made( + "DELETE", f"/clusters/{cluster_id}/endpoints/{endpoint_id}" + ) + + +@pytest.mark.unit +class TestClusterModels: + """Unit tests for cluster models.""" + + def test_cluster_model_validation(self, sample_cluster_response): + """Test Cluster model parses valid data correctly.""" + cluster = Cluster.model_validate(sample_cluster_response) + + assert cluster.id == 123 + assert cluster.name == "Production Cluster" + assert cluster.status == "ACTIVE" + assert cluster.region == "us-west-2" + assert cluster.provider == "aws" + assert len(cluster.endpoints) == 1 + + def test_cluster_model_with_minimal_data(self): + """Test Cluster model with minimal required fields.""" + minimal_data = { + "id": 1, + } + cluster = Cluster.model_validate(minimal_data) + + assert cluster.id == 1 + assert cluster.name is None + assert cluster.endpoints == [] + + def test_cluster_create_model_serialization(self): + """Test ClusterCreate model serialization.""" + create_data = ClusterCreate( + org_id=1, + name="My Cluster", + region="us-east-1", + provider="aws", + description="Test cluster", + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["org_id"] == 1 + assert data["name"] == "My Cluster" + assert data["region"] == "us-east-1" + assert data["provider"] == "aws" + + def test_cluster_create_with_endpoints_serialization(self): + """Test ClusterCreate with endpoints serialization.""" + create_data = ClusterCreate( + org_id=1, + name="My Cluster", + region="us-east-1", + endpoints=[ + ClusterEndpointItem( + service="data_ingestion", + protocol="https", + host="api.example.com", + port=443, + ) + ], + ) + + data = create_data.model_dump(exclude_none=True) + + assert "endpoints" in data + assert len(data["endpoints"]) == 1 + assert data["endpoints"][0]["service"] == "data_ingestion" + + def test_cluster_update_model_serialization(self): + """Test ClusterUpdate model serialization.""" + update_data = ClusterUpdate( + name="Updated Name", + description="Updated description", + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["name"] == "Updated Name" + assert data["description"] == "Updated description" + assert "region" not in data diff --git a/tests/unit/test_connector_enums.py b/tests/unit/test_connector_enums.py new file mode 100644 index 0000000..df5db0b --- /dev/null +++ b/tests/unit/test_connector_enums.py @@ -0,0 +1,312 @@ +"""Unit tests for connector enum handling.""" + +import pytest + +from nexla_sdk.models.connectors.enums import ConnectionType, ConnectorType +from nexla_sdk.models.credentials.enums import CredentialType +from nexla_sdk.models.destinations.enums import DestinationType +from nexla_sdk.models.sources.enums import SourceType + + +@pytest.mark.unit +class TestConnectorEnumCoverage: + """Test that connector enums have consistent coverage.""" + + def test_source_type_has_all_base_connectors(self): + """SourceType should include core file and database connectors.""" + base_connectors = [ + "s3", + "gcs", + "azure_blb", + "mysql", + "postgres", + "snowflake", + "bigquery", + "kafka", + "rest", + ] + source_values = [e.value for e in SourceType] + for connector in base_connectors: + assert connector in source_values, f"SourceType missing {connector}" + + def test_destination_type_has_all_base_connectors(self): + """DestinationType should include core connectors.""" + base_connectors = [ + "s3", + "gcs", + "azure_blb", + "mysql", + "postgres", + "snowflake", + "bigquery", + "kafka", + "rest", + "pinecone", + ] + dest_values = [e.value for e in DestinationType] + for connector in base_connectors: + assert connector in dest_values, f"DestinationType missing {connector}" + + def test_connector_type_is_superset(self): + """ConnectorType should be a superset of Source and Destination types.""" + connector_values = set(e.value for e in ConnectorType) + source_values = set(e.value for e in SourceType) + dest_values = set(e.value for e in DestinationType) + + # All source types should be in ConnectorType + missing_from_connector = source_values - connector_values + assert ( + len(missing_from_connector) == 0 + ), f"ConnectorType missing source types: {missing_from_connector}" + + # All destination types should be in ConnectorType + missing_from_connector = dest_values - connector_values + assert ( + len(missing_from_connector) == 0 + ), f"ConnectorType missing destination types: {missing_from_connector}" + + def test_source_type_has_cloud_database_connectors(self): + """SourceType should include cloud database connectors.""" + cloud_dbs = [ + "cloudsql_mysql", + "cloudsql_postgres", + "cloudsql_sqlserver", + "gcp_alloydb", + "gcp_spanner", + "azure_synapse", + "aws_athena", + ] + source_values = [e.value for e in SourceType] + for connector in cloud_dbs: + assert connector in source_values, f"SourceType missing {connector}" + + def test_source_type_has_data_lake_connectors(self): + """SourceType should include data lake connectors.""" + data_lakes = [ + "delta_lake_s3", + "delta_lake_azure_blb", + "delta_lake_azure_data_lake", + "s3_iceberg", + ] + source_values = [e.value for e in SourceType] + for connector in data_lakes: + assert connector in source_values, f"SourceType missing {connector}" + + +@pytest.mark.unit +class TestFlexibleEnumsInResponses: + """Test flexible enum behavior in response models.""" + + def test_source_with_known_type(self): + """Source should accept known source_type values.""" + from nexla_sdk.models.sources.responses import Source + + data = { + "id": 1, + "name": "Test Source", + "status": "ACTIVE", + "source_type": "s3", + } + source = Source(**data) + assert source.source_type == SourceType.S3 + + def test_source_with_unknown_type(self): + """Source should accept unknown source_type values as strings.""" + from nexla_sdk.models.sources.responses import Source + + data = { + "id": 1, + "name": "Test Source", + "status": "ACTIVE", + "source_type": "new_future_connector_2026", + } + source = Source(**data) + assert source.source_type == "new_future_connector_2026" + + def test_destination_with_known_type(self): + """Destination should accept known sink_type values.""" + from nexla_sdk.models.destinations.responses import Destination + + data = { + "id": 1, + "name": "Test Dest", + "status": "ACTIVE", + "sink_type": "snowflake", + } + dest = Destination(**data) + assert dest.sink_type == DestinationType.SNOWFLAKE + + def test_destination_with_unknown_type(self): + """Destination should accept unknown sink_type values.""" + from nexla_sdk.models.destinations.responses import Destination + + data = { + "id": 1, + "name": "Test Dest", + "status": "ACTIVE", + "sink_type": "quantum_database_2030", + } + dest = Destination(**data) + assert dest.sink_type == "quantum_database_2030" + + def test_credential_with_known_type(self): + """Credential should accept known credentials_type values.""" + from nexla_sdk.models.credentials.responses import Credential + + data = { + "id": 1, + "name": "Test Cred", + "credentials_type": "s3", + } + cred = Credential(**data) + assert cred.credentials_type == CredentialType.S3 + + def test_credential_with_unknown_type(self): + """Credential should accept unknown credentials_type values.""" + from nexla_sdk.models.credentials.responses import Credential + + data = { + "id": 1, + "name": "Test Cred", + "credentials_type": "new_cloud_provider", + } + cred = Credential(**data) + assert cred.credentials_type == "new_cloud_provider" + + +@pytest.mark.unit +class TestConnectorResponseModel: + """Test Connector model with flexible enums.""" + + def test_connector_with_known_type(self): + """Connector should accept known type values.""" + from nexla_sdk.models.connectors.responses import Connector + + data = { + "id": 123, + "type": "s3", + "connection_type": "file", + "name": "Amazon S3", + "description": "S3 connector", + } + connector = Connector(**data) + assert connector.type == ConnectorType.S3 + assert connector.connection_type == ConnectionType.FILE + + def test_connector_with_unknown_type(self): + """Connector should accept unknown type values.""" + from nexla_sdk.models.connectors.responses import Connector + + data = { + "id": 123, + "type": "new_connector", + "connection_type": "quantum", + "name": "New Connector", + "description": "Future connector", + } + connector = Connector(**data) + assert connector.type == "new_connector" + assert connector.connection_type == "quantum" + + def test_common_connector_with_known_type(self): + """Common Connector model should accept known type values.""" + from nexla_sdk.models.common import Connector + + data = { + "id": 123, + "type": "postgres", + "connection_type": "database", + "name": "PostgreSQL", + "description": "PostgreSQL connector", + "nexset_api_compatible": True, + } + connector = Connector(**data) + assert connector.type == ConnectorType.POSTGRES + assert connector.connection_type == ConnectionType.DATABASE + + def test_common_connector_with_unknown_type(self): + """Common Connector model should accept unknown type values.""" + from nexla_sdk.models.common import Connector + + data = { + "id": 123, + "type": "future_db", + "connection_type": "hyperscale", + "name": "Future DB", + "description": "Future connector", + "nexset_api_compatible": False, + } + connector = Connector(**data) + assert connector.type == "future_db" + assert connector.connection_type == "hyperscale" + + +@pytest.mark.unit +class TestEnumSerialization: + """Test that flexible enums serialize correctly.""" + + def test_known_enum_serializes_to_string(self): + """Known enum values should serialize to their string values.""" + from nexla_sdk.models.sources.responses import Source + + data = { + "id": 1, + "name": "Test", + "status": "ACTIVE", + "source_type": "s3", + } + source = Source(**data) + serialized = source.model_dump() + assert serialized["source_type"] == "s3" + assert isinstance(serialized["source_type"], str) + + def test_unknown_value_serializes_unchanged(self): + """Unknown string values should serialize unchanged.""" + from nexla_sdk.models.sources.responses import Source + + data = { + "id": 1, + "name": "Test", + "status": "ACTIVE", + "source_type": "future_type", + } + source = Source(**data) + serialized = source.model_dump() + assert serialized["source_type"] == "future_type" + + def test_destination_serialization(self): + """Destination with flexible types should serialize correctly.""" + from nexla_sdk.models.destinations.responses import Destination + + data = { + "id": 1, + "name": "Test", + "status": "ACTIVE", + "sink_type": "snowflake", + "connector_type": "snowflake", + } + dest = Destination(**data) + serialized = dest.model_dump() + assert serialized["sink_type"] == "snowflake" + assert serialized["connector_type"] == "snowflake" + + +@pytest.mark.unit +class TestConnectionTypeEnum: + """Test ConnectionType enum values.""" + + def test_connection_type_categories(self): + """ConnectionType should have all expected categories.""" + expected = [ + "file", + "database", + "nosql", + "streaming", + "api", + "vector_db", + "special", + "data_lake", + ] + values = [e.value for e in ConnectionType] + for category in expected: + assert category in values, f"ConnectionType missing {category}" diff --git a/tests/unit/test_connectors.py b/tests/unit/test_connectors.py new file mode 100644 index 0000000..256f543 --- /dev/null +++ b/tests/unit/test_connectors.py @@ -0,0 +1,172 @@ +"""Unit tests for connectors resource.""" + +import pytest + +from nexla_sdk.models.connectors.requests import ConnectorUpdate +from nexla_sdk.models.connectors.responses import Connector +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_CONNECTOR = { + "id": 123, + "type": "s3", + "connection_type": "file", + "name": "Amazon S3", + "description": "Amazon Simple Storage Service connector", + "nexset_api_compatible": True, + "sync_api_compatible": True, + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_CONNECTORS_LIST = [ + SAMPLE_CONNECTOR, + {**SAMPLE_CONNECTOR, "id": 124, "type": "gcs", "name": "Google Cloud Storage"}, + {**SAMPLE_CONNECTOR, "id": 125, "type": "azure_blob", "name": "Azure Blob Storage"}, +] + + +@pytest.fixture +def sample_connector_response(): + """Sample connector response.""" + return SAMPLE_CONNECTOR.copy() + + +@pytest.fixture +def sample_connectors_list(): + """Sample connectors list response.""" + return [c.copy() for c in SAMPLE_CONNECTORS_LIST] + + +@pytest.mark.unit +class TestConnectorsResource: + """Unit tests for ConnectorsResource using mocks.""" + + def test_list_connectors_success( + self, mock_client, mock_http_client, sample_connectors_list + ): + """Test listing connectors with successful response.""" + mock_http_client.add_response("/connectors", sample_connectors_list) + + connectors = mock_client.connectors.list() + + assert len(connectors) == 3 + assert_model_list_valid(connectors, Connector) + mock_http_client.assert_request_made("GET", "/connectors") + + def test_list_connectors_with_filter( + self, mock_client, mock_http_client, sample_connectors_list + ): + """Test listing connectors with API compatibility filter.""" + mock_http_client.add_response("/connectors", sample_connectors_list) + + connectors = mock_client.connectors.list(nexset_api_compatible=True) + + assert len(connectors) == 3 + mock_http_client.assert_request_made("GET", "/connectors") + + def test_get_connector_by_id( + self, mock_client, mock_http_client, sample_connector_response + ): + """Test getting a connector by ID.""" + connector_id = 123 + mock_http_client.add_response( + f"/connectors/{connector_id}", sample_connector_response + ) + + connector = mock_client.connectors.get(connector_id) + + assert_model_valid(connector, {"id": connector_id}) + mock_http_client.assert_request_made("GET", f"/connectors/{connector_id}") + + def test_get_connector_by_type( + self, mock_client, mock_http_client, sample_connector_response + ): + """Test getting a connector by type.""" + connector_type = "s3" + mock_http_client.add_response( + f"/connectors/{connector_type}", sample_connector_response + ) + + connector = mock_client.connectors.get(connector_type) + + assert connector.type == connector_type + mock_http_client.assert_request_made("GET", f"/connectors/{connector_type}") + + def test_update_connector_success( + self, mock_client, mock_http_client, sample_connector_response + ): + """Test updating a connector.""" + connector_id = 123 + updated_response = {**sample_connector_response, "description": "Updated desc"} + mock_http_client.add_response(f"/connectors/{connector_id}", updated_response) + + update_data = ConnectorUpdate(description="Updated desc") + connector = mock_client.connectors.update(connector_id, update_data) + + assert connector.description == "Updated desc" + mock_http_client.assert_request_made("PUT", f"/connectors/{connector_id}") + + +@pytest.mark.unit +class TestConnectorModels: + """Unit tests for connector models.""" + + def test_connector_model_validation(self, sample_connector_response): + """Test Connector model parses valid data correctly.""" + connector = Connector.model_validate(sample_connector_response) + + assert connector.id == 123 + assert connector.type == "s3" + assert connector.name == "Amazon S3" + assert connector.nexset_api_compatible is True + + def test_connector_model_with_minimal_data(self): + """Test Connector model with minimal required fields.""" + minimal_data = { + "id": 1, + } + connector = Connector.model_validate(minimal_data) + + assert connector.id == 1 + assert connector.type is None + assert connector.name is None + + def test_connector_update_model_serialization(self): + """Test ConnectorUpdate model serialization.""" + update_data = ConnectorUpdate( + name="Updated Name", + description="Updated description", + nexset_api_compatible=True, + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["name"] == "Updated Name" + assert data["description"] == "Updated description" + assert data["nexset_api_compatible"] is True + + +@pytest.mark.unit +class TestConnectorsUnsupportedOperations: + """Test that unsupported operations raise NotImplementedError.""" + + def test_create_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="not supported"): + mock_client.connectors.create({"name": "test"}) + + def test_delete_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="not supported"): + mock_client.connectors.delete(123) + + def test_copy_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="not supported"): + mock_client.connectors.copy(123) + + def test_activate_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="not supported"): + mock_client.connectors.activate(123) + + def test_pause_raises_not_implemented(self, mock_client): + with pytest.raises(NotImplementedError, match="not supported"): + mock_client.connectors.pause(123) diff --git a/tests/unit/test_credentials.py b/tests/unit/test_credentials.py index 379383b..257633d 100644 --- a/tests/unit/test_credentials.py +++ b/tests/unit/test_credentials.py @@ -357,6 +357,7 @@ def test_server_error_during_list(self, mock_client, mock_http_client): (403, AuthorizationError), (404, NotFoundError), (409, ResourceConflictError), + (422, SDKValidationError), (429, RateLimitError), (500, ServerError), ], diff --git a/tests/unit/test_docs_operations.py b/tests/unit/test_docs_operations.py new file mode 100644 index 0000000..f700436 --- /dev/null +++ b/tests/unit/test_docs_operations.py @@ -0,0 +1,373 @@ +"""Unit tests for documentation operations across resources. + +Tests for get_docs, set_docs, add_docs, and remove_docs operations +provided by BaseResource for managing resource documentation. +""" + +import pytest + +from nexla_sdk.exceptions import AuthorizationError, NotFoundError +from tests.utils import MockResponseBuilder, create_http_error + + +@pytest.mark.unit +class TestGetDocs: + """Tests for get_docs operation.""" + + def test_get_docs_returns_doc_entries(self, mock_client, mock_http_client): + """Test that get_docs returns documentation entries for a resource.""" + # Arrange + resource_id = 123 + docs_response = MockResponseBuilder.docs_response() + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", docs_response + ) + + # Act + result = mock_client.sources.get_docs(resource_id) + + # Assert + assert result == docs_response + assert "entries" in result + assert len(result["entries"]) > 0 + mock_http_client.assert_request_made("GET", f"/data_sources/{resource_id}/docs") + + def test_get_docs_empty_by_default(self, mock_client, mock_http_client): + """Test getting docs returns empty when no docs exist.""" + # Arrange + resource_id = 123 + empty_docs = {"entries": []} + mock_http_client.add_response(f"/data_sources/{resource_id}/docs", empty_docs) + + # Act + result = mock_client.sources.get_docs(resource_id) + + # Assert + assert result == empty_docs + assert result["entries"] == [] + mock_http_client.assert_request_made("GET", f"/data_sources/{resource_id}/docs") + + +@pytest.mark.unit +class TestSetDocs: + """Tests for set_docs operation (replaces all docs).""" + + def test_set_docs_replaces_all_docs(self, mock_client, mock_http_client): + """Test that set_docs replaces all documentation entries.""" + # Arrange + resource_id = 123 + new_docs = [ + {"key": "description", "value": "New description"}, + {"key": "usage", "value": "New usage instructions"}, + ] + expected_response = {"entries": new_docs} + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", expected_response + ) + + # Act + result = mock_client.sources.set_docs(resource_id, new_docs) + + # Assert + assert result == expected_response + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/docs" + ) + # Verify the request body contains the new docs + last_request = mock_http_client.get_last_request() + assert last_request is not None + assert last_request.get("json") == new_docs + + def test_set_docs_with_empty_list_clears_docs(self, mock_client, mock_http_client): + """Test that set_docs with empty list clears all docs.""" + # Arrange + resource_id = 123 + empty_docs = [] + expected_response = {"entries": []} + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", expected_response + ) + + # Act + result = mock_client.sources.set_docs(resource_id, empty_docs) + + # Assert + assert result == expected_response + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/docs" + ) + + +@pytest.mark.unit +class TestAddDocs: + """Tests for add_docs operation (merges docs).""" + + def test_add_docs_merges_entries(self, mock_client, mock_http_client): + """Test that add_docs merges new documentation entries.""" + # Arrange + resource_id = 123 + docs_to_add = [ + {"key": "new_section", "value": "New section content"}, + ] + merged_response = { + "entries": [ + {"key": "existing", "value": "Existing content"}, + {"key": "new_section", "value": "New section content"}, + ] + } + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", merged_response + ) + + # Act + result = mock_client.sources.add_docs(resource_id, docs_to_add) + + # Assert + assert result == merged_response + mock_http_client.assert_request_made("PUT", f"/data_sources/{resource_id}/docs") + # Verify the request body contains the docs to add + last_request = mock_http_client.get_last_request() + assert last_request is not None + assert last_request.get("json") == docs_to_add + + def test_add_multiple_docs(self, mock_client, mock_http_client): + """Test adding multiple documentation entries at once.""" + # Arrange + resource_id = 123 + docs_to_add = [ + {"key": "overview", "value": "Overview content"}, + {"key": "setup", "value": "Setup instructions"}, + {"key": "examples", "value": "Example usage"}, + ] + merged_response = {"entries": docs_to_add} + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", merged_response + ) + + # Act + result = mock_client.sources.add_docs(resource_id, docs_to_add) + + # Assert + assert result == merged_response + assert len(result["entries"]) == 3 + mock_http_client.assert_request_made("PUT", f"/data_sources/{resource_id}/docs") + # Verify all docs were sent + last_request = mock_http_client.get_last_request() + assert len(last_request.get("json", [])) == 3 + + +@pytest.mark.unit +class TestRemoveDocs: + """Tests for remove_docs operation.""" + + def test_remove_docs_deletes_specific_entries(self, mock_client, mock_http_client): + """Test that remove_docs removes specific documentation entries.""" + # Arrange + resource_id = 123 + docs_to_remove = [ + {"key": "obsolete_section", "value": "To be removed"}, + ] + remaining_response = { + "entries": [ + {"key": "remaining", "value": "Still here"}, + ] + } + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", remaining_response + ) + + # Act + result = mock_client.sources.remove_docs(resource_id, docs_to_remove) + + # Assert + assert result == remaining_response + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/docs" + ) + # Verify the request body contains the docs to remove + last_request = mock_http_client.get_last_request() + assert last_request is not None + assert last_request.get("json") == docs_to_remove + + def test_remove_docs_with_none_sends_empty_list( + self, mock_client, mock_http_client + ): + """Test that remove_docs with None sends empty list.""" + # Arrange + resource_id = 123 + empty_response = {"entries": []} + mock_http_client.add_response( + f"/data_sources/{resource_id}/docs", empty_response + ) + + # Act + result = mock_client.sources.remove_docs(resource_id, None) + + # Assert + assert result == empty_response + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/docs" + ) + # Verify empty list was sent + last_request = mock_http_client.get_last_request() + assert last_request.get("json") == [] + + +@pytest.mark.unit +class TestDocsErrorHandling: + """Tests for error handling in docs operations.""" + + def test_docs_not_found_returns_404(self, mock_client, mock_http_client): + """Test that accessing docs for non-existent resource returns 404.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/docs", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_docs(resource_id) + + def test_docs_permission_denied_returns_403(self, mock_client, mock_http_client): + """Test that unauthorized docs access returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/docs", + create_http_error(403, "Forbidden"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_docs(resource_id) + + def test_set_docs_permission_denied(self, mock_client, mock_http_client): + """Test that unauthorized set_docs access returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/docs", + create_http_error(403, "Forbidden"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.set_docs( + resource_id, [{"key": "test", "value": "data"}] + ) + + +@pytest.mark.unit +class TestDocsAcrossResources: + """Tests verifying docs operations work across resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_get_docs_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_docs works for different resource types.""" + # Arrange + resource_id = 123 + docs_response = MockResponseBuilder.docs_response() + mock_http_client.add_response(f"{endpoint}/{resource_id}/docs", docs_response) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_docs(resource_id) + + # Assert + assert result == docs_response + mock_http_client.assert_request_made("GET", f"{endpoint}/{resource_id}/docs") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_set_docs_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test set_docs works for different resource types.""" + # Arrange + resource_id = 123 + new_docs = [{"key": "test", "value": "Test documentation"}] + expected_response = {"entries": new_docs} + mock_http_client.add_response( + f"{endpoint}/{resource_id}/docs", expected_response + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.set_docs(resource_id, new_docs) + + # Assert + assert result == expected_response + mock_http_client.assert_request_made("POST", f"{endpoint}/{resource_id}/docs") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_add_docs_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test add_docs works for different resource types.""" + # Arrange + resource_id = 123 + docs_to_add = [{"key": "additional", "value": "Additional documentation"}] + expected_response = {"entries": docs_to_add} + mock_http_client.add_response( + f"{endpoint}/{resource_id}/docs", expected_response + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.add_docs(resource_id, docs_to_add) + + # Assert + assert result == expected_response + mock_http_client.assert_request_made("PUT", f"{endpoint}/{resource_id}/docs") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_remove_docs_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test remove_docs works for different resource types.""" + # Arrange + resource_id = 123 + docs_to_remove = [{"key": "obsolete", "value": "Obsolete documentation"}] + expected_response = {"entries": []} + mock_http_client.add_response( + f"{endpoint}/{resource_id}/docs", expected_response + ) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.remove_docs(resource_id, docs_to_remove) + + # Assert + assert result == expected_response + mock_http_client.assert_request_made("DELETE", f"{endpoint}/{resource_id}/docs") diff --git a/tests/unit/test_error_scenarios.py b/tests/unit/test_error_scenarios.py new file mode 100644 index 0000000..c65476e --- /dev/null +++ b/tests/unit/test_error_scenarios.py @@ -0,0 +1,716 @@ +"""Unit tests for error scenarios across the SDK. + +This module tests comprehensive error handling for HTTP status codes +and edge cases like boundary conditions for resource IDs. +""" + +import pytest + +from nexla_sdk.exceptions import ( + AuthenticationError, + AuthorizationError, + NexlaError, + NotFoundError, + RateLimitError, + ServerError, + ValidationError, +) +from tests.utils import MockResponseBuilder, create_http_error + + +@pytest.mark.unit +class TestValidationErrors: + """Tests for 400 Bad Request validation error scenarios.""" + + def test_validation_error_field_level(self, mock_client, mock_http_client): + """Test 400 response with single field validation error.""" + # Arrange + error_response = { + "error": "Validation failed", + "message": "The request data is invalid", + "field_errors": {"name": ["This field is required"]}, + } + mock_http_client.add_error( + "/data_sources", + create_http_error( + 400, + "Validation failed", + details={"field_errors": error_response["field_errors"]}, + ), + ) + + # Act & Assert + with pytest.raises(ValidationError) as exc_info: + mock_client.sources.create({"description": "Missing name field"}) + + assert exc_info.value.status_code == 400 + assert "Validation failed" in str(exc_info.value.message) + + def test_validation_error_multiple_fields(self, mock_client, mock_http_client): + """Test 400 response with multiple field validation failures.""" + # Arrange + field_errors = { + "name": ["This field is required", "Name must be at least 3 characters"], + "credentials_type": ["Invalid credentials type"], + "properties": ["Properties object is required"], + } + mock_http_client.add_error( + "/data_credentials", + create_http_error( + 400, + "Multiple validation errors", + details={"field_errors": field_errors}, + ), + ) + + # Act & Assert + with pytest.raises(ValidationError) as exc_info: + mock_client.credentials.create({}) + + assert exc_info.value.status_code == 400 + + def test_validation_error_invalid_json_format(self, mock_client, mock_http_client): + """Test 400 response for malformed request data.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error(400, "Invalid JSON format in request body"), + ) + + # Act & Assert + with pytest.raises(ValidationError) as exc_info: + mock_client.sources.create({"name": "Test"}) + + assert exc_info.value.status_code == 400 + + def test_validation_error_constraint_violation(self, mock_client, mock_http_client): + """Test 400 response for business rule constraint violation.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 400, + "Source name already exists in this organization", + details={"constraint": "unique_name_per_org"}, + ), + ) + + # Act & Assert + with pytest.raises(ValidationError) as exc_info: + mock_client.sources.create({"name": "Duplicate Name"}) + + assert exc_info.value.status_code == 400 + assert "already exists" in str(exc_info.value.message) + + +@pytest.mark.unit +class TestAuthenticationErrors: + """Tests for 401 Unauthorized authentication error scenarios.""" + + def test_authentication_error_invalid_token(self, mock_client, mock_http_client): + """Test 401 handling for invalid or expired token.""" + # Arrange - need to set up both the main request and token refresh to fail + mock_http_client.add_error( + "/data_sources", + create_http_error(401, "Invalid or expired access token"), + ) + # Also fail the token refresh attempt + mock_http_client.add_error( + "/token", + create_http_error(401, "Invalid service key"), + ) + + # Act & Assert + with pytest.raises(AuthenticationError) as exc_info: + mock_client.sources.list() + + # The exception should be raised (status_code may not be set due to retry logic) + assert "Authentication failed" in str(exc_info.value) + + def test_authentication_error_missing_token(self, mock_client, mock_http_client): + """Test 401 handling when authorization header is missing.""" + # Arrange + mock_http_client.add_error( + "/data_credentials", + create_http_error(401, "Authorization header is required"), + ) + mock_http_client.add_error( + "/token", + create_http_error(401, "Invalid service key"), + ) + + # Act & Assert + with pytest.raises(AuthenticationError) as exc_info: + mock_client.credentials.list() + + assert "Authentication failed" in str(exc_info.value) + + def test_authentication_error_on_get_request(self, mock_client, mock_http_client): + """Test 401 handling for GET request with invalid credentials.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/users/{resource_id}", + create_http_error(401, "Unauthorized access"), + ) + mock_http_client.add_error( + "/token", + create_http_error(401, "Invalid service key"), + ) + + # Act & Assert + with pytest.raises(AuthenticationError) as exc_info: + mock_client.users.get(resource_id) + + assert "Authentication failed" in str(exc_info.value) + + def test_authentication_error_revoked_service_key( + self, mock_client, mock_http_client + ): + """Test 401 handling when service key has been revoked.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 401, + "Service key has been revoked", + details={"reason": "key_revoked"}, + ), + ) + mock_http_client.add_error( + "/token", + create_http_error(401, "Service key revoked"), + ) + + # Act & Assert + with pytest.raises(AuthenticationError) as exc_info: + mock_client.sources.list() + + assert "Authentication failed" in str(exc_info.value) + + +@pytest.mark.unit +class TestAuthorizationErrors: + """Tests for 403 Forbidden authorization error scenarios.""" + + def test_authorization_error_read_only_user(self, mock_client, mock_http_client): + """Test 403 for collaborators attempting write operations.""" + # Arrange + source_id = 123 + mock_http_client.add_error( + f"/data_sources/{source_id}", + create_http_error( + 403, + "User does not have write permission on this resource", + details={ + "user_role": "collaborator", + "required_role": "owner", + "operation": "update", + }, + ), + ) + + # Act & Assert + with pytest.raises(AuthorizationError) as exc_info: + mock_client.sources.update(source_id, {"name": "New Name"}) + + assert exc_info.value.status_code == 403 + + def test_authorization_error_cross_org_access(self, mock_client, mock_http_client): + """Test 403 for accessing resources in another organization.""" + # Arrange + resource_id = 456 + mock_http_client.add_error( + f"/data_credentials/{resource_id}", + create_http_error( + 403, + "Cannot access resources in another organization", + details={ + "user_org_id": 1, + "resource_org_id": 2, + }, + ), + ) + + # Act & Assert + with pytest.raises(AuthorizationError) as exc_info: + mock_client.credentials.get(resource_id) + + assert exc_info.value.status_code == 403 + + def test_authorization_error_delete_protected_resource( + self, mock_client, mock_http_client + ): + """Test 403 for deleting protected/system resources.""" + # Arrange + resource_id = 789 + mock_http_client.add_error( + f"/data_sources/{resource_id}", + create_http_error( + 403, + "Cannot delete protected resource", + details={"protected": True, "reason": "system_managed"}, + ), + ) + + # Act & Assert + with pytest.raises(AuthorizationError) as exc_info: + mock_client.sources.delete(resource_id) + + assert exc_info.value.status_code == 403 + + def test_authorization_error_org_admin_required( + self, mock_client, mock_http_client + ): + """Test 403 for operations requiring org admin privileges.""" + # Arrange + org_id = 100 + mock_http_client.add_error( + f"/orgs/{org_id}/members", + create_http_error( + 403, + "Organization admin privileges required", + details={"required_role": "org_admin"}, + ), + ) + + # Act & Assert + with pytest.raises(AuthorizationError) as exc_info: + mock_client.organizations.get_members(org_id) + + assert exc_info.value.status_code == 403 + + +@pytest.mark.unit +class TestNotFoundErrors: + """Tests for 404 Not Found error scenarios.""" + + def test_not_found_error_nonexistent_id(self, mock_client, mock_http_client): + """Test 404 handling for non-existent resource ID.""" + # Arrange + nonexistent_id = 999999 + mock_http_client.add_error( + f"/data_sources/{nonexistent_id}", + create_http_error( + 404, + f"Data source with ID {nonexistent_id} not found", + ), + ) + + # Act & Assert + with pytest.raises(NotFoundError) as exc_info: + mock_client.sources.get(nonexistent_id) + + # NotFoundError is raised but status_code may not be set in all paths + assert "not found" in str(exc_info.value).lower() + + def test_not_found_error_deleted_resource(self, mock_client, mock_http_client): + """Test 404 for accessing a deleted resource.""" + # Arrange + deleted_id = 123 + mock_http_client.add_error( + f"/data_credentials/{deleted_id}", + create_http_error( + 404, + "Resource has been deleted", + details={"deleted_at": "2024-01-15T10:00:00Z"}, + ), + ) + + # Act & Assert + with pytest.raises(NotFoundError) as exc_info: + mock_client.credentials.get(deleted_id) + + assert "not found" in str(exc_info.value).lower() + + def test_not_found_error_nested_resource(self, mock_client, mock_http_client): + """Test 404 for nested resource not found.""" + # Arrange + source_id = 123 + mock_http_client.add_error( + f"/data_sources/{source_id}/accessors", + create_http_error( + 404, + f"Parent resource with ID {source_id} not found", + ), + ) + + # Act & Assert + with pytest.raises(NotFoundError) as exc_info: + mock_client.sources.get_accessors(source_id) + + assert "not found" in str(exc_info.value).lower() + + def test_not_found_error_update_nonexistent(self, mock_client, mock_http_client): + """Test 404 when updating a non-existent resource.""" + # Arrange + nonexistent_id = 888888 + mock_http_client.add_error( + f"/data_sets/{nonexistent_id}", + create_http_error(404, "Nexset not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError) as exc_info: + mock_client.nexsets.update(nonexistent_id, {"name": "Updated"}) + + assert "not found" in str(exc_info.value).lower() + + +@pytest.mark.unit +class TestRateLimitErrors: + """Tests for 429 Too Many Requests rate limit error scenarios.""" + + def test_rate_limit_error_retry_after(self, mock_client, mock_http_client): + """Test 429 with Retry-After header information.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 429, + "Rate limit exceeded", + details={ + "retry_after": 60, + "limit": 100, + "remaining": 0, + "reset_at": "2024-01-15T10:01:00Z", + }, + ), + ) + + # Act & Assert + with pytest.raises(RateLimitError) as exc_info: + mock_client.sources.list() + + assert exc_info.value.status_code == 429 + + def test_rate_limit_error_burst_limit(self, mock_client, mock_http_client): + """Test 429 for burst rate limit exceeded.""" + # Arrange + mock_http_client.add_error( + "/data_credentials", + create_http_error( + 429, + "Burst rate limit exceeded", + details={ + "limit_type": "burst", + "retry_after": 5, + }, + ), + ) + + # Act & Assert + with pytest.raises(RateLimitError) as exc_info: + mock_client.credentials.list() + + assert exc_info.value.status_code == 429 + + def test_rate_limit_error_daily_quota(self, mock_client, mock_http_client): + """Test 429 for daily quota exceeded.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 429, + "Daily API quota exceeded", + details={ + "limit_type": "daily", + "quota": 10000, + "used": 10000, + "resets_at": "2024-01-16T00:00:00Z", + }, + ), + ) + + # Act & Assert + with pytest.raises(RateLimitError) as exc_info: + mock_client.sources.create({"name": "Test"}) + + assert exc_info.value.status_code == 429 + + +@pytest.mark.unit +class TestServerErrors: + """Tests for 5xx server error scenarios.""" + + def test_server_error_500(self, mock_client, mock_http_client): + """Test 500 Internal Server Error handling.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error(500, "Internal server error"), + ) + + # Act & Assert + with pytest.raises(ServerError) as exc_info: + mock_client.sources.list() + + assert exc_info.value.status_code == 500 + + def test_server_error_502_bad_gateway(self, mock_client, mock_http_client): + """Test 502 Bad Gateway handling.""" + # Arrange + mock_http_client.add_error( + "/data_credentials", + create_http_error(502, "Bad Gateway"), + ) + + # Act & Assert + with pytest.raises(ServerError) as exc_info: + mock_client.credentials.list() + + assert exc_info.value.status_code == 502 + + def test_server_error_503_service_unavailable(self, mock_client, mock_http_client): + """Test 503 Service Unavailable handling.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 503, + "Service temporarily unavailable", + details={"maintenance": True, "expected_duration": "15 minutes"}, + ), + ) + + # Act & Assert + with pytest.raises(ServerError) as exc_info: + mock_client.sources.list() + + assert exc_info.value.status_code == 503 + + def test_server_error_504_gateway_timeout(self, mock_client, mock_http_client): + """Test 504 Gateway Timeout handling.""" + # Arrange + mock_http_client.add_error( + "/data_sinks/123", + create_http_error(504, "Gateway timeout"), + ) + + # Act & Assert + with pytest.raises(ServerError) as exc_info: + mock_client.destinations.get(123) + + assert exc_info.value.status_code == 504 + + def test_server_error_with_request_id(self, mock_client, mock_http_client): + """Test server error includes request ID for debugging.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error( + 500, + "Internal server error", + details={"request_id": "req-abc-123-xyz"}, + ), + ) + + # Act & Assert + with pytest.raises(ServerError) as exc_info: + mock_client.sources.list() + + assert exc_info.value.status_code == 500 + + +@pytest.mark.unit +class TestBoundaryConditions: + """Tests for edge cases with resource IDs and boundary values.""" + + def test_boundary_id_zero(self, mock_client, mock_http_client): + """Test handling of ID=0 which may be invalid.""" + # Arrange + mock_http_client.add_error( + "/data_sources/0", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get(0) + + def test_boundary_id_negative(self, mock_client, mock_http_client): + """Test handling of negative ID values.""" + # Arrange + # Negative IDs should result in validation or not found errors + mock_http_client.add_error( + "/data_sources/-1", + create_http_error(400, "Invalid resource ID: must be positive"), + ) + + # Act & Assert + with pytest.raises(ValidationError): + mock_client.sources.get(-1) + + def test_boundary_id_very_large(self, mock_client, mock_http_client): + """Test handling of very large ID values.""" + # Arrange + large_id = 9999999999999 + mock_http_client.add_error( + f"/data_sources/{large_id}", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get(large_id) + + def test_boundary_empty_list_response(self, mock_client, mock_http_client): + """Test handling of empty list responses (not an error).""" + # Arrange + mock_http_client.add_response("/data_sources", []) + + # Act + result = mock_client.sources.list() + + # Assert - empty list should not raise an error + assert result == [] + + def test_boundary_single_item_list(self, mock_client, mock_http_client): + """Test handling of single-item list responses.""" + # Arrange + source_data = MockResponseBuilder.source(source_id=1) + mock_http_client.add_response("/data_sources", [source_data]) + + # Act + result = mock_client.sources.list() + + # Assert - should return list with one item + assert len(result) == 1 + assert result[0].id == 1 + + +@pytest.mark.unit +class TestErrorResponseStructure: + """Tests for error response structure and metadata.""" + + def test_error_contains_status_code_for_validation( + self, mock_client, mock_http_client + ): + """Test that ValidationError contains the HTTP status code.""" + # Arrange + mock_http_client.add_error( + "/data_sources", + create_http_error(400, "Validation failed"), + ) + + # Act & Assert + with pytest.raises(ValidationError) as exc_info: + mock_client.sources.create({"invalid": "data"}) + + assert exc_info.value.status_code == 400 + + def test_error_contains_message(self, mock_client, mock_http_client): + """Test that error exceptions contain the error message.""" + # Arrange + error_message = "Custom error message for testing" + mock_http_client.add_error( + "/data_sources/123", + create_http_error(400, error_message), + ) + + # Act & Assert + with pytest.raises(NexlaError) as exc_info: + mock_client.sources.get(123) + + assert error_message in str(exc_info.value.message) + + def test_error_get_summary(self, mock_client, mock_http_client): + """Test that NexlaError provides structured error summary.""" + # Arrange + mock_http_client.add_error( + "/data_sources/456", + create_http_error( + 403, + "Access denied", + details={"resource_id": 456}, + ), + ) + + # Act & Assert + with pytest.raises(NexlaError) as exc_info: + mock_client.sources.get(456) + + summary = exc_info.value.get_error_summary() + assert "message" in summary + assert summary["status_code"] == 403 + + +@pytest.mark.unit +class TestErrorAcrossResources: + """Tests verifying error handling works across different resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ("lookups", "/data_maps"), + ("projects", "/projects"), + ("teams", "/teams"), + ], + ) + def test_not_found_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test 404 handling across different resource types.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"{endpoint}/{resource_id}", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + resource = getattr(mock_client, resource_name) + with pytest.raises(NotFoundError): + resource.get(resource_id) + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_authorization_error_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test 403 handling across different resource types.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"{endpoint}/{resource_id}", + create_http_error(403, "Permission denied"), + ) + + # Act & Assert + resource = getattr(mock_client, resource_name) + with pytest.raises(AuthorizationError): + resource.delete(resource_id) + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("credentials", "/data_credentials"), + ("projects", "/projects"), + ], + ) + def test_server_error_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test 500 handling across different resource types.""" + # Arrange + mock_http_client.add_error( + endpoint, + create_http_error(500, "Internal server error"), + ) + + # Act & Assert + resource = getattr(mock_client, resource_name) + with pytest.raises(ServerError): + resource.list() diff --git a/tests/unit/test_flexible_enums.py b/tests/unit/test_flexible_enums.py new file mode 100644 index 0000000..90ba541 --- /dev/null +++ b/tests/unit/test_flexible_enums.py @@ -0,0 +1,152 @@ +"""Unit tests for flexible enum handling.""" + +from nexla_sdk.models.destinations.enums import DestinationFormat, DestinationType +from nexla_sdk.models.destinations.responses import Destination +from nexla_sdk.models.flexible_enums import flexible_enum_validator +from nexla_sdk.models.nexsets.responses import DataSinkSimplified, Nexset + + +class TestFlexibleEnumValidator: + """Test the flexible enum validator.""" + + def test_known_value_returns_enum(self): + """Known values should return enum members.""" + validator = flexible_enum_validator(DestinationType) + result = validator("s3") + assert result == DestinationType.S3 + assert isinstance(result, DestinationType) + + def test_unknown_value_returns_string(self): + """Unknown values should return as raw strings.""" + validator = flexible_enum_validator(DestinationType) + result = validator("new_unknown_connector") + assert result == "new_unknown_connector" + assert isinstance(result, str) + + def test_none_returns_none(self): + """None should remain None.""" + validator = flexible_enum_validator(DestinationType) + result = validator(None) + assert result is None + + def test_enum_instance_returns_unchanged(self): + """Enum instances should pass through unchanged.""" + validator = flexible_enum_validator(DestinationType) + result = validator(DestinationType.S3) + assert result == DestinationType.S3 + + +class TestFlexibleEnumInModels: + """Test flexible enums in Pydantic models.""" + + def test_destination_with_known_sink_format(self): + """Destination should accept known sink_format values.""" + data = { + "id": 1, + "name": "Test Dest", + "status": "ACTIVE", + "sink_type": "s3", + "sink_format": "json", + } + dest = Destination(**data) + assert dest.sink_format == DestinationFormat.JSON + + def test_destination_with_unknown_sink_format(self): + """Destination should accept unknown sink_format values.""" + data = { + "id": 1, + "name": "Test Dest", + "status": "ACTIVE", + "sink_type": "s3", + "sink_format": "new_format_2025", + } + dest = Destination(**data) + assert dest.sink_format == "new_format_2025" + + def test_destination_with_none_sink_format(self): + """Destination should accept None for sink_format.""" + data = { + "id": 1, + "name": "Test Dest", + "status": "ACTIVE", + "sink_type": "s3", + } + dest = Destination(**data) + assert dest.sink_format is None + + def test_data_sink_simplified_with_known_sink_type(self): + """DataSinkSimplified should accept known sink_type values.""" + data = { + "id": 1, + "name": "Test Sink", + "sinkType": "snowflake", + } + sink = DataSinkSimplified(**data) + assert sink.sink_type == DestinationType.SNOWFLAKE + + def test_data_sink_simplified_with_unknown_sink_type(self): + """DataSinkSimplified should accept unknown sink_type values.""" + data = { + "id": 1, + "name": "Test Sink", + "sinkType": "new_connector_type", + } + sink = DataSinkSimplified(**data) + assert sink.sink_type == "new_connector_type" + + def test_nexset_with_unknown_sink_type_in_data_sinks(self): + """Nexset should handle data_sinks with unknown sink types.""" + data = { + "id": 1, + "name": "Test Nexset", + "data_sinks": [ + {"id": 1, "name": "Known Sink", "sinkType": "s3"}, + {"id": 2, "name": "Unknown Sink", "sinkType": "future_connector"}, + ], + } + nexset = Nexset(**data) + assert len(nexset.data_sinks) == 2 + assert nexset.data_sinks[0].sink_type == DestinationType.S3 + assert nexset.data_sinks[1].sink_type == "future_connector" + + +class TestSerializationRoundTrip: + """Test that flexible enums serialize correctly.""" + + def test_known_value_serializes_as_string(self): + """Known enum values should serialize to their string values.""" + data = { + "id": 1, + "name": "Test", + "status": "ACTIVE", + "sink_type": "s3", + "sink_format": "json", + } + dest = Destination(**data) + serialized = dest.model_dump() + # With use_enum_values=True, should be string "json" + assert serialized["sink_format"] == "json" + + def test_unknown_value_serializes_unchanged(self): + """Unknown string values should serialize unchanged.""" + data = { + "id": 1, + "name": "Test", + "status": "ACTIVE", + "sink_type": "s3", + "sink_format": "unknown_format", + } + dest = Destination(**data) + serialized = dest.model_dump() + assert serialized["sink_format"] == "unknown_format" + + def test_json_serialization_with_unknown_value(self): + """Unknown values should serialize to JSON correctly.""" + data = { + "id": 1, + "name": "Test", + "sinkType": "future_connector", + } + sink = DataSinkSimplified(**data) + json_str = sink.model_dump_json() + assert "future_connector" in json_str diff --git a/tests/unit/test_flow_triggers.py b/tests/unit/test_flow_triggers.py new file mode 100644 index 0000000..e2846b3 --- /dev/null +++ b/tests/unit/test_flow_triggers.py @@ -0,0 +1,266 @@ +"""Unit tests for flow triggers resource.""" + +import pytest + +from nexla_sdk.models.flow_triggers.requests import FlowTriggerCreate +from nexla_sdk.models.flow_triggers.responses import FlowTrigger +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_FLOW_TRIGGER = { + "id": 123, + "owner": {"id": 1, "full_name": "Test User", "email": "test@example.com"}, + "org": {"id": 1, "name": "Test Org"}, + "status": "ACTIVE", + "triggering_event_type": "DATA_SINK_WRITE_DONE", + "triggering_origin_node_id": 100, + "triggering_flow_node_id": 101, + "triggering_resource_type": "data_sink", + "triggering_resource_id": 200, + "triggered_event_type": "DATA_SOURCE_READ_START", + "triggered_origin_node_id": 300, + "triggered_resource_type": "data_source", + "triggered_resource_id": 400, + "updated_at": "2025-01-01T00:00:00Z", + "created_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_FLOW_TRIGGERS_LIST = [ + SAMPLE_FLOW_TRIGGER, + {**SAMPLE_FLOW_TRIGGER, "id": 124, "status": "PAUSED"}, + {**SAMPLE_FLOW_TRIGGER, "id": 125}, +] + + +@pytest.fixture +def sample_flow_trigger_response(): + """Sample flow trigger response.""" + return SAMPLE_FLOW_TRIGGER.copy() + + +@pytest.fixture +def sample_flow_triggers_list(): + """Sample flow triggers list response.""" + return [t.copy() for t in SAMPLE_FLOW_TRIGGERS_LIST] + + +@pytest.mark.unit +class TestFlowTriggersResource: + """Unit tests for FlowTriggersResource using mocks.""" + + def test_list_flow_triggers_success( + self, mock_client, mock_http_client, sample_flow_triggers_list + ): + """Test listing flow triggers with successful response.""" + mock_http_client.add_response("/flow_triggers", sample_flow_triggers_list) + + triggers = mock_client.flow_triggers.list() + + assert len(triggers) == 3 + assert_model_list_valid(triggers, FlowTrigger) + mock_http_client.assert_request_made("GET", "/flow_triggers") + + def test_list_flow_triggers_with_pagination( + self, mock_client, mock_http_client, sample_flow_triggers_list + ): + """Test listing flow triggers with pagination.""" + mock_http_client.add_response("/flow_triggers", sample_flow_triggers_list) + + triggers = mock_client.flow_triggers.list(page=1, per_page=10) + + assert len(triggers) == 3 + + def test_list_all_flow_triggers_success( + self, mock_client, mock_http_client, sample_flow_triggers_list + ): + """Test listing all flow triggers (super user).""" + mock_http_client.add_response("/flow_triggers/all", sample_flow_triggers_list) + + triggers = mock_client.flow_triggers.list_all() + + assert len(triggers) == 3 + mock_http_client.assert_request_made("GET", "/flow_triggers/all") + + def test_list_all_flow_triggers_with_pagination( + self, mock_client, mock_http_client, sample_flow_triggers_list + ): + """Test listing all flow triggers with pagination.""" + mock_http_client.add_response("/flow_triggers/all", sample_flow_triggers_list) + + triggers = mock_client.flow_triggers.list_all(page=1, per_page=50) + + assert len(triggers) == 3 + + def test_get_flow_trigger_success( + self, mock_client, mock_http_client, sample_flow_trigger_response + ): + """Test getting a single flow trigger.""" + trigger_id = 123 + mock_http_client.add_response( + f"/flow_triggers/{trigger_id}", sample_flow_trigger_response + ) + + trigger = mock_client.flow_triggers.get(trigger_id) + + assert_model_valid(trigger, {"id": trigger_id}) + mock_http_client.assert_request_made("GET", f"/flow_triggers/{trigger_id}") + + def test_create_flow_trigger_success( + self, mock_client, mock_http_client, sample_flow_trigger_response + ): + """Test creating a flow trigger.""" + mock_http_client.add_response("/flow_triggers", sample_flow_trigger_response) + + create_data = FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + data_sink_id=200, + data_source_id=400, + ) + trigger = mock_client.flow_triggers.create(create_data) + + assert_model_valid(trigger, {"triggering_event_type": "DATA_SINK_WRITE_DONE"}) + mock_http_client.assert_request_made("POST", "/flow_triggers") + + def test_create_flow_trigger_with_node_ids( + self, mock_client, mock_http_client, sample_flow_trigger_response + ): + """Test creating a flow trigger with node IDs.""" + mock_http_client.add_response("/flow_triggers", sample_flow_trigger_response) + + create_data = FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + triggering_flow_node_id=101, + triggered_origin_node_id=300, + ) + trigger = mock_client.flow_triggers.create(create_data) + + assert trigger.triggering_flow_node_id == 101 + + def test_delete_flow_trigger_success(self, mock_client, mock_http_client): + """Test deleting a flow trigger.""" + trigger_id = 123 + mock_http_client.add_response(f"/flow_triggers/{trigger_id}", {"success": True}) + + result = mock_client.flow_triggers.delete(trigger_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/flow_triggers/{trigger_id}") + + def test_activate_flow_trigger_success( + self, mock_client, mock_http_client, sample_flow_trigger_response + ): + """Test activating a flow trigger.""" + trigger_id = 123 + activated_response = {**sample_flow_trigger_response, "status": "ACTIVE"} + mock_http_client.add_response( + f"/flow_triggers/{trigger_id}/activate", activated_response + ) + + trigger = mock_client.flow_triggers.activate(trigger_id) + + assert trigger.status == "ACTIVE" + mock_http_client.assert_request_made( + "PUT", f"/flow_triggers/{trigger_id}/activate" + ) + + def test_pause_flow_trigger_success( + self, mock_client, mock_http_client, sample_flow_trigger_response + ): + """Test pausing a flow trigger.""" + trigger_id = 123 + paused_response = {**sample_flow_trigger_response, "status": "PAUSED"} + mock_http_client.add_response( + f"/flow_triggers/{trigger_id}/pause", paused_response + ) + + trigger = mock_client.flow_triggers.pause(trigger_id) + + assert trigger.status == "PAUSED" + mock_http_client.assert_request_made( + "PUT", f"/flow_triggers/{trigger_id}/pause" + ) + + +@pytest.mark.unit +class TestFlowTriggerModels: + """Unit tests for flow trigger models.""" + + def test_flow_trigger_model_validation(self, sample_flow_trigger_response): + """Test FlowTrigger model parses valid data correctly.""" + trigger = FlowTrigger.model_validate(sample_flow_trigger_response) + + assert trigger.id == 123 + assert trigger.status == "ACTIVE" + assert trigger.triggering_event_type == "DATA_SINK_WRITE_DONE" + assert trigger.triggered_event_type == "DATA_SOURCE_READ_START" + assert trigger.triggering_resource_type == "data_sink" + assert trigger.triggered_resource_type == "data_source" + + def test_flow_trigger_with_owner_and_org(self, sample_flow_trigger_response): + """Test FlowTrigger model parses owner and org correctly.""" + trigger = FlowTrigger.model_validate(sample_flow_trigger_response) + + assert trigger.owner is not None + assert trigger.owner.id == 1 + assert trigger.org is not None + assert trigger.org.id == 1 + + def test_flow_trigger_create_model_serialization(self): + """Test FlowTriggerCreate model serialization.""" + create_data = FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + data_sink_id=100, + data_source_id=200, + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["triggering_event_type"] == "DATA_SINK_WRITE_DONE" + assert data["triggered_event_type"] == "DATA_SOURCE_READ_START" + assert data["data_sink_id"] == 100 + assert data["data_source_id"] == 200 + + def test_flow_trigger_create_with_resource_type(self): + """Test FlowTriggerCreate model with explicit resource types.""" + create_data = FlowTriggerCreate( + triggering_event_type="DATA_SINK_WRITE_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + triggering_resource_id=100, + triggering_resource_type="data_sink", + triggered_resource_id=200, + triggered_resource_type="data_source", + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["triggering_resource_type"] == "data_sink" + assert data["triggered_resource_type"] == "data_source" + + def test_flow_trigger_create_with_owner(self): + """Test FlowTriggerCreate model with owner/org.""" + create_data = FlowTriggerCreate( + triggering_event_type="DATA_SOURCE_READ_DONE", + triggered_event_type="DATA_SOURCE_READ_START", + triggering_flow_node_id=100, + triggered_origin_node_id=200, + owner_id=5, + org_id=10, + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["owner_id"] == 5 + assert data["org_id"] == 10 + + +@pytest.mark.unit +class TestFlowTriggersImmutability: + """Test that flow triggers are immutable (update is not supported).""" + + def test_update_raises_not_implemented(self, mock_client): + """Flow triggers are immutable; update should raise NotImplementedError.""" + with pytest.raises(NotImplementedError, match="immutable"): + mock_client.flow_triggers.update(123, {"status": "ACTIVE"}) diff --git a/tests/unit/test_flows.py b/tests/unit/test_flows.py index f7841eb..8da4aae 100644 --- a/tests/unit/test_flows.py +++ b/tests/unit/test_flows.py @@ -1222,3 +1222,120 @@ def test_copy_and_replace_credentials_no_target_project( assert isinstance(result, FlowResponse) project_requests = mock_http_client.get_requests_by_url_pattern("/projects/") assert len(project_requests) == 0 + + def test_get_flow_logs_basic(self, mock_client, mock_http_client): + """Test get_flow_logs with only flow_id.""" + mock_http_client.add_response( + "/flows/100/flow/logs", {"status": "ok", "data": []} + ) + + mock_client.flows.get_flow_logs(flow_id=100) + + last_request = mock_http_client.get_last_request() + assert last_request["method"] == "GET" + assert "/flows/100/flow/logs" in last_request["url"] + assert last_request["params"] == {} + + def test_get_flow_logs_with_all_params(self, mock_client, mock_http_client): + """Test get_flow_logs with all parameters.""" + mock_http_client.add_response( + "/flows/100/flow/logs", {"status": "ok", "data": []} + ) + + mock_client.flows.get_flow_logs( + flow_id=100, + from_date="2024-01-01", + to_date="2024-01-31", + severity="ERROR", + run_id=123, + page=1, + per_page=50, + ) + + last_request = mock_http_client.get_last_request() + assert last_request["params"] == { + "from": "2024-01-01", + "to": "2024-01-31", + "severity": "ERROR", + "run_id": 123, + "page": 1, + "per_page": 50, + } + + def test_search_flow_logs_basic(self, mock_client, mock_http_client): + """Test search_flow_logs with only flow_id.""" + mock_http_client.add_response( + "/flows/100/logs_v2", {"status": "ok", "data": []} + ) + + mock_client.flows.search_flow_logs(flow_id=100) + + last_request = mock_http_client.get_last_request() + assert last_request["method"] == "GET" + assert "/flows/100/logs_v2" in last_request["url"] + + def test_search_flow_logs_with_all_params(self, mock_client, mock_http_client): + """Test search_flow_logs with all parameters.""" + mock_http_client.add_response( + "/flows/100/logs_v2", {"status": "ok", "data": []} + ) + + mock_client.flows.search_flow_logs( + flow_id=100, + run_ids="1,2,3", + severity="ERROR", + search_string="timeout", + from_date="2024-01-01", + to_date="2024-01-31", + ) + + last_request = mock_http_client.get_last_request() + assert last_request["params"] == { + "run_ids": "1,2,3", + "severity": "ERROR", + "search_string": "timeout", + "from": "2024-01-01", + "to": "2024-01-31", + } + + def test_get_active_flows_metrics_basic(self, mock_client, mock_http_client): + """Test get_active_flows_metrics with no params.""" + mock_http_client.add_response( + "/flows/active_flows_metrics", {"status": "ok", "data": []} + ) + + mock_client.flows.get_active_flows_metrics() + + last_request = mock_http_client.get_last_request() + assert last_request["method"] == "GET" + assert "/flows/active_flows_metrics" in last_request["url"] + + def test_get_active_flows_metrics_with_params(self, mock_client, mock_http_client): + """Test get_active_flows_metrics with all parameters.""" + mock_http_client.add_response( + "/flows/active_flows_metrics", {"status": "ok", "data": []} + ) + + mock_client.flows.get_active_flows_metrics( + from_date="2024-01-01", + to_date="2024-01-31", + org_id=5, + ) + + last_request = mock_http_client.get_last_request() + assert last_request["params"] == { + "from": "2024-01-01", + "to": "2024-01-31", + "org_id": 5, + } + + def test_get_flow_logs_no_optional_params(self, mock_client, mock_http_client): + """Test get_flow_logs with just flow_id has empty params.""" + mock_http_client.add_response( + "/flows/200/flow/logs", {"status": "ok", "data": []} + ) + + mock_client.flows.get_flow_logs(flow_id=200) + + last_request = mock_http_client.get_last_request() + assert last_request["params"] == {} diff --git a/tests/unit/test_lifecycle_operations.py b/tests/unit/test_lifecycle_operations.py new file mode 100644 index 0000000..f0933f4 --- /dev/null +++ b/tests/unit/test_lifecycle_operations.py @@ -0,0 +1,390 @@ +"""Unit tests for lifecycle operations (activate, pause, copy).""" + +import pytest + +from nexla_sdk.exceptions import NotFoundError +from nexla_sdk.models.sources.responses import Source +from tests.utils import MockResponseBuilder, create_http_error + + +@pytest.mark.unit +class TestActivateOperation: + """Tests for resource activation.""" + + def test_activate_source_success(self, mock_client, mock_http_client): + """Test activating a source.""" + # Arrange + resource_id = 123 + response = MockResponseBuilder.source(source_id=resource_id, status="ACTIVE") + mock_http_client.add_response(f"/data_sources/{resource_id}/activate", response) + + # Act + result = mock_client.sources.activate(resource_id) + + # Assert + assert isinstance(result, Source) + assert result.status == "ACTIVE" + mock_http_client.assert_request_made( + "PUT", f"/data_sources/{resource_id}/activate" + ) + + def test_activate_destination_success(self, mock_client, mock_http_client): + """Test activating a destination.""" + # Arrange + resource_id = 456 + response = MockResponseBuilder.destination( + {"id": resource_id, "status": "ACTIVE"} + ) + mock_http_client.add_response(f"/data_sinks/{resource_id}/activate", response) + + # Act + result = mock_client.destinations.activate(resource_id) + + # Assert + assert result.status == "ACTIVE" + mock_http_client.assert_request_made( + "PUT", f"/data_sinks/{resource_id}/activate" + ) + + def test_activate_nexset_success(self, mock_client, mock_http_client): + """Test activating a nexset.""" + # Arrange + resource_id = 789 + response = MockResponseBuilder.nexset({"id": resource_id, "status": "ACTIVE"}) + mock_http_client.add_response(f"/data_sets/{resource_id}/activate", response) + + # Act + result = mock_client.nexsets.activate(resource_id) + + # Assert + assert result.status == "ACTIVE" + mock_http_client.assert_request_made( + "PUT", f"/data_sets/{resource_id}/activate" + ) + + def test_activate_returns_updated_status(self, mock_client, mock_http_client): + """Test that activate returns resource with updated status.""" + # Arrange + resource_id = 123 + # Simulate a source that was PAUSED and is now ACTIVE + response = MockResponseBuilder.source(source_id=resource_id, status="ACTIVE") + mock_http_client.add_response(f"/data_sources/{resource_id}/activate", response) + + # Act + result = mock_client.sources.activate(resource_id) + + # Assert + assert result.id == resource_id + assert result.status == "ACTIVE" + + def test_activate_not_found(self, mock_client, mock_http_client): + """Test activate on non-existent resource raises NotFoundError.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/activate", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.activate(resource_id) + + +@pytest.mark.unit +class TestPauseOperation: + """Tests for resource pausing.""" + + def test_pause_source_success(self, mock_client, mock_http_client): + """Test pausing a source.""" + # Arrange + resource_id = 123 + response = MockResponseBuilder.source(source_id=resource_id, status="PAUSED") + mock_http_client.add_response(f"/data_sources/{resource_id}/pause", response) + + # Act + result = mock_client.sources.pause(resource_id) + + # Assert + assert isinstance(result, Source) + assert result.status == "PAUSED" + mock_http_client.assert_request_made( + "PUT", f"/data_sources/{resource_id}/pause" + ) + + def test_pause_destination_success(self, mock_client, mock_http_client): + """Test pausing a destination.""" + # Arrange + resource_id = 456 + response = MockResponseBuilder.destination( + {"id": resource_id, "status": "PAUSED"} + ) + mock_http_client.add_response(f"/data_sinks/{resource_id}/pause", response) + + # Act + result = mock_client.destinations.pause(resource_id) + + # Assert + assert result.status == "PAUSED" + mock_http_client.assert_request_made("PUT", f"/data_sinks/{resource_id}/pause") + + def test_pause_nexset_success(self, mock_client, mock_http_client): + """Test pausing a nexset.""" + # Arrange + resource_id = 789 + response = MockResponseBuilder.nexset({"id": resource_id, "status": "PAUSED"}) + mock_http_client.add_response(f"/data_sets/{resource_id}/pause", response) + + # Act + result = mock_client.nexsets.pause(resource_id) + + # Assert + assert result.status == "PAUSED" + mock_http_client.assert_request_made("PUT", f"/data_sets/{resource_id}/pause") + + def test_pause_returns_updated_status(self, mock_client, mock_http_client): + """Test that pause returns resource with updated status.""" + # Arrange + resource_id = 123 + response = MockResponseBuilder.source(source_id=resource_id, status="PAUSED") + mock_http_client.add_response(f"/data_sources/{resource_id}/pause", response) + + # Act + result = mock_client.sources.pause(resource_id) + + # Assert + assert result.id == resource_id + assert result.status == "PAUSED" + + def test_pause_not_found(self, mock_client, mock_http_client): + """Test pause on non-existent resource raises NotFoundError.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/pause", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.pause(resource_id) + + +@pytest.mark.unit +class TestCopyOperation: + """Tests for resource copying.""" + + def test_copy_source_default_options(self, mock_client, mock_http_client): + """Test copying a source with default options.""" + # Arrange + resource_id = 123 + copied_id = 456 + response = MockResponseBuilder.source( + source_id=copied_id, name="Copy of Source" + ) + mock_http_client.add_response(f"/data_sources/{resource_id}/copy", response) + + # Act + result = mock_client.sources.copy(resource_id) + + # Assert + assert isinstance(result, Source) + assert result.id == copied_id + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/copy" + ) + + def test_copy_destination_default_options(self, mock_client, mock_http_client): + """Test copying a destination with default options.""" + # Arrange + resource_id = 123 + copied_id = 456 + response = MockResponseBuilder.destination( + {"id": copied_id, "name": "Copy of Destination"} + ) + mock_http_client.add_response(f"/data_sinks/{resource_id}/copy", response) + + # Act + result = mock_client.destinations.copy(resource_id) + + # Assert + assert result.id == copied_id + + def test_copy_nexset_default_options(self, mock_client, mock_http_client): + """Test copying a nexset with default options.""" + # Arrange + resource_id = 123 + copied_id = 456 + response = MockResponseBuilder.nexset( + {"id": copied_id, "name": "Copy of Nexset"} + ) + mock_http_client.add_response(f"/data_sets/{resource_id}/copy", response) + + # Act + result = mock_client.nexsets.copy(resource_id) + + # Assert + assert result.id == copied_id + + def test_copy_project_default_options(self, mock_client, mock_http_client): + """Test copying a project with default options.""" + # Arrange + resource_id = 123 + copied_id = 456 + response = MockResponseBuilder.project( + project_id=copied_id, name="Copy of Project" + ) + mock_http_client.add_response(f"/projects/{resource_id}/copy", response) + + # Act + result = mock_client.projects.copy(resource_id) + + # Assert + assert result.id == copied_id + + def test_copy_returns_new_resource(self, mock_client, mock_http_client): + """Test that copy returns a new resource with different ID.""" + # Arrange + original_id = 123 + copied_id = 456 + response = MockResponseBuilder.source(source_id=copied_id, name="Copied Source") + mock_http_client.add_response(f"/data_sources/{original_id}/copy", response) + + # Act + result = mock_client.sources.copy(original_id) + + # Assert + assert result.id == copied_id + assert result.id != original_id + mock_http_client.assert_request_made( + "POST", f"/data_sources/{original_id}/copy" + ) + + def test_copy_not_found(self, mock_client, mock_http_client): + """Test copy on non-existent resource raises NotFoundError.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/copy", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.copy(resource_id) + + +@pytest.mark.unit +class TestLifecycleOperationsAcrossResources: + """Tests for lifecycle operations across different resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_activate_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test activate works across different resource types.""" + # Arrange + resource_id = 123 + if resource_name == "sources": + response = MockResponseBuilder.source( + source_id=resource_id, status="ACTIVE" + ) + elif resource_name == "destinations": + response = MockResponseBuilder.destination( + {"id": resource_id, "status": "ACTIVE"} + ) + else: + response = MockResponseBuilder.nexset( + {"id": resource_id, "status": "ACTIVE"} + ) + + mock_http_client.add_response(f"{endpoint}/{resource_id}/activate", response) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.activate(resource_id) + + # Assert + assert result.status == "ACTIVE" + mock_http_client.assert_request_made( + "PUT", f"{endpoint}/{resource_id}/activate" + ) + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ], + ) + def test_pause_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test pause works across different resource types.""" + # Arrange + resource_id = 123 + if resource_name == "sources": + response = MockResponseBuilder.source( + source_id=resource_id, status="PAUSED" + ) + elif resource_name == "destinations": + response = MockResponseBuilder.destination( + {"id": resource_id, "status": "PAUSED"} + ) + else: + response = MockResponseBuilder.nexset( + {"id": resource_id, "status": "PAUSED"} + ) + + mock_http_client.add_response(f"{endpoint}/{resource_id}/pause", response) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.pause(resource_id) + + # Assert + assert result.status == "PAUSED" + mock_http_client.assert_request_made("PUT", f"{endpoint}/{resource_id}/pause") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("projects", "/projects"), + ], + ) + def test_copy_across_resources( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test copy works across different resource types.""" + # Arrange + resource_id = 123 + copied_id = 456 + if resource_name == "sources": + response = MockResponseBuilder.source(source_id=copied_id) + elif resource_name == "destinations": + response = MockResponseBuilder.destination({"id": copied_id}) + elif resource_name == "nexsets": + response = MockResponseBuilder.nexset({"id": copied_id}) + else: + response = MockResponseBuilder.project(project_id=copied_id) + + mock_http_client.add_response(f"{endpoint}/{resource_id}/copy", response) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.copy(resource_id) + + # Assert + assert result.id == copied_id + mock_http_client.assert_request_made("POST", f"{endpoint}/{resource_id}/copy") diff --git a/tests/unit/test_metrics.py b/tests/unit/test_metrics.py index d8a17d1..0ccbacc 100644 --- a/tests/unit/test_metrics.py +++ b/tests/unit/test_metrics.py @@ -185,3 +185,31 @@ def test_user_daily_metrics_serializes_resource_type_enum( "/users/7/metrics", params={"resource_type": "SOURCE", "from": "2024-01-01", "aggregate": 1}, ) + + +class TestNewMetricsMethods: + """Tests for newly added metrics methods.""" + + @pytest.fixture + def client(self, mock_client: NexlaClient) -> NexlaClient: + return mock_client + + def test_publish_raw(self, client, mock_http_client): + """Test publish_raw sends POST to /metrics/raw.""" + mock_http_client.clear_responses() + mock_http_client.add_response("/metrics/raw", {"status": "ok"}) + + result = client.metrics.publish_raw({"event": "test"}) + + assert result == {"status": "ok"} + mock_http_client.assert_request_made("POST", "/metrics/raw") + + def test_get_flow_metrics_summary(self, client, mock_http_client): + """Test get_flow_metrics_summary with a period.""" + mock_http_client.clear_responses() + mock_http_client.add_response("/data_flows/metrics/daily", {"status": "ok"}) + + result = client.metrics.get_flow_metrics_summary(period="daily") + + assert result == {"status": "ok"} + mock_http_client.assert_request_made("GET", "/data_flows/metrics/daily") diff --git a/tests/unit/test_nexsets.py b/tests/unit/test_nexsets.py index 8d6cb06..0d51a9a 100644 --- a/tests/unit/test_nexsets.py +++ b/tests/unit/test_nexsets.py @@ -215,7 +215,7 @@ def test_get_samples(self, mock_client): # Verify parameters request = mock_client.http_client.get_last_request() assert request["params"].get("count") == 5 - assert request["params"].get("include_metadata") == True + assert request["params"].get("include_metadata") def test_get_samples_with_live_option(self, mock_client): """Test getting live samples.""" @@ -235,7 +235,7 @@ def test_get_samples_with_live_option(self, mock_client): "GET", f"/data_sets/{nexset_id}/samples" ) request = mock_client.http_client.get_last_request() - assert request["params"].get("live") == True + assert request["params"].get("live") def test_copy_nexset(self, mock_client): """Test copying nexset.""" @@ -372,9 +372,7 @@ def test_list_docs_no_expand(self, mock_client): """Test listing docs without the expand flag.""" # Arrange nexset_id = 419706 - mock_client.http_client.add_response( - f"/data_sets/{nexset_id}/docs", [] - ) + mock_client.http_client.add_response(f"/data_sets/{nexset_id}/docs", []) # Act docs = mock_client.nexsets.list_docs(nexset_id, expand=False) @@ -426,9 +424,7 @@ def test_update_docs_accepts_dicts(self, mock_client): """Test update_docs accepts plain dicts (e.g. from MCP layer).""" # Arrange nexset_id = 419706 - mock_client.http_client.add_response( - f"/data_sets/{nexset_id}/docs", [] - ) + mock_client.http_client.add_response(f"/data_sets/{nexset_id}/docs", []) # Act — pass a plain dict, not a DocContainerInput mock_client.nexsets.update_docs( @@ -469,12 +465,8 @@ def test_copy_docs(self, mock_client): ) ] - mock_client.http_client.add_response( - f"/data_sets/{src_id}/docs", source_docs - ) - mock_client.http_client.add_response( - f"/data_sets/{dst_id}/docs", dest_docs - ) + mock_client.http_client.add_response(f"/data_sets/{src_id}/docs", source_docs) + mock_client.http_client.add_response(f"/data_sets/{dst_id}/docs", dest_docs) # Act result = mock_client.nexsets.copy_docs(src_id, dst_id) @@ -527,9 +519,7 @@ def test_copy_docs_empty_source(self, mock_client): # Arrange src_id = 419706 dst_id = 419800 - mock_client.http_client.add_response( - f"/data_sets/{src_id}/docs", [] - ) + mock_client.http_client.add_response(f"/data_sets/{src_id}/docs", []) # Act result = mock_client.nexsets.copy_docs(src_id, dst_id) diff --git a/tests/unit/test_notification_settings.py b/tests/unit/test_notification_settings.py new file mode 100644 index 0000000..c42c969 --- /dev/null +++ b/tests/unit/test_notification_settings.py @@ -0,0 +1,403 @@ +"""Unit tests for NotificationSettingsResource using mocks.""" + +import pytest + +from nexla_sdk.models.notification_settings import ( + NotificationSetting, + NotificationSettingBrief, + NotificationSettingCreate, + NotificationSettingUpdate, +) +from nexla_sdk.resources.notification_settings import NotificationSettingsResource + + +@pytest.fixture +def notification_settings_resource(mock_client): + """Create a NotificationSettingsResource instance with mocked client.""" + return NotificationSettingsResource(mock_client) + + +@pytest.fixture +def sample_notification_setting(): + """Sample notification setting response data.""" + return { + "id": 1, + "notification_type_id": 5, + "resource_id": 123, + "resource_type": "data_sources", + "channel": "email", + "priority": 5, + "status": "ENABLED", + "payload": {"recipients": ["user@example.com"]}, + "owner_id": 10, + "org_id": 1, + "created_at": "2024-01-15T10:30:00Z", + "updated_at": "2024-01-15T10:30:00Z", + } + + +@pytest.fixture +def sample_notification_settings_list(): + """Sample list of notification settings.""" + return [ + { + "id": 1, + "notification_type_id": 5, + "resource_id": 123, + "resource_type": "data_sources", + "channel": "email", + "priority": 5, + "status": "ENABLED", + "payload": None, + "owner_id": 10, + "org_id": 1, + }, + { + "id": 2, + "notification_type_id": 6, + "resource_id": None, + "resource_type": None, + "channel": "slack", + "priority": 3, + "status": "ENABLED", + "payload": {"webhook_url": "https://hooks.slack.com/xxx"}, + "owner_id": 10, + "org_id": 1, + }, + ] + + +class TestNotificationSettingsResource: + """Unit tests for NotificationSettingsResource.""" + + def test_list_notification_settings_success( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_settings_list, + ): + """Test listing notification settings with successful response.""" + mock_http_client.add_response( + "/notification_settings", sample_notification_settings_list + ) + + settings = notification_settings_resource.list() + assert len(settings) == 2 + mock_http_client.assert_request_made("GET", "/notification_settings") + + def test_list_notification_settings_with_filters( + self, mock_client, mock_http_client, notification_settings_resource + ): + """Test listing notification settings with filters.""" + response = [ + { + "id": 1, + "notification_type_id": 5, + "channel": "email", + "priority": 5, + "status": "ENABLED", + } + ] + mock_http_client.add_response("/notification_settings", response) + + settings = notification_settings_resource.list( + notification_resource_type="data_sources", + resource_id=123, + sort_by="priority", + sort_order="ASC", + ) + assert len(settings) == 1 + params = mock_http_client.get_request()["params"] + assert params["notification_resource_type"] == "data_sources" + assert params["resource_id"] == 123 + + def test_list_all_notification_settings( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_settings_list, + ): + """Test listing all notification settings (super user).""" + mock_http_client.add_response( + "/notification_settings/all", sample_notification_settings_list + ) + + settings = notification_settings_resource.list_all( + resource_type="data_sources", + event_type="flow_failed", + status="ENABLED", + ) + assert len(settings) == 2 + mock_http_client.assert_request_made("GET", "/notification_settings/all") + + def test_get_notification_setting_success( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test getting a notification setting by ID.""" + mock_http_client.add_response( + "/notification_settings/1", sample_notification_setting + ) + + setting = notification_settings_resource.get(1) + assert setting.id == 1 + assert setting.channel == "email" + assert setting.priority == 5 + mock_http_client.assert_request_made("GET", "/notification_settings/1") + + def test_create_notification_setting_success( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test creating a notification setting.""" + mock_http_client.add_response( + "/notification_settings", sample_notification_setting + ) + + setting = notification_settings_resource.create( + NotificationSettingCreate( + notification_type_id=5, + channel="email", + priority=5, + ) + ) + assert setting.id == 1 + assert setting.channel == "email" + mock_http_client.assert_request_made("POST", "/notification_settings") + + def test_create_notification_setting_with_dict( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test creating a notification setting with dict input.""" + mock_http_client.add_response( + "/notification_settings", sample_notification_setting + ) + + setting = notification_settings_resource.create( + {"notification_type_id": 5, "channel": "email", "priority": 5} + ) + assert setting.id == 1 + mock_http_client.assert_request_made("POST", "/notification_settings") + + def test_update_notification_setting_success( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test updating a notification setting.""" + updated_setting = sample_notification_setting.copy() + updated_setting["priority"] = 10 + mock_http_client.add_response("/notification_settings/1", updated_setting) + + setting = notification_settings_resource.update( + 1, NotificationSettingUpdate(priority=10) + ) + assert setting.priority == 10 + mock_http_client.assert_request_made("PUT", "/notification_settings/1") + + def test_delete_notification_setting_success( + self, mock_client, mock_http_client, notification_settings_resource + ): + """Test deleting a notification setting.""" + mock_http_client.add_response("/notification_settings/1", {}) + + result = notification_settings_resource.delete(1) + assert result == {} + mock_http_client.assert_request_made("DELETE", "/notification_settings/1") + + def test_show_resource_settings( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_settings_list, + ): + """Test getting notification settings for a resource.""" + mock_http_client.add_response( + "/notification_settings/data_sources/123", sample_notification_settings_list + ) + + settings = notification_settings_resource.show_resource_settings( + resource_type="data_sources", + resource_id=123, + filter_overridden_settings=True, + ) + assert len(settings) == 2 + params = mock_http_client.get_request()["params"] + assert params["filter_overridden_settings"] == "true" + + def test_show_type_settings( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_settings_list, + ): + """Test getting notification settings for a notification type.""" + mock_http_client.add_response( + "/notification_settings/notification_types/5", + sample_notification_settings_list, + ) + + settings = notification_settings_resource.show_type_settings( + notification_type_id=5 + ) + assert len(settings) == 2 + mock_http_client.assert_request_made( + "GET", "/notification_settings/notification_types/5" + ) + + def test_org_index( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_settings_list, + ): + """Test listing organization notification settings.""" + mock_http_client.add_response( + "/orgs/1/notification_settings", sample_notification_settings_list + ) + + settings = notification_settings_resource.org_index(org_id=1) + assert len(settings) == 2 + mock_http_client.assert_request_made("GET", "/orgs/1/notification_settings") + + def test_org_create( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test creating an organization notification setting.""" + mock_http_client.add_response( + "/orgs/1/notification_settings", sample_notification_setting + ) + + setting = notification_settings_resource.org_create( + org_id=1, + data=NotificationSettingCreate( + notification_type_id=5, channel="email", priority=5 + ), + ) + assert setting.id == 1 + mock_http_client.assert_request_made("POST", "/orgs/1/notification_settings") + + def test_org_update( + self, + mock_client, + mock_http_client, + notification_settings_resource, + sample_notification_setting, + ): + """Test updating an organization notification setting.""" + updated_setting = sample_notification_setting.copy() + updated_setting["priority"] = 8 + mock_http_client.add_response( + "/orgs/1/notification_settings/1", updated_setting + ) + + setting = notification_settings_resource.org_update( + org_id=1, + notification_settings_id=1, + data=NotificationSettingUpdate(priority=8), + ) + assert setting.priority == 8 + mock_http_client.assert_request_made("PUT", "/orgs/1/notification_settings/1") + + def test_org_delete( + self, mock_client, mock_http_client, notification_settings_resource + ): + """Test deleting an organization notification setting.""" + mock_http_client.add_response("/orgs/1/notification_settings/1", {}) + + result = notification_settings_resource.org_delete( + org_id=1, notification_settings_id=1 + ) + assert result == {} + mock_http_client.assert_request_made( + "DELETE", "/orgs/1/notification_settings/1" + ) + + +class TestNotificationSettingModels: + """Unit tests for Notification Setting model validation.""" + + def test_notification_setting_model_validation( + self, notification_settings_resource, sample_notification_setting + ): + """Test NotificationSetting model validation.""" + setting = NotificationSetting.model_validate(sample_notification_setting) + assert setting.id == 1 + assert setting.channel == "email" + assert setting.priority == 5 + assert setting.status == "ENABLED" + + def test_notification_setting_brief_model(self): + """Test NotificationSettingBrief model validation.""" + brief_data = { + "id": 1, + "notification_type_id": 5, + "channel": "email", + "priority": 5, + "status": "ENABLED", + "resource_type": "data_sources", + "resource_id": 123, + } + brief = NotificationSettingBrief.model_validate(brief_data) + assert brief.id == 1 + assert brief.channel == "email" + + def test_notification_setting_create_model(self): + """Test NotificationSettingCreate model validation.""" + create_data = { + "notification_type_id": 5, + "channel": "email", + "priority": 5, + "status": "ENABLED", + } + create = NotificationSettingCreate.model_validate(create_data) + assert create.notification_type_id == 5 + assert create.channel == "email" + assert create.priority == 5 + assert create.status == "ENABLED" + + def test_notification_setting_create_with_payload(self): + """Test NotificationSettingCreate with payload.""" + create_data = { + "notification_type_id": 5, + "channel": "email", + "payload": {"recipients": ["user@example.com"]}, + } + create = NotificationSettingCreate.model_validate(create_data) + assert create.payload == {"recipients": ["user@example.com"]} + + def test_notification_setting_update_model(self): + """Test NotificationSettingUpdate model validation.""" + update_data = {"priority": 10, "status": "DISABLED"} + update = NotificationSettingUpdate.model_validate(update_data) + assert update.priority == 10 + assert update.status == "DISABLED" + + def test_notification_setting_update_partial(self): + """Test NotificationSettingUpdate with partial data.""" + update_data = {"priority": 8} + update = NotificationSettingUpdate.model_validate(update_data) + assert update.priority == 8 + assert update.channel is None + assert update.status is None diff --git a/tests/unit/test_organizations.py b/tests/unit/test_organizations.py index 68ab035..ddc695e 100644 --- a/tests/unit/test_organizations.py +++ b/tests/unit/test_organizations.py @@ -1,6 +1,11 @@ """Unit tests for the Organizations resource.""" +from nexla_sdk.models.common import LogEntry from nexla_sdk.models.metrics.enums import ResourceType +from nexla_sdk.models.organizations.custodians import ( + OrgCustodianRef, + OrgCustodiansPayload, +) from nexla_sdk.models.organizations.requests import ( OrganizationCreate, OrgMemberActivateDeactivateRequest, @@ -274,6 +279,120 @@ def test_get_audit_log(self, mock_client): assert f"/orgs/{org_id}/audit_log" in last_request["url"] assert last_request["params"] == {"per_page": 10} + def test_get_org_flow_account_metrics_basic(self, mock_client): + """Test getting org flow account metrics with basic params.""" + # Arrange + org_id = 123 + mock_client.http_client.add_response( + f"/orgs/{org_id}/flows/account_metrics", {"data": []} + ) + + # Act + mock_client.organizations.get_org_flow_account_metrics( + org_id=org_id, from_date="2024-01-01" + ) + + # Assert + last_request = mock_client.http_client.get_last_request() + assert last_request["method"] == "GET" + assert f"/orgs/{org_id}/flows/account_metrics" in last_request["url"] + assert last_request["params"] == {"from": "2024-01-01"} + + def test_get_org_flow_account_metrics_with_aggregate(self, mock_client): + """Test getting org flow account metrics with all params.""" + # Arrange + org_id = 123 + mock_client.http_client.add_response( + f"/orgs/{org_id}/flows/account_metrics", {"data": []} + ) + + # Act + mock_client.organizations.get_org_flow_account_metrics( + org_id=org_id, + from_date="2024-01-01", + to_date="2024-01-31", + aggregate="daily", + ) + + # Assert + last_request = mock_client.http_client.get_last_request() + assert last_request["params"] == { + "from": "2024-01-01", + "to": "2024-01-31", + "aggregate": "daily", + } + + def test_get_audit_log_with_explicit_params(self, mock_client): + """Test getting audit log with all explicit parameters.""" + # Arrange + org_id = 123 + mock_log = [ + MockResponseBuilder.audit_log_entry(), + MockResponseBuilder.audit_log_entry(), + ] + mock_client.http_client.add_response(f"/orgs/{org_id}/audit_log", mock_log) + + # Act + audit_log = mock_client.organizations.get_audit_log( + org_id=org_id, + from_date="2024-01-01", + to_date="2024-12-31", + event_filter="create", + change_filter="attribute", + page=1, + per_page=50, + ) + + # Assert + assert len(audit_log) == 2 + assert all(isinstance(entry, LogEntry) for entry in audit_log) + last_request = mock_client.http_client.get_last_request() + assert last_request["params"] == { + "from": "2024-01-01", + "to": "2024-12-31", + "event_filter": "create", + "change_filter": "attribute", + "page": 1, + "per_page": 50, + } + + def test_get_flow_status_metrics_basic(self, mock_client): + """Test getting flow status metrics with basic params.""" + # Arrange + org_id = 123 + mock_client.http_client.add_response( + f"/orgs/{org_id}/flows/status_metrics", {"data": []} + ) + + # Act + mock_client.organizations.get_flow_status_metrics(org_id=org_id) + + # Assert + last_request = mock_client.http_client.get_last_request() + assert last_request["method"] == "GET" + assert f"/orgs/{org_id}/flows/status_metrics" in last_request["url"] + + def test_get_flow_status_metrics_with_params(self, mock_client): + """Test getting flow status metrics with all params.""" + # Arrange + org_id = 123 + mock_client.http_client.add_response( + f"/orgs/{org_id}/flows/status_metrics", {"data": []} + ) + + # Act + mock_client.organizations.get_flow_status_metrics( + org_id=org_id, from_date="2024-01-01", page=2, per_page=25 + ) + + # Assert + last_request = mock_client.http_client.get_last_request() + assert last_request["params"] == { + "from": "2024-01-01", + "page": 2, + "per_page": 25, + } + def test_get_resource_audit_log(self, mock_client): """Test getting audit logs for a canonical resource type.""" org_id = 123 @@ -291,3 +410,48 @@ def test_get_resource_audit_log(self, mock_client): assert last_request["method"] == "GET" assert f"/orgs/{org_id}/data_sources/audit_log" in last_request["url"] assert last_request["params"] == {"per_page": 10} + + def test_add_custodians_uses_post(self, mock_client): + """add_custodians must use POST per OpenAPI spec (add_org_custodians).""" + org_id = 7 + payload = OrgCustodiansPayload( + custodians=[OrgCustodianRef(email="custodian@example.com")] + ) + mock_client.http_client.add_response( + f"/orgs/{org_id}/custodians", [{"id": 1, "email": "custodian@example.com"}] + ) + + result = mock_client.organizations.add_custodians(org_id, payload) + + assert len(result) == 1 + last_request = mock_client.http_client.get_last_request() + assert last_request["method"] == "POST" + assert f"/orgs/{org_id}/custodians" in last_request["url"] + + def test_update_custodians_uses_put(self, mock_client): + """update_custodians must use PUT per OpenAPI spec (update_org_custodians).""" + org_id = 7 + payload = OrgCustodiansPayload(custodians=[OrgCustodianRef(id=42)]) + mock_client.http_client.add_response( + f"/orgs/{org_id}/custodians", [{"id": 42, "email": "x@y.com"}] + ) + + mock_client.organizations.update_custodians(org_id, payload) + + last_request = mock_client.http_client.get_last_request() + assert last_request["method"] == "PUT" + assert f"/orgs/{org_id}/custodians" in last_request["url"] + + def test_remove_custodians_uses_delete(self, mock_client): + """remove_custodians must use DELETE per OpenAPI spec (remove_org_custodians).""" + org_id = 7 + payload = OrgCustodiansPayload(custodians=[OrgCustodianRef(id=42)]) + mock_client.http_client.add_response( + f"/orgs/{org_id}/custodians", {"status": "ok"} + ) + + mock_client.organizations.remove_custodians(org_id, payload) + + last_request = mock_client.http_client.get_last_request() + assert last_request["method"] == "DELETE" + assert f"/orgs/{org_id}/custodians" in last_request["url"] diff --git a/tests/unit/test_pagination.py b/tests/unit/test_pagination.py new file mode 100644 index 0000000..eb06074 --- /dev/null +++ b/tests/unit/test_pagination.py @@ -0,0 +1,351 @@ +"""Unit tests for pagination functionality.""" + +import pytest + +from nexla_sdk.utils.pagination import Page, PageInfo, Paginator +from tests.utils import MockResponseBuilder + + +@pytest.mark.unit +class TestPageInfo: + """Tests for PageInfo model.""" + + def test_page_info_has_next_when_more_pages(self): + """Test has_next returns True when there are more pages.""" + # Arrange + page_info = PageInfo(current_page=1, total_pages=5, page_size=20) + + # Assert + assert page_info.has_next is True + + def test_page_info_has_next_false_on_last_page(self): + """Test has_next returns False when on last page.""" + # Arrange + page_info = PageInfo(current_page=5, total_pages=5, page_size=20) + + # Assert + assert page_info.has_next is False + + def test_page_info_has_next_unknown_total(self): + """Test has_next returns True when total_pages is unknown.""" + # Arrange + page_info = PageInfo(current_page=1, total_pages=None, page_size=20) + + # Assert + assert page_info.has_next is True + + def test_page_info_has_previous_on_page_2(self): + """Test has_previous returns True when not on first page.""" + # Arrange + page_info = PageInfo(current_page=2, total_pages=5, page_size=20) + + # Assert + assert page_info.has_previous is True + + def test_page_info_has_previous_false_on_page_1(self): + """Test has_previous returns False when on first page.""" + # Arrange + page_info = PageInfo(current_page=1, total_pages=5, page_size=20) + + # Assert + assert page_info.has_previous is False + + +@pytest.mark.unit +class TestPage: + """Tests for Page class.""" + + def test_page_iteration(self): + """Test that Page can be iterated.""" + # Arrange + items = [{"id": 1}, {"id": 2}, {"id": 3}] + page_info = PageInfo(current_page=1, page_size=20) + page = Page(items=items, page_info=page_info) + + # Act + iterated = list(page) + + # Assert + assert iterated == items + + def test_page_length(self): + """Test that Page has correct length.""" + # Arrange + items = [{"id": 1}, {"id": 2}] + page_info = PageInfo(current_page=1, page_size=20) + page = Page(items=items, page_info=page_info) + + # Assert + assert len(page) == 2 + + def test_page_indexing(self): + """Test that Page supports indexing.""" + # Arrange + items = [{"id": 1}, {"id": 2}, {"id": 3}] + page_info = PageInfo(current_page=1, page_size=20) + page = Page(items=items, page_info=page_info) + + # Assert + assert page[0] == {"id": 1} + assert page[2] == {"id": 3} + + +@pytest.mark.unit +class TestPaginatorBasics: + """Tests for basic Paginator functionality.""" + + def test_paginator_initialization(self, mock_client): + """Test that paginator can be initialized.""" + # Act + paginator = mock_client.sources.paginate(per_page=10) + + # Assert + assert paginator.page_size == 10 + + def test_paginator_passes_page_params(self, mock_client, mock_http_client): + """Test that paginator passes page and per_page to list().""" + # Arrange - return a simple list (the SDK's list() parses the response) + sources = [MockResponseBuilder.source() for _ in range(5)] + mock_http_client.add_response("/data_sources", sources) + + # Act + paginator = mock_client.sources.paginate(per_page=5) + page = paginator.get_page(1) + + # Assert + assert len(page.items) == 5 + mock_http_client.assert_request_made("GET", "/data_sources") + + +@pytest.mark.unit +class TestPaginatorWithRawFetch: + """Tests for Paginator using raw fetch functions. + + These tests use a simple fetch function to test Paginator's logic + independent of the SDK's model parsing. + """ + + def test_paginator_extracts_data_from_paginated_response(self): + """Test that Paginator extracts items from paginated response format.""" + + # Arrange + def mock_fetch(page=1, per_page=20): + return { + "data": [{"id": i} for i in range(per_page)], + "meta": { + "currentPage": page, + "totalCount": 100, + "pageCount": 5, + "perPage": per_page, + }, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=20) + page = paginator.get_page(1) + + # Assert + assert len(page.items) == 20 + assert page.page_info.total_pages == 5 + assert page.page_info.total_count == 100 + assert page.page_info.current_page == 1 + + def test_paginator_handles_list_response(self): + """Test that Paginator handles plain list responses.""" + + # Arrange + def mock_fetch(page=1, per_page=20): + return [{"id": i} for i in range(10)] + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=20) + page = paginator.get_page(1) + + # Assert + assert len(page.items) == 10 + # Without meta, total_pages is unknown + assert page.page_info.total_pages is None + + def test_iterate_all_items_multiple_pages(self): + """Test iterating all items across multiple pages.""" + # Arrange + call_count = 0 + + def mock_fetch(page=1, per_page=5): + nonlocal call_count + call_count += 1 + if page == 1: + return [{"id": i} for i in range(5)] # Full page + elif page == 2: + return [{"id": i + 5} for i in range(3)] # Partial page + return [] + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + all_items = list(paginator) + + # Assert + assert len(all_items) == 8 + assert call_count == 2 + + def test_iterate_stops_on_empty_page(self): + """Test that iteration stops when page is empty.""" + + # Arrange + def mock_fetch(page=1, per_page=5): + if page == 1: + return [{"id": 1}] + return [] + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + all_items = list(paginator) + + # Assert + assert len(all_items) == 1 + + def test_iter_pages_yields_page_objects(self): + """Test iter_pages yields Page objects.""" + + # Arrange + def mock_fetch(page=1, per_page=5): + if page == 1: + return [{"id": 1}, {"id": 2}] + return [] + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + pages = list(paginator.iter_pages()) + + # Assert + assert len(pages) == 1 + assert isinstance(pages[0], Page) + assert len(pages[0]) == 2 + + +@pytest.mark.unit +class TestPaginationMetadata: + """Tests for pagination metadata handling.""" + + def test_page_extracts_total_pages_from_camel_case_meta(self): + """Test extracting total pages from camelCase meta keys.""" + + # Arrange + def mock_fetch(page=1, per_page=5): + return { + "data": [{"id": i} for i in range(5)], + "meta": { + "currentPage": page, + "totalCount": 25, + "pageCount": 5, + "perPage": per_page, + }, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + page = paginator.get_page(2) + + # Assert + assert page.page_info.total_pages == 5 + assert page.page_info.total_count == 25 + assert page.page_info.current_page == 2 + + def test_page_handles_snake_case_meta_keys(self): + """Test handling of snake_case meta keys.""" + + # Arrange + def mock_fetch(page=1, per_page=5): + return { + "data": [{"id": i} for i in range(5)], + "meta": { + "current_page": page, + "total_count": 50, + "total_pages": 10, + }, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + page = paginator.get_page(1) + + # Assert + assert page.page_info.total_pages == 10 + assert page.page_info.total_count == 50 + + +@pytest.mark.unit +class TestPaginationEdgeCases: + """Tests for pagination edge cases.""" + + def test_empty_results(self): + """Test handling of empty results.""" + + # Arrange + def mock_fetch(page=1, per_page=20): + return { + "data": [], + "meta": {"currentPage": 1, "totalCount": 0, "pageCount": 0}, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=20) + page = paginator.get_page(1) + + # Assert + assert len(page) == 0 + # total_count can be None or 0 depending on API response + assert page.page_info.total_count in (0, None) + + def test_single_item(self): + """Test handling of single item results.""" + + # Arrange + def mock_fetch(page=1, per_page=20): + return { + "data": [{"id": 1}], + "meta": {"currentPage": 1, "totalCount": 1, "pageCount": 1}, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=20) + page = paginator.get_page(1) + + # Assert + assert len(page) == 1 + assert page.page_info.has_next is False + + def test_has_next_based_on_total_pages(self): + """Test has_next calculation when total_pages is known.""" + + # Arrange + def mock_fetch(page=1, per_page=5): + return { + "data": [{"id": i} for i in range(5)], + "meta": {"currentPage": page, "pageCount": 3}, + } + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=5) + page1 = paginator.get_page(1) + page3 = paginator.get_page(3) + + # Assert + assert page1.page_info.has_next is True + assert page3.page_info.has_next is False + + def test_list_response_without_meta(self): + """Test handling when response is just a list (no meta).""" + + # Arrange + def mock_fetch(page=1, per_page=20): + return [{"id": i} for i in range(3)] + + # Act + paginator = Paginator(fetch_func=mock_fetch, page_size=20) + page = paginator.get_page(1) + + # Assert + assert len(page) == 3 + # Without meta, we don't know total pages + assert page.page_info.total_pages is None diff --git a/tests/unit/test_parity_tooling.py b/tests/unit/test_parity_tooling.py new file mode 100644 index 0000000..4544a19 --- /dev/null +++ b/tests/unit/test_parity_tooling.py @@ -0,0 +1,100 @@ +"""Unit tests for parity tooling scripts.""" + +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +# The OpenAPI spec is sourced from upstream and not committed to this repo. +# Skip parity-tooling tests when the spec file is absent so unit suites stay +# green for contributors who do not have the spec checked out locally. +SPEC_PATH = Path("plugin-redoc-0.yaml") +spec_required = pytest.mark.skipif( + not SPEC_PATH.exists(), + reason="plugin-redoc-0.yaml not present at repo root; parity tooling tests are local-only", +) + + +@spec_required +@pytest.mark.unit +def test_generate_operation_map_script(): + result = subprocess.run( + [ + sys.executable, + "scripts/parity/generate_operation_map.py", + "--spec", + "plugin-redoc-0.yaml", + "--output", + "nexla_sdk/generated/operation_map.py", + ], + check=False, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + assert Path("nexla_sdk/generated/operation_map.py").exists() + + +@spec_required +@pytest.mark.unit +def test_check_operation_map_sync_script(): + result = subprocess.run( + [sys.executable, "scripts/parity/check_operation_map_sync.py"], + check=False, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + + +@spec_required +@pytest.mark.unit +def test_build_matrices_script_with_temp_routes(tmp_path: Path): + routes = tmp_path / "routes.rb" + routes.write_text( + "\n".join( + [ + "post '/token', :to => 'token#create'", + "put '/token/logout', :to => 'token#invalidate'", + "match '/notification_types/list' => 'notification_types#list', :via => [:get]", + ] + ) + ) + out_dir = tmp_path / "parity_out" + + result = subprocess.run( + [ + sys.executable, + "scripts/parity/build_matrices.py", + "--spec", + "plugin-redoc-0.yaml", + "--admin-routes", + str(routes), + "--resources-dir", + "nexla_sdk/resources", + "--out-dir", + str(out_dir), + ], + check=False, + capture_output=True, + text=True, + ) + + assert result.returncode == 0, result.stderr + expected_files = { + "openapi_matrix.json", + "admin_routes_matrix.json", + "sdk_matrix.json", + "diff_openapi_vs_sdk.json", + "diff_admin_routes_vs_sdk.json", + } + created_files = {path.name for path in out_dir.glob("*.json")} + assert expected_files.issubset(created_files) + + diff_payload = json.loads((out_dir / "diff_openapi_vs_sdk.json").read_text()) + assert "missing_in_sdk" in diff_payload + assert "extra_in_sdk" in diff_payload diff --git a/tests/unit/test_projects.py b/tests/unit/test_projects.py index 595b154..250773b 100644 --- a/tests/unit/test_projects.py +++ b/tests/unit/test_projects.py @@ -211,6 +211,56 @@ def test_search_flows(self, mock_client): "POST", f"/projects/{project_id}/flows/search" ) + def test_legacy_data_flows_endpoints(self, mock_client): + """Test deprecated /data_flows project endpoints.""" + project_id = 123 + factory = MockDataFactory() + mock_data = [factory.create_mock_project_data_flow() for _ in range(2)] + mock_client.http_client.add_response( + f"/projects/{project_id}/data_flows", mock_data + ) + + list_result = mock_client.projects.get_data_flows_legacy(project_id) + assert len(list_result) == 2 + assert all(isinstance(flow, ProjectDataFlow) for flow in list_result) + mock_client.http_client.assert_request_made( + "GET", f"/projects/{project_id}/data_flows" + ) + + flows = ProjectFlowList(data_flows=[ProjectFlowIdentifier(data_source_id=456)]) + + mock_client.http_client.clear_responses() + mock_client.http_client.add_response( + f"/projects/{project_id}/data_flows", mock_data + ) + add_result = mock_client.projects.add_data_flows_legacy(project_id, flows) + assert len(add_result) == 2 + mock_client.http_client.assert_request_made( + "PUT", f"/projects/{project_id}/data_flows" + ) + + mock_client.http_client.clear_responses() + mock_client.http_client.add_response( + f"/projects/{project_id}/data_flows", mock_data + ) + replace_result = mock_client.projects.replace_data_flows_legacy( + project_id, flows + ) + assert len(replace_result) == 2 + mock_client.http_client.assert_request_made( + "POST", f"/projects/{project_id}/data_flows" + ) + + mock_client.http_client.clear_responses() + mock_client.http_client.add_response( + f"/projects/{project_id}/data_flows", mock_data + ) + remove_result = mock_client.projects.remove_data_flows_legacy(project_id, flows) + assert len(remove_result) == 2 + mock_client.http_client.assert_request_made( + "DELETE", f"/projects/{project_id}/data_flows" + ) + def test_add_data_flows(self, mock_client): """Test adding data flows to a project.""" # Arrange diff --git a/tests/unit/test_raw_operations.py b/tests/unit/test_raw_operations.py new file mode 100644 index 0000000..51e5c6c --- /dev/null +++ b/tests/unit/test_raw_operations.py @@ -0,0 +1,66 @@ +"""Unit tests for operation-level raw client access.""" + +import pytest + +from nexla_sdk.exceptions import ValidationError + + +@pytest.mark.unit +class TestRawOperationsClient: + def test_list_operations_includes_known_operation(self, mock_client): + operations = mock_client.raw.list_operations() + assert "get_project_flows" in operations + assert "get_data_sources" in operations + + def test_call_operation_renders_path_and_uses_method(self, mock_client): + mock_client.http_client.add_response( + "/projects/123/flows", {"data": [{"flow_id": 123}]} + ) + + response = mock_client.raw.call( + "get_project_flows", path_params={"project_id": 123} + ) + + assert response == {"data": [{"flow_id": 123}]} + mock_client.http_client.assert_request_made("GET", "/projects/123/flows") + + def test_call_operation_with_query_and_body(self, mock_client): + mock_client.http_client.add_response("/notifications", {"status": "ok"}) + + response = mock_client.raw.call( + "get_notifications", + query={"page": 2, "per_page": 10}, + body={"read": True}, + ) + + assert response == {"status": "ok"} + request = mock_client.http_client.get_last_request() + assert request["params"] == {"page": 2, "per_page": 10} + assert request["json"] == {"read": True} + assert request["method"] == "GET" + + def test_call_operation_missing_path_param_raises_validation_error( + self, mock_client + ): + with pytest.raises(ValidationError): + mock_client.raw.call("get_project_flows") + + def test_call_unknown_operation_raises_validation_error(self, mock_client): + with pytest.raises(ValidationError): + mock_client.raw.call("not_a_real_operation") + + def test_direct_helpers(self, mock_client): + mock_client.http_client.add_response("/limits", {"second": {"common": {}}}) + response = mock_client.raw.get("/limits") + assert "second" in response + mock_client.http_client.assert_request_made("GET", "/limits") + + def test_generic_request_supports_backend_only_routes(self, mock_client): + mock_client.http_client.add_response( + "/self_signup_requests/1/approve", {"id": 1} + ) + response = mock_client.raw.request("post", "/self_signup_requests/1/approve") + assert response["id"] == 1 + mock_client.http_client.assert_request_made( + "POST", "/self_signup_requests/1/approve" + ) diff --git a/tests/unit/test_search_operations.py b/tests/unit/test_search_operations.py new file mode 100644 index 0000000..3f34fd5 --- /dev/null +++ b/tests/unit/test_search_operations.py @@ -0,0 +1,327 @@ +"""Unit tests for search operations across resources. + +This module tests the search() and search_tags() methods available on BaseResource. +These methods allow searching resources using filter criteria and tags respectively. +""" + +import pytest + +from nexla_sdk.exceptions import NotFoundError, ValidationError +from nexla_sdk.models.sources.responses import Source +from tests.utils import ( + MockDataFactory, + MockResponseBuilder, + create_http_error, + destination_list, + nexset_list, + source_list, +) + + +@pytest.mark.unit +class TestSearchOperation: + """Tests for the search() method on resources.""" + + def test_search_with_simple_filter_returns_results( + self, mock_client, mock_http_client + ): + """Test that search with a simple filter returns matching results.""" + # Arrange + mock_sources = source_list(count=3) + mock_http_client.add_response("/data_sources/search", mock_sources) + + filters = {"status": "ACTIVE"} + + # Act + results = mock_client.sources.search(filters) + + # Assert + assert len(results) == 3 + mock_http_client.assert_request_made("POST", "/data_sources/search") + last_request = mock_http_client.get_last_request() + assert last_request["json"] == filters + + def test_search_with_multiple_filters_and_logic( + self, mock_client, mock_http_client + ): + """Test search with multiple filters uses AND logic.""" + # Arrange + mock_sources = source_list(count=2) + mock_http_client.add_response("/data_sources/search", mock_sources) + + filters = { + "status": "ACTIVE", + "source_type": "postgres", + "managed": False, + } + + # Act + results = mock_client.sources.search(filters) + + # Assert + assert len(results) == 2 + mock_http_client.assert_request_made("POST", "/data_sources/search") + last_request = mock_http_client.get_last_request() + assert last_request["json"] == filters + assert last_request["json"]["status"] == "ACTIVE" + assert last_request["json"]["source_type"] == "postgres" + assert last_request["json"]["managed"] is False + + def test_search_with_empty_filters_returns_empty( + self, mock_client, mock_http_client + ): + """Test that search with empty filters returns empty list.""" + # Arrange + mock_http_client.add_response("/data_sources/search", []) + + filters = {} + + # Act + results = mock_client.sources.search(filters) + + # Assert + assert results == [] + mock_http_client.assert_request_made("POST", "/data_sources/search") + + def test_search_with_pagination_params(self, mock_client, mock_http_client): + """Test that search respects pagination parameters.""" + # Arrange + mock_sources = source_list(count=5) + mock_http_client.add_response("/data_sources/search", mock_sources) + + filters = {"status": "ACTIVE"} + + # Act + results = mock_client.sources.search(filters, page=2, per_page=5) + + # Assert + assert len(results) == 5 + mock_http_client.assert_request_made("POST", "/data_sources/search") + last_request = mock_http_client.get_last_request() + assert last_request["params"]["page"] == 2 + assert last_request["params"]["per_page"] == 5 + + def test_search_returns_proper_model_objects(self, mock_client, mock_http_client): + """Test that search returns properly parsed model objects.""" + # Arrange + factory = MockDataFactory() + mock_source = factory.create_mock_source( + id=123, + name="Test Source", + status="ACTIVE", + source_type="postgres", + ) + mock_http_client.add_response("/data_sources/search", [mock_source]) + + filters = {"id": 123} + + # Act + results = mock_client.sources.search(filters) + + # Assert + assert len(results) == 1 + assert isinstance(results[0], Source) + assert results[0].id == 123 + assert results[0].name == "Test Source" + assert results[0].status == "ACTIVE" + + def test_search_not_found_returns_404(self, mock_client, mock_http_client): + """Test that search for non-existent resources returns 404.""" + # Arrange + mock_http_client.add_error( + "/data_sources/search", + create_http_error(404, "No resources found"), + ) + + filters = {"id": 99999} + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.search(filters) + + def test_search_validation_error_returns_400(self, mock_client, mock_http_client): + """Test that search with invalid filters returns 400.""" + # Arrange + mock_http_client.add_error( + "/data_sources/search", + create_http_error(400, "Invalid filter parameters"), + ) + + filters = {"invalid_field": "invalid_value"} + + # Act & Assert + with pytest.raises(ValidationError): + mock_client.sources.search(filters) + + +@pytest.mark.unit +class TestSearchTagsOperation: + """Tests for the search_tags() method on resources.""" + + def test_search_tags_with_single_tag(self, mock_client, mock_http_client): + """Test search_tags with a single tag returns matching results.""" + # Arrange + mock_sources = source_list(count=2) + mock_http_client.add_response("/data_sources/search_tags", mock_sources) + + tags = ["production"] + + # Act + results = mock_client.sources.search_tags(tags) + + # Assert + assert len(results) == 2 + mock_http_client.assert_request_made("POST", "/data_sources/search_tags") + last_request = mock_http_client.get_last_request() + assert last_request["json"] == tags + + def test_search_tags_with_multiple_tags(self, mock_client, mock_http_client): + """Test search_tags with multiple tags returns matching results.""" + # Arrange + mock_sources = source_list(count=3) + mock_http_client.add_response("/data_sources/search_tags", mock_sources) + + tags = ["production", "analytics", "important"] + + # Act + results = mock_client.sources.search_tags(tags) + + # Assert + assert len(results) == 3 + mock_http_client.assert_request_made("POST", "/data_sources/search_tags") + last_request = mock_http_client.get_last_request() + assert last_request["json"] == tags + assert len(last_request["json"]) == 3 + + def test_search_tags_with_nonexistent_tag_returns_empty( + self, mock_client, mock_http_client + ): + """Test that search_tags with non-existent tag returns empty list.""" + # Arrange + mock_http_client.add_response("/data_sources/search_tags", []) + + tags = ["nonexistent-tag-12345"] + + # Act + results = mock_client.sources.search_tags(tags) + + # Assert + assert results == [] + mock_http_client.assert_request_made("POST", "/data_sources/search_tags") + + def test_search_tags_with_query_params(self, mock_client, mock_http_client): + """Test search_tags with additional query parameters.""" + # Arrange + mock_sources = source_list(count=2) + mock_http_client.add_response("/data_sources/search_tags", mock_sources) + + tags = ["production"] + + # Act + results = mock_client.sources.search_tags(tags, page=1, per_page=10) + + # Assert + assert len(results) == 2 + last_request = mock_http_client.get_last_request() + assert last_request["params"]["page"] == 1 + assert last_request["params"]["per_page"] == 10 + + +@pytest.mark.unit +class TestSearchAcrossResources: + """Tests verifying search operations work across different resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint,mock_data_func", + [ + ("sources", "/data_sources", source_list), + ("destinations", "/data_sinks", destination_list), + ("nexsets", "/data_sets", nexset_list), + ], + ) + def test_search_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint, mock_data_func + ): + """Test search works for different resource types.""" + # Arrange + mock_data = mock_data_func(count=2) + mock_http_client.add_response(f"{endpoint}/search", mock_data) + + filters = {"status": "ACTIVE"} + + # Act + resource = getattr(mock_client, resource_name) + results = resource.search(filters) + + # Assert + assert len(results) == 2 + mock_http_client.assert_request_made("POST", f"{endpoint}/search") + + @pytest.mark.parametrize( + "resource_name,endpoint,mock_data_func", + [ + ("sources", "/data_sources", source_list), + ("destinations", "/data_sinks", destination_list), + ("nexsets", "/data_sets", nexset_list), + ], + ) + def test_search_tags_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint, mock_data_func + ): + """Test search_tags works for different resource types.""" + # Arrange + mock_data = mock_data_func(count=3) + mock_http_client.add_response(f"{endpoint}/search_tags", mock_data) + + tags = ["production", "test"] + + # Act + resource = getattr(mock_client, resource_name) + results = resource.search_tags(tags) + + # Assert + assert len(results) == 3 + mock_http_client.assert_request_made("POST", f"{endpoint}/search_tags") + last_request = mock_http_client.get_last_request() + assert last_request["json"] == tags + + +@pytest.mark.unit +class TestSearchResponseBuilder: + """Tests for the SearchResponseBuilder utility.""" + + def test_search_response_with_items(self): + """Test building search response with items.""" + items = [{"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"}] + + response = MockResponseBuilder.search_response(items=items) + + assert response["data"] == items + assert response["meta"]["total_count"] == 2 + assert response["meta"]["page"] == 1 + assert response["meta"]["per_page"] == 20 + + def test_search_response_with_custom_total(self): + """Test building search response with custom total count.""" + items = [{"id": 1, "name": "Item 1"}] + + response = MockResponseBuilder.search_response(items=items, total=100) + + assert response["data"] == items + assert response["meta"]["total_count"] == 100 + + def test_search_response_with_pagination(self): + """Test building search response with pagination params.""" + items = [{"id": 1, "name": "Item 1"}] + + response = MockResponseBuilder.search_response(items=items, page=3, per_page=50) + + assert response["meta"]["page"] == 3 + assert response["meta"]["per_page"] == 50 + + def test_search_response_empty(self): + """Test building empty search response.""" + response = MockResponseBuilder.search_response() + + assert response["data"] == [] + assert response["meta"]["total_count"] == 0 diff --git a/tests/unit/test_self_signup.py b/tests/unit/test_self_signup.py index fb199c9..d4c8371 100644 --- a/tests/unit/test_self_signup.py +++ b/tests/unit/test_self_signup.py @@ -35,6 +35,12 @@ def test_admin_endpoints(self, client, mock_http_client): ) approved = client.self_signup.approve_request("1") assert isinstance(approved, SelfSignupRequest) and approved.id == 1 + # The backend routes self-signup approve via POST. The OpenAPI spec + # advertises PUT in some versions; the SDK locks the POST contract + # here so future drift is caught. + last_request = mock_http_client.get_last_request() + assert last_request["method"] == "POST" + assert "/self_signup_requests/1/approve" in last_request["url"] mock_http_client.clear_responses() mock_http_client.add_response( diff --git a/tests/unit/test_service_keys.py b/tests/unit/test_service_keys.py new file mode 100644 index 0000000..760f1b5 --- /dev/null +++ b/tests/unit/test_service_keys.py @@ -0,0 +1,256 @@ +"""Unit tests for service keys resource.""" + +import pytest + +from nexla_sdk.models.service_keys.requests import ServiceKeyCreate, ServiceKeyUpdate +from nexla_sdk.models.service_keys.responses import ServiceKey +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_SERVICE_KEY = { + "id": 123, + "owner_id": 1, + "org_id": 1, + "name": "Test Service Key", + "description": "A test service key", + "status": "ACTIVE", + "api_key": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6", + "last_rotated_key": None, + "last_rotated_at": None, + "data_source_id": None, + "updated_at": "2025-01-01T00:00:00Z", + "created_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_SERVICE_KEYS_LIST = [ + SAMPLE_SERVICE_KEY, + {**SAMPLE_SERVICE_KEY, "id": 124, "name": "Another Key", "status": "PAUSED"}, + {**SAMPLE_SERVICE_KEY, "id": 125, "name": "Third Key"}, +] + + +@pytest.fixture +def sample_service_key_response(): + """Sample service key response.""" + return SAMPLE_SERVICE_KEY.copy() + + +@pytest.fixture +def sample_service_keys_list(): + """Sample service keys list response.""" + return [k.copy() for k in SAMPLE_SERVICE_KEYS_LIST] + + +@pytest.mark.unit +class TestServiceKeysResource: + """Unit tests for ServiceKeysResource using mocks.""" + + def test_list_service_keys_success( + self, mock_client, mock_http_client, sample_service_keys_list + ): + """Test listing service keys with successful response.""" + mock_http_client.add_response("/service_keys", sample_service_keys_list) + + keys = mock_client.service_keys.list() + + assert len(keys) == 3 + assert_model_list_valid(keys, ServiceKey) + mock_http_client.assert_request_made("GET", "/service_keys") + + def test_list_service_keys_all( + self, mock_client, mock_http_client, sample_service_keys_list + ): + """Test listing all service keys in org.""" + mock_http_client.add_response("/service_keys", sample_service_keys_list) + + keys = mock_client.service_keys.list(all_keys=True) + + assert len(keys) == 3 + request = mock_http_client.get_request() + assert "all" in str(request) + + def test_list_service_keys_with_pagination( + self, mock_client, mock_http_client, sample_service_keys_list + ): + """Test listing service keys with pagination.""" + mock_http_client.add_response("/service_keys", sample_service_keys_list) + + keys = mock_client.service_keys.list(page=1, per_page=10) + + assert len(keys) == 3 + + def test_get_service_key_by_id( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test getting a service key by ID.""" + key_id = 123 + mock_http_client.add_response( + f"/service_keys/{key_id}", sample_service_key_response + ) + + key = mock_client.service_keys.get(key_id) + + assert_model_valid(key, {"id": key_id}) + mock_http_client.assert_request_made("GET", f"/service_keys/{key_id}") + + def test_get_service_key_by_key_value( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test getting a service key by its api_key value.""" + api_key = "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" + mock_http_client.add_response( + f"/service_keys/{api_key}", sample_service_key_response + ) + + key = mock_client.service_keys.get(api_key) + + assert_model_valid(key, {"api_key": api_key}) + + def test_create_service_key_success( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test creating a service key.""" + mock_http_client.add_response("/service_keys", sample_service_key_response) + + create_data = ServiceKeyCreate( + name="Test Service Key", + description="A test service key", + ) + key = mock_client.service_keys.create(create_data) + + assert_model_valid(key, {"name": "Test Service Key"}) + mock_http_client.assert_request_made("POST", "/service_keys") + + def test_update_service_key_success( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test updating a service key.""" + key_id = 123 + updated_response = {**sample_service_key_response, "name": "Updated Key"} + mock_http_client.add_response(f"/service_keys/{key_id}", updated_response) + + update_data = ServiceKeyUpdate(name="Updated Key") + key = mock_client.service_keys.update(key_id, update_data) + + assert key.name == "Updated Key" + mock_http_client.assert_request_made("PUT", f"/service_keys/{key_id}") + + def test_delete_service_key_success(self, mock_client, mock_http_client): + """Test deleting a service key.""" + key_id = 123 + mock_http_client.add_response(f"/service_keys/{key_id}", {"success": True}) + + result = mock_client.service_keys.delete(key_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/service_keys/{key_id}") + + def test_rotate_service_key_success( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test rotating a service key.""" + key_id = 123 + rotated_response = { + **sample_service_key_response, + "api_key": "new_rotated_key_12345678901234567", + "last_rotated_key": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6", + "last_rotated_at": "2025-01-02T00:00:00Z", + } + mock_http_client.add_response( + f"/service_keys/{key_id}/rotate", rotated_response + ) + + key = mock_client.service_keys.rotate(key_id) + + assert key.api_key == "new_rotated_key_12345678901234567" + assert key.last_rotated_key == "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" + mock_http_client.assert_request_made("PUT", f"/service_keys/{key_id}/rotate") + + def test_activate_service_key_success( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test activating a service key.""" + key_id = 123 + activated_response = {**sample_service_key_response, "status": "ACTIVE"} + mock_http_client.add_response( + f"/service_keys/{key_id}/activate", activated_response + ) + + key = mock_client.service_keys.activate(key_id) + + assert key.status == "ACTIVE" + mock_http_client.assert_request_made("PUT", f"/service_keys/{key_id}/activate") + + def test_pause_service_key_success( + self, mock_client, mock_http_client, sample_service_key_response + ): + """Test pausing a service key.""" + key_id = 123 + paused_response = {**sample_service_key_response, "status": "PAUSED"} + mock_http_client.add_response(f"/service_keys/{key_id}/pause", paused_response) + + key = mock_client.service_keys.pause(key_id) + + assert key.status == "PAUSED" + mock_http_client.assert_request_made("PUT", f"/service_keys/{key_id}/pause") + + +@pytest.mark.unit +class TestServiceKeyModels: + """Unit tests for service key models.""" + + def test_service_key_model_validation(self, sample_service_key_response): + """Test ServiceKey model parses valid data correctly.""" + key = ServiceKey.model_validate(sample_service_key_response) + + assert key.id == 123 + assert key.name == "Test Service Key" + assert key.status == "ACTIVE" + assert key.api_key == "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" + assert key.owner_id == 1 + assert key.org_id == 1 + + def test_service_key_with_rotated_key(self): + """Test ServiceKey model with rotated key data.""" + data = { + **SAMPLE_SERVICE_KEY, + "last_rotated_key": "old_key_value", + "last_rotated_at": "2025-01-02T00:00:00Z", + } + key = ServiceKey.model_validate(data) + + assert key.last_rotated_key == "old_key_value" + assert key.last_rotated_at is not None + + def test_service_key_create_model_serialization(self): + """Test ServiceKeyCreate model serialization.""" + create_data = ServiceKeyCreate( + name="My Key", + description="My description", + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["name"] == "My Key" + assert data["description"] == "My description" + + def test_service_key_create_with_data_source(self): + """Test ServiceKeyCreate model with data_source_id.""" + create_data = ServiceKeyCreate( + name="Flow Key", + description="Key for flow", + data_source_id=456, + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["data_source_id"] == 456 + + def test_service_key_update_model_serialization(self): + """Test ServiceKeyUpdate model serialization.""" + update_data = ServiceKeyUpdate(name="Updated Name") + + data = update_data.model_dump(exclude_none=True) + + assert data["name"] == "Updated Name" + assert "description" not in data diff --git a/tests/unit/test_tag_management.py b/tests/unit/test_tag_management.py new file mode 100644 index 0000000..42b22da --- /dev/null +++ b/tests/unit/test_tag_management.py @@ -0,0 +1,499 @@ +"""Unit tests for tag management operations across resources. + +Tests cover: +- get_tags: Retrieve tags for a resource +- set_tags: Replace all tags (POST) +- add_tags: Merge tags with existing (PUT) +- remove_tags: Delete specific tags (DELETE) +""" + +import pytest + +from nexla_sdk.exceptions import AuthorizationError, NotFoundError +from tests.utils import create_http_error + + +@pytest.mark.unit +class TestGetTags: + """Tests for retrieving tags from resources.""" + + def test_get_tags_returns_list(self, mock_client, mock_http_client): + """Test that get_tags returns a list of tags.""" + # Arrange + resource_id = 123 + expected_tags = ["production", "critical", "data-pipeline"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", expected_tags + ) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == expected_tags + assert isinstance(result, list) + assert len(result) == 3 + mock_http_client.assert_request_made("GET", f"/data_sources/{resource_id}/tags") + + def test_get_tags_empty_list(self, mock_client, mock_http_client): + """Test get_tags returns empty list when no tags exist.""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", []) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == [] + assert isinstance(result, list) + mock_http_client.assert_request_made("GET", f"/data_sources/{resource_id}/tags") + + def test_get_tags_single_tag(self, mock_client, mock_http_client): + """Test get_tags with a single tag.""" + # Arrange + resource_id = 456 + expected_tags = ["environment:staging"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", expected_tags + ) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == expected_tags + assert len(result) == 1 + + +@pytest.mark.unit +class TestSetTags: + """Tests for replacing all tags on a resource.""" + + def test_set_tags_success(self, mock_client, mock_http_client): + """Test that set_tags replaces all tags.""" + # Arrange + resource_id = 123 + new_tags = ["new-tag-1", "new-tag-2"] + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", new_tags) + + # Act + result = mock_client.sources.set_tags(resource_id, new_tags) + + # Assert + assert result == new_tags + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/tags" + ) + # Verify the request body contains the tags + last_request = mock_http_client.get_last_request() + assert last_request is not None + assert last_request.get("json") == new_tags + + def test_set_tags_with_empty_list_clears_all(self, mock_client, mock_http_client): + """Test that set_tags with empty list clears all tags.""" + # Arrange + resource_id = 123 + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", []) + + # Act + result = mock_client.sources.set_tags(resource_id, []) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "POST", f"/data_sources/{resource_id}/tags" + ) + last_request = mock_http_client.get_last_request() + assert last_request.get("json") == [] + + def test_set_tags_replaces_existing(self, mock_client, mock_http_client): + """Test that set_tags completely replaces existing tags.""" + # Arrange + resource_id = 789 + # Simulate replacing ["old-tag"] with ["completely", "new", "tags"] + new_tags = ["completely", "new", "tags"] + mock_http_client.add_response(f"/data_sinks/{resource_id}/tags", new_tags) + + # Act + result = mock_client.destinations.set_tags(resource_id, new_tags) + + # Assert + assert result == new_tags + assert "completely" in result + mock_http_client.assert_request_made("POST", f"/data_sinks/{resource_id}/tags") + + +@pytest.mark.unit +class TestAddTags: + """Tests for adding/merging tags to a resource.""" + + def test_add_tags_success(self, mock_client, mock_http_client): + """Test that add_tags merges with existing tags.""" + # Arrange + resource_id = 123 + tags_to_add = ["new-tag"] + # Simulated merged response (existing + new) + merged_tags = ["existing-tag", "new-tag"] + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", merged_tags) + + # Act + result = mock_client.sources.add_tags(resource_id, tags_to_add) + + # Assert + assert result == merged_tags + mock_http_client.assert_request_made("PUT", f"/data_sources/{resource_id}/tags") + last_request = mock_http_client.get_last_request() + assert last_request.get("json") == tags_to_add + + def test_add_tags_with_duplicate_tags_idempotent( + self, mock_client, mock_http_client + ): + """Test that add_tags with duplicate tags is idempotent.""" + # Arrange + resource_id = 123 + # Adding a tag that already exists + tags_to_add = ["existing-tag"] + # Response shows same tags (no duplicates created) + existing_tags = ["existing-tag", "another-tag"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", existing_tags + ) + + # Act + result = mock_client.sources.add_tags(resource_id, tags_to_add) + + # Assert + assert result == existing_tags + # Verify no duplicate "existing-tag" in result + assert result.count("existing-tag") == 1 + mock_http_client.assert_request_made("PUT", f"/data_sources/{resource_id}/tags") + + def test_add_multiple_tags(self, mock_client, mock_http_client): + """Test adding multiple tags at once.""" + # Arrange + resource_id = 456 + tags_to_add = ["tag-1", "tag-2", "tag-3"] + merged_tags = ["original", "tag-1", "tag-2", "tag-3"] + mock_http_client.add_response(f"/data_sets/{resource_id}/tags", merged_tags) + + # Act + result = mock_client.nexsets.add_tags(resource_id, tags_to_add) + + # Assert + assert result == merged_tags + assert all(tag in result for tag in tags_to_add) + mock_http_client.assert_request_made("PUT", f"/data_sets/{resource_id}/tags") + + +@pytest.mark.unit +class TestRemoveTags: + """Tests for removing tags from a resource.""" + + def test_remove_tags_success(self, mock_client, mock_http_client): + """Test that remove_tags deletes specific tags.""" + # Arrange + resource_id = 123 + tags_to_remove = ["tag-to-remove"] + # Remaining tags after removal + remaining_tags = ["kept-tag-1", "kept-tag-2"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", remaining_tags + ) + + # Act + result = mock_client.sources.remove_tags(resource_id, tags_to_remove) + + # Assert + assert result == remaining_tags + assert "tag-to-remove" not in result + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/tags" + ) + last_request = mock_http_client.get_last_request() + assert last_request.get("json") == tags_to_remove + + def test_remove_multiple_tags(self, mock_client, mock_http_client): + """Test removing multiple tags at once.""" + # Arrange + resource_id = 789 + tags_to_remove = ["remove-1", "remove-2"] + remaining_tags = ["keeper"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", remaining_tags + ) + + # Act + result = mock_client.sources.remove_tags(resource_id, tags_to_remove) + + # Assert + assert result == remaining_tags + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/tags" + ) + + def test_remove_all_tags_leaves_empty(self, mock_client, mock_http_client): + """Test removing all tags leaves empty list.""" + # Arrange + resource_id = 123 + tags_to_remove = ["only-tag"] + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", []) + + # Act + result = mock_client.sources.remove_tags(resource_id, tags_to_remove) + + # Assert + assert result == [] + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/tags" + ) + + def test_remove_nonexistent_tags_no_error(self, mock_client, mock_http_client): + """Test that removing non-existent tags does not raise an error.""" + # Arrange + resource_id = 123 + tags_to_remove = ["nonexistent-tag"] + existing_tags = ["existing-tag"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", existing_tags + ) + + # Act + result = mock_client.sources.remove_tags(resource_id, tags_to_remove) + + # Assert + assert result == existing_tags + mock_http_client.assert_request_made( + "DELETE", f"/data_sources/{resource_id}/tags" + ) + + +@pytest.mark.unit +class TestTagErrorHandling: + """Tests for tag operation error scenarios.""" + + def test_tags_not_found_returns_404(self, mock_client, mock_http_client): + """Test that accessing tags on non-existent resource returns 404.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/tags", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.get_tags(resource_id) + + def test_tags_permission_denied_returns_403(self, mock_client, mock_http_client): + """Test that unauthorized access to tags returns 403.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/tags", + create_http_error(403, "Forbidden"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.get_tags(resource_id) + + def test_set_tags_not_found(self, mock_client, mock_http_client): + """Test set_tags on non-existent resource raises NotFoundError.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/tags", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.set_tags(resource_id, ["tag"]) + + def test_add_tags_permission_denied(self, mock_client, mock_http_client): + """Test add_tags with insufficient permissions raises AuthorizationError.""" + # Arrange + resource_id = 123 + mock_http_client.add_error( + f"/data_sources/{resource_id}/tags", + create_http_error(403, "Insufficient permissions to modify tags"), + ) + + # Act & Assert + with pytest.raises(AuthorizationError): + mock_client.sources.add_tags(resource_id, ["new-tag"]) + + def test_remove_tags_not_found(self, mock_client, mock_http_client): + """Test remove_tags on non-existent resource raises NotFoundError.""" + # Arrange + resource_id = 99999 + mock_http_client.add_error( + f"/data_sources/{resource_id}/tags", + create_http_error(404, "Resource not found"), + ) + + # Act & Assert + with pytest.raises(NotFoundError): + mock_client.sources.remove_tags(resource_id, ["tag"]) + + +@pytest.mark.unit +class TestTagsAcrossResources: + """Tests verifying tag operations work across different resource types.""" + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_get_tags_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test get_tags works across different resource types.""" + # Arrange + resource_id = 123 + expected_tags = ["resource-tag", "type-specific"] + mock_http_client.add_response(f"{endpoint}/{resource_id}/tags", expected_tags) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.get_tags(resource_id) + + # Assert + assert result == expected_tags + mock_http_client.assert_request_made("GET", f"{endpoint}/{resource_id}/tags") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_set_tags_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test set_tags works across different resource types.""" + # Arrange + resource_id = 456 + new_tags = ["replaced-tag"] + mock_http_client.add_response(f"{endpoint}/{resource_id}/tags", new_tags) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.set_tags(resource_id, new_tags) + + # Assert + assert result == new_tags + mock_http_client.assert_request_made("POST", f"{endpoint}/{resource_id}/tags") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_add_tags_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test add_tags works across different resource types.""" + # Arrange + resource_id = 789 + tags_to_add = ["added-tag"] + merged_tags = ["existing", "added-tag"] + mock_http_client.add_response(f"{endpoint}/{resource_id}/tags", merged_tags) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.add_tags(resource_id, tags_to_add) + + # Assert + assert result == merged_tags + mock_http_client.assert_request_made("PUT", f"{endpoint}/{resource_id}/tags") + + @pytest.mark.parametrize( + "resource_name,endpoint", + [ + ("sources", "/data_sources"), + ("destinations", "/data_sinks"), + ("nexsets", "/data_sets"), + ("credentials", "/data_credentials"), + ], + ) + def test_remove_tags_for_resource_type( + self, mock_client, mock_http_client, resource_name, endpoint + ): + """Test remove_tags works across different resource types.""" + # Arrange + resource_id = 321 + tags_to_remove = ["to-remove"] + remaining_tags = ["remaining"] + mock_http_client.add_response(f"{endpoint}/{resource_id}/tags", remaining_tags) + + # Act + resource = getattr(mock_client, resource_name) + result = resource.remove_tags(resource_id, tags_to_remove) + + # Assert + assert result == remaining_tags + mock_http_client.assert_request_made("DELETE", f"{endpoint}/{resource_id}/tags") + + +@pytest.mark.unit +class TestTagFormats: + """Tests for various tag format scenarios.""" + + def test_tags_with_special_characters(self, mock_client, mock_http_client): + """Test tags containing special characters.""" + # Arrange + resource_id = 123 + special_tags = ["env:production", "team/data-eng", "version_2.0"] + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", special_tags) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == special_tags + assert "env:production" in result + + def test_tags_with_unicode(self, mock_client, mock_http_client): + """Test tags containing unicode characters.""" + # Arrange + resource_id = 123 + unicode_tags = ["categoria-datos", "equipo-analisis"] + mock_http_client.add_response(f"/data_sources/{resource_id}/tags", unicode_tags) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == unicode_tags + + def test_tags_case_sensitivity(self, mock_client, mock_http_client): + """Test that tags preserve case sensitivity.""" + # Arrange + resource_id = 123 + case_sensitive_tags = ["Production", "CRITICAL", "lowercased"] + mock_http_client.add_response( + f"/data_sources/{resource_id}/tags", case_sensitive_tags + ) + + # Act + result = mock_client.sources.get_tags(resource_id) + + # Assert + assert result == case_sensitive_tags + assert "Production" in result + assert "CRITICAL" in result + assert "lowercased" in result diff --git a/tests/unit/test_tokens_resource.py b/tests/unit/test_tokens_resource.py new file mode 100644 index 0000000..4cf7ad0 --- /dev/null +++ b/tests/unit/test_tokens_resource.py @@ -0,0 +1,60 @@ +"""Unit tests for token resource.""" + +import pytest + +from nexla_sdk import NexlaClient + +pytestmark = pytest.mark.unit + + +@pytest.fixture +def client(mock_client: NexlaClient) -> NexlaClient: + return mock_client + + +class TestTokensResource: + def test_logout(self, client, mock_http_client): + mock_http_client.add_response("/token/logout", {"status": "ok"}) + + response = client.tokens.logout() + + assert isinstance(response, dict) + mock_http_client.assert_request_made("POST", "/token/logout") + + def test_create_google_token(self, client, mock_http_client): + mock_http_client.add_response("/gtoken", {"access_token": "goog"}) + + response = client.tokens.create_google_token({"id_token": "g123"}) + + assert response["access_token"] == "goog" + mock_http_client.assert_request_made("POST", "/gtoken") + + def test_metadata(self, client, mock_http_client): + mock_http_client.add_response("/metadata", {"version": "1"}) + + response = client.tokens.metadata() + + assert response["version"] == "1" + mock_http_client.assert_request_made("GET", "/metadata") + + def test_metadata_with_uid(self, client, mock_http_client): + mock_http_client.add_response("/metadata/uid1", {"version": "1"}) + + response = client.tokens.metadata("uid1") + + assert response["version"] == "1" + mock_http_client.assert_request_made("GET", "/metadata/uid1") + + def test_resource_authorize(self, client, mock_http_client): + mock_http_client.add_response("/resource_authorize", {"authorized": True}) + + response = client.tokens.resource_authorize({"resource_id": 1}) + + assert response["authorized"] is True + mock_http_client.assert_request_made("POST", "/resource_authorize") + + def test_removed_duplicate_methods(self, client): + """Verify redundant methods were removed.""" + assert not hasattr(client.tokens, "logout_post") + assert not hasattr(client.tokens, "logout_put") + assert not hasattr(client.tokens, "refresh_token_put") diff --git a/tests/unit/test_users.py b/tests/unit/test_users.py index 1c369e9..a390517 100644 --- a/tests/unit/test_users.py +++ b/tests/unit/test_users.py @@ -234,3 +234,106 @@ def test_user_with_org_memberships(self, mock_client): assert len(user.org_memberships) == 2 assert user.org_memberships[0].api_key is not None + + def test_get_audit_log_basic(self, mock_client): + """Test getting audit log with basic params.""" + client = mock_client + client.http_client.add_response( + "/users/123/audit_log", [{"id": 1, "event": "login"}] + ) + + result = client.users.get_audit_log(user_id=123) + + assert isinstance(result, list) + assert len(result) == 1 + client.http_client.assert_request_made("GET", "/users/123/audit_log") + + def test_get_audit_log_with_all_params(self, mock_client): + """Test getting audit log with all parameters.""" + client = mock_client + client.http_client.add_response( + "/users/123/audit_log", [{"id": 1, "event": "update"}] + ) + + result = client.users.get_audit_log( + user_id=123, + from_date="2024-01-01", + to_date="2024-12-31", + event_filter="update", + change_filter="attribute", + page=1, + per_page=50, + ) + + assert isinstance(result, list) + client.http_client.assert_request_made( + "GET", + "/users/123/audit_log", + params={ + "from": "2024-01-01", + "to": "2024-12-31", + "event_filter": "update", + "change_filter": "attribute", + "page": 1, + "per_page": 50, + }, + ) + + def test_get_audit_log_non_list_response(self, mock_client): + """Test audit log returns empty list when response is not a list.""" + client = mock_client + client.http_client.add_response("/users/123/audit_log", {}) + + result = client.users.get_audit_log(user_id=123) + + assert result == [] + + def test_get_account_metrics_with_aggregate(self, mock_client): + """Test getting account metrics with all params.""" + client = mock_client + client.http_client.add_response( + "/users/123/flows/account_metrics", {"data": []} + ) + + client.users.get_account_metrics( + user_id=123, + from_date="2024-01-01", + to_date="2024-01-31", + org_id=5, + aggregate="daily", + ) + + client.http_client.assert_request_made( + "GET", + "/users/123/flows/account_metrics", + params={ + "from": "2024-01-01", + "to": "2024-01-31", + "org_id": 5, + "aggregate": "daily", + }, + ) + + def test_get_flow_status_metrics_basic(self, mock_client): + """Test getting flow status metrics with basic params.""" + client = mock_client + client.http_client.add_response("/users/123/flows/status_metrics", {"data": []}) + + client.users.get_flow_status_metrics(user_id=123) + + client.http_client.assert_request_made("GET", "/users/123/flows/status_metrics") + + def test_get_flow_status_metrics_with_params(self, mock_client): + """Test getting flow status metrics with all params.""" + client = mock_client + client.http_client.add_response("/users/123/flows/status_metrics", {"data": []}) + + client.users.get_flow_status_metrics( + user_id=123, from_date="2024-01-01", page=2, per_page=25 + ) + + client.http_client.assert_request_made( + "GET", + "/users/123/flows/status_metrics", + params={"from": "2024-01-01", "page": 2, "per_page": 25}, + ) diff --git a/tests/unit/test_validators.py b/tests/unit/test_validators.py new file mode 100644 index 0000000..bbb7e07 --- /dev/null +++ b/tests/unit/test_validators.py @@ -0,0 +1,289 @@ +"""Unit tests for validators resource.""" + +import pytest + +from nexla_sdk.models.validators.requests import ( + ValidatorCopyOptions, + ValidatorCreate, + ValidatorUpdate, +) +from nexla_sdk.models.validators.responses import Validator +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_VALIDATOR = { + "id": 123, + "name": "Test Validator", + "description": "A test validator", + "resource_type": "validator", + "code_type": "python", + "output_type": "record", + "code": "def validate(record): return record['value'] > 0", + "code_config": {}, + "code_encoding": "none", + "custom_config": {}, + "reusable": True, + "public": False, + "managed": False, + "owner": {"id": 1, "full_name": "Test User", "email": "test@example.com"}, + "org": {"id": 1, "name": "Test Org", "email_domain": "example.com"}, + "access_roles": ["owner"], + "data_sets": [1, 2], + "tags": ["test", "validation"], + "copied_from_id": None, + "updated_at": "2025-01-01T00:00:00Z", + "created_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_VALIDATORS_LIST = [ + SAMPLE_VALIDATOR, + {**SAMPLE_VALIDATOR, "id": 124, "name": "Another Validator"}, + {**SAMPLE_VALIDATOR, "id": 125, "name": "Third Validator"}, +] + + +@pytest.fixture +def sample_validator_response(): + """Sample validator response.""" + return SAMPLE_VALIDATOR.copy() + + +@pytest.fixture +def sample_validators_list(): + """Sample validators list response.""" + return [v.copy() for v in SAMPLE_VALIDATORS_LIST] + + +@pytest.mark.unit +class TestValidatorsResource: + """Unit tests for ValidatorsResource using mocks.""" + + def test_list_validators_success( + self, mock_client, mock_http_client, sample_validators_list + ): + """Test listing validators with successful response.""" + mock_http_client.add_response("/validators", sample_validators_list) + + validators = mock_client.validators.list() + + assert len(validators) == 3 + assert_model_list_valid(validators, Validator) + mock_http_client.assert_request_made("GET", "/validators") + + def test_list_validators_with_filters( + self, mock_client, mock_http_client, sample_validators_list + ): + """Test listing validators with filters.""" + mock_http_client.add_response("/validators", sample_validators_list) + + validators = mock_client.validators.list( + access_role="owner", page=1, per_page=10, expand=True + ) + + assert len(validators) == 3 + request = mock_http_client.get_request() + assert "expand" in str(request) + + def test_list_public_validators( + self, mock_client, mock_http_client, sample_validators_list + ): + """Test listing public validators.""" + mock_http_client.add_response("/validators/public", sample_validators_list) + + validators = mock_client.validators.list_public() + + assert len(validators) == 3 + mock_http_client.assert_request_made("GET", "/validators/public") + + def test_get_validator_success( + self, mock_client, mock_http_client, sample_validator_response + ): + """Test getting a single validator.""" + validator_id = 123 + mock_http_client.add_response( + f"/validators/{validator_id}", sample_validator_response + ) + + validator = mock_client.validators.get(validator_id) + + assert_model_valid(validator, {"id": validator_id}) + mock_http_client.assert_request_made("GET", f"/validators/{validator_id}") + + def test_create_validator_success( + self, mock_client, mock_http_client, sample_validator_response + ): + """Test creating a validator.""" + mock_http_client.add_response("/validators", sample_validator_response) + + create_data = ValidatorCreate( + name="Test Validator", + code_type="python", + code="def validate(record): return True", + ) + validator = mock_client.validators.create(create_data) + + assert_model_valid(validator, {"name": "Test Validator"}) + mock_http_client.assert_request_made("POST", "/validators") + + def test_update_validator_success( + self, mock_client, mock_http_client, sample_validator_response + ): + """Test updating a validator.""" + validator_id = 123 + updated_response = {**sample_validator_response, "name": "Updated Validator"} + mock_http_client.add_response(f"/validators/{validator_id}", updated_response) + + update_data = ValidatorUpdate(name="Updated Validator") + validator = mock_client.validators.update(validator_id, update_data) + + assert validator.name == "Updated Validator" + mock_http_client.assert_request_made("PUT", f"/validators/{validator_id}") + + def test_delete_validator_success(self, mock_client, mock_http_client): + """Test deleting a validator.""" + validator_id = 123 + mock_http_client.add_response(f"/validators/{validator_id}", {"success": True}) + + result = mock_client.validators.delete(validator_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/validators/{validator_id}") + + def test_copy_validator_success( + self, mock_client, mock_http_client, sample_validator_response + ): + """Test copying a validator.""" + validator_id = 123 + copied_response = { + **sample_validator_response, + "id": 200, + "copied_from_id": 123, + } + mock_http_client.add_response( + f"/validators/{validator_id}/copy", copied_response + ) + + options = ValidatorCopyOptions(owner_id=2) + validator = mock_client.validators.copy(validator_id, options) + + assert validator.id == 200 + assert validator.copied_from_id == 123 + mock_http_client.assert_request_made("POST", f"/validators/{validator_id}/copy") + + def test_get_tags_success(self, mock_client, mock_http_client): + """Test getting validator tags.""" + validator_id = 123 + tags = ["tag1", "tag2", "tag3"] + mock_http_client.add_response(f"/validators/{validator_id}/tags", tags) + + result = mock_client.validators.get_tags(validator_id) + + assert result == tags + mock_http_client.assert_request_made("GET", f"/validators/{validator_id}/tags") + + def test_set_tags_success(self, mock_client, mock_http_client): + """Test setting validator tags.""" + validator_id = 123 + new_tags = ["new_tag1", "new_tag2"] + mock_http_client.add_response(f"/validators/{validator_id}/tags", new_tags) + + result = mock_client.validators.set_tags(validator_id, new_tags) + + assert result == new_tags + mock_http_client.assert_request_made("POST", f"/validators/{validator_id}/tags") + + def test_add_tags_success(self, mock_client, mock_http_client): + """Test adding validator tags.""" + validator_id = 123 + updated_tags = ["tag1", "tag2", "new_tag"] + mock_http_client.add_response(f"/validators/{validator_id}/tags", updated_tags) + + result = mock_client.validators.add_tags(validator_id, ["new_tag"]) + + assert result == updated_tags + mock_http_client.assert_request_made("PUT", f"/validators/{validator_id}/tags") + + def test_remove_tags_success(self, mock_client, mock_http_client): + """Test removing validator tags.""" + validator_id = 123 + remaining_tags = ["tag1"] + mock_http_client.add_response( + f"/validators/{validator_id}/tags", remaining_tags + ) + + result = mock_client.validators.remove_tags(validator_id, ["tag2"]) + + assert result == remaining_tags + mock_http_client.assert_request_made( + "DELETE", f"/validators/{validator_id}/tags" + ) + + def test_search_tags_success( + self, mock_client, mock_http_client, sample_validators_list + ): + """Test searching validators by tags.""" + mock_http_client.add_response("/validators/search_tags", sample_validators_list) + + validators = mock_client.validators.search_tags(["test", "validation"]) + + assert len(validators) == 3 + mock_http_client.assert_request_made("POST", "/validators/search_tags") + + +@pytest.mark.unit +class TestValidatorModels: + """Unit tests for validator models.""" + + def test_validator_model_validation(self, sample_validator_response): + """Test Validator model parses valid data correctly.""" + validator = Validator.model_validate(sample_validator_response) + + assert validator.id == 123 + assert validator.name == "Test Validator" + assert validator.code_type == "python" + assert validator.resource_type == "validator" + assert validator.reusable is True + assert validator.public is False + assert "test" in validator.tags + + def test_validator_create_model_serialization(self): + """Test ValidatorCreate model serialization.""" + create_data = ValidatorCreate( + name="My Validator", + code_type="python", + code="def validate(r): return True", + tags=["validation"], + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["name"] == "My Validator" + assert data["code_type"] == "python" + assert "tags" in data + assert data["resource_type"] == "validator" + + def test_validator_update_model_serialization(self): + """Test ValidatorUpdate model serialization.""" + update_data = ValidatorUpdate( + name="Updated Name", + description="Updated description", + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["name"] == "Updated Name" + assert data["description"] == "Updated description" + # code_type should not be present since it wasn't set + assert "code_type" not in data + + def test_validator_copy_options_serialization(self): + """Test ValidatorCopyOptions model serialization.""" + options = ValidatorCopyOptions( + owner_id=5, + copy_access_controls=True, + ) + + data = options.model_dump(exclude_none=True) + + assert data["owner_id"] == 5 + assert data["copy_access_controls"] is True diff --git a/tests/unit/test_vendors.py b/tests/unit/test_vendors.py new file mode 100644 index 0000000..1345c72 --- /dev/null +++ b/tests/unit/test_vendors.py @@ -0,0 +1,187 @@ +"""Unit tests for vendors resource.""" + +import pytest + +from nexla_sdk.models.vendors.requests import VendorCreate, VendorUpdate +from nexla_sdk.models.vendors.responses import Vendor +from tests.utils import assert_model_list_valid, assert_model_valid + +# Sample response data +SAMPLE_VENDOR = { + "id": 123, + "name": "salesforce", + "display_name": "Salesforce", + "description": "Salesforce CRM connector", + "config": {}, + "small_logo": "https://example.com/sf-small.png", + "logo": "https://example.com/sf.png", + "connection_type": "api", + "auth_templates": [1, 2], + "vendor_endpoints": [], + "created_at": "2025-01-01T00:00:00Z", + "updated_at": "2025-01-01T00:00:00Z", +} + +SAMPLE_VENDORS_LIST = [ + SAMPLE_VENDOR, + {**SAMPLE_VENDOR, "id": 124, "name": "hubspot", "display_name": "HubSpot"}, + {**SAMPLE_VENDOR, "id": 125, "name": "zendesk", "display_name": "Zendesk"}, +] + + +@pytest.fixture +def sample_vendor_response(): + """Sample vendor response.""" + return SAMPLE_VENDOR.copy() + + +@pytest.fixture +def sample_vendors_list(): + """Sample vendors list response.""" + return [v.copy() for v in SAMPLE_VENDORS_LIST] + + +@pytest.mark.unit +class TestVendorsResource: + """Unit tests for VendorsResource using mocks.""" + + def test_list_vendors_success( + self, mock_client, mock_http_client, sample_vendors_list + ): + """Test listing vendors with successful response.""" + mock_http_client.add_response("/vendors", sample_vendors_list) + + vendors = mock_client.vendors.list() + + assert len(vendors) == 3 + assert_model_list_valid(vendors, Vendor) + mock_http_client.assert_request_made("GET", "/vendors") + + def test_get_vendor_by_id( + self, mock_client, mock_http_client, sample_vendor_response + ): + """Test getting a vendor by ID.""" + vendor_id = 123 + mock_http_client.add_response(f"/vendors/{vendor_id}", sample_vendor_response) + + vendor = mock_client.vendors.get(vendor_id) + + assert_model_valid(vendor, {"id": vendor_id}) + mock_http_client.assert_request_made("GET", f"/vendors/{vendor_id}") + + def test_get_vendor_by_name( + self, mock_client, mock_http_client, sample_vendor_response + ): + """Test getting a vendor by name.""" + mock_http_client.add_response("/vendors", sample_vendor_response) + + vendor = mock_client.vendors.get_by_name("salesforce") + + assert vendor.name == "salesforce" + mock_http_client.assert_request_made("GET", "/vendors") + + def test_create_vendor_success( + self, mock_client, mock_http_client, sample_vendor_response + ): + """Test creating a vendor.""" + mock_http_client.add_response("/vendors", sample_vendor_response) + + create_data = VendorCreate( + name="new_vendor", + display_name="New Vendor", + ) + vendor = mock_client.vendors.create(create_data) + + assert_model_valid(vendor, {"name": "salesforce"}) + mock_http_client.assert_request_made("POST", "/vendors") + + def test_update_vendor_success( + self, mock_client, mock_http_client, sample_vendor_response + ): + """Test updating a vendor.""" + vendor_id = 123 + updated_response = {**sample_vendor_response, "description": "Updated desc"} + mock_http_client.add_response(f"/vendors/{vendor_id}", updated_response) + + update_data = VendorUpdate(description="Updated desc") + vendor = mock_client.vendors.update(vendor_id, update_data) + + assert vendor.description == "Updated desc" + mock_http_client.assert_request_made("PUT", f"/vendors/{vendor_id}") + + def test_delete_vendor_success(self, mock_client, mock_http_client): + """Test deleting a vendor.""" + vendor_id = 123 + mock_http_client.add_response(f"/vendors/{vendor_id}", {"success": True}) + + result = mock_client.vendors.delete(vendor_id) + + assert result["success"] is True + mock_http_client.assert_request_made("DELETE", f"/vendors/{vendor_id}") + + def test_delete_auth_template_from_vendor(self, mock_client, mock_http_client): + """Test deleting an auth template from a vendor.""" + vendor_id = 123 + template_id = 456 + mock_http_client.add_response( + f"/vendors/{vendor_id}/auth_templates/{template_id}", {"success": True} + ) + + result = mock_client.vendors.delete_auth_template(vendor_id, template_id) + + assert result["success"] is True + mock_http_client.assert_request_made( + "DELETE", f"/vendors/{vendor_id}/auth_templates/{template_id}" + ) + + +@pytest.mark.unit +class TestVendorModels: + """Unit tests for vendor models.""" + + def test_vendor_model_validation(self, sample_vendor_response): + """Test Vendor model parses valid data correctly.""" + vendor = Vendor.model_validate(sample_vendor_response) + + assert vendor.id == 123 + assert vendor.name == "salesforce" + assert vendor.display_name == "Salesforce" + assert len(vendor.auth_templates) == 2 + + def test_vendor_model_with_minimal_data(self): + """Test Vendor model with minimal required fields.""" + minimal_data = { + "id": 1, + } + vendor = Vendor.model_validate(minimal_data) + + assert vendor.id == 1 + assert vendor.name is None + assert vendor.auth_templates == [] + + def test_vendor_create_model_serialization(self): + """Test VendorCreate model serialization.""" + create_data = VendorCreate( + name="new_vendor", + display_name="New Vendor", + description="A new vendor", + ) + + data = create_data.model_dump(exclude_none=True) + + assert data["name"] == "new_vendor" + assert data["display_name"] == "New Vendor" + assert data["description"] == "A new vendor" + + def test_vendor_update_model_serialization(self): + """Test VendorUpdate model serialization.""" + update_data = VendorUpdate( + display_name="Updated Name", + description="Updated description", + ) + + data = update_data.model_dump(exclude_none=True) + + assert data["display_name"] == "Updated Name" + assert data["description"] == "Updated description" + assert "name" not in data diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py index dd4923a..b8fe5e1 100644 --- a/tests/utils/__init__.py +++ b/tests/utils/__init__.py @@ -32,9 +32,12 @@ from .mock_builders import ( MockDataFactory, MockResponseBuilder, + SearchResponseBuilder, + accessor_list, credential_list, destination_list, lookup_list, + nexset_list, project_list, source_list, team_list, @@ -45,6 +48,7 @@ "MockResponseBuilder", "MockDataFactory", "MockHTTPClient", + "SearchResponseBuilder", "create_mock_response", "create_http_error", "create_paginated_response", @@ -69,10 +73,12 @@ "assert_flow_response_structure", "assert_datetime_field_valid", "assert_list_field_valid", + "accessor_list", "credential_list", "source_list", "destination_list", "lookup_list", + "nexset_list", "user_list", "team_list", "project_list", diff --git a/tests/utils/mock_builders.py b/tests/utils/mock_builders.py index 7e3087d..7889bb6 100644 --- a/tests/utils/mock_builders.py +++ b/tests/utils/mock_builders.py @@ -580,6 +580,126 @@ def docs_recommendation_response(**overrides) -> Dict[str, Any]: base.update(overrides) return base + @staticmethod + def accessor_response( + accessor_type: str = "USER", + access_role: str = "collaborator", + **overrides, + ) -> Dict[str, Any]: + """Build a mock accessor response for access control testing.""" + base = { + "id": fake.random_int(1, 10000), + "type": accessor_type, + "access_roles": [access_role], + "org_id": fake.random_int(1, 100), + } + if accessor_type == "USER": + base["email"] = fake.email() + base["full_name"] = fake.name() + base["user_id"] = fake.random_int(1, 10000) + elif accessor_type == "TEAM": + base["name"] = f"{fake.word().title()} Team" + base["team_id"] = fake.random_int(1, 1000) + base.update(overrides) + return base + + @staticmethod + def accessor_list(count: int = 3, **overrides) -> List[Dict[str, Any]]: + """Generate a list of accessor responses.""" + accessors = [] + for i in range(count): + accessor_type = "USER" if i % 2 == 0 else "TEAM" + accessors.append( + MockResponseBuilder.accessor_response( + accessor_type=accessor_type, **overrides + ) + ) + return accessors + + @staticmethod + def docs_response(**overrides) -> Dict[str, Any]: + """Build a mock documentation response for a resource.""" + base = { + "entries": [ + {"key": "description", "value": fake.sentence()}, + {"key": "usage", "value": fake.paragraph()}, + {"key": "notes", "value": fake.text(max_nb_chars=100)}, + ] + } + base.update(overrides) + return base + + @staticmethod + def access_insights_response(**overrides) -> Dict[str, Any]: + """Build a mock access insights response.""" + base = { + "access_granted": True, + "access_reason": fake.random_element( + ["owner", "collaborator", "team_member"] + ), + "access_path": [ + { + "type": "direct", + "role": fake.random_element(["owner", "collaborator", "admin"]), + } + ], + "resource_id": fake.random_int(1, 10000), + "resource_type": fake.random_element( + ["data_source", "data_sink", "data_set", "data_credentials"] + ), + } + base.update(overrides) + return base + + @staticmethod + def search_response( + items: List[Dict[str, Any]] = None, + total: int = None, + page: int = 1, + per_page: int = 20, + ) -> Dict[str, Any]: + """Build a mock search response. + + Args: + items: List of items in the search results + total: Total count of items (defaults to len(items)) + page: Current page number + per_page: Items per page + + Returns: + Dictionary with data and meta information + """ + if items is None: + items = [] + return { + "data": items, + "meta": { + "total_count": total if total is not None else len(items), + "page": page, + "per_page": per_page, + }, + } + + @staticmethod + def paginated_response( + items: List[Dict[str, Any]], + page: int = 1, + per_page: int = 20, + total: Optional[int] = None, + ) -> Dict[str, Any]: + """Build a paginated response with meta information.""" + total = total if total is not None else len(items) + total_pages = (total + per_page - 1) // per_page if per_page > 0 else 1 + return { + "data": items, + "meta": { + "currentPage": page, + "totalCount": total, + "pageCount": total_pages, + "perPage": per_page, + }, + } + class MockDataFactory: """Factory for generating mock data for testing.""" @@ -1233,3 +1353,65 @@ def team_list(count: int = 3) -> List[Dict[str, Any]]: def project_list(count: int = 3) -> List[Dict[str, Any]]: """Generate a list of mock projects.""" return [MockResponseBuilder.project() for _ in range(count)] + + +def accessor_list(count: int = 3) -> List[Dict[str, Any]]: + """Generate a list of mock accessors.""" + return MockResponseBuilder.accessor_list(count) + + +def nexset_list(count: int = 3) -> List[Dict[str, Any]]: + """Generate a list of mock nexsets.""" + factory = MockDataFactory() + return [factory.create_mock_nexset() for _ in range(count)] + + +class SearchResponseBuilder: + """Builder for creating mock search responses.""" + + @staticmethod + def search_response( + items: List[Dict[str, Any]] = None, + total: int = None, + page: int = 1, + per_page: int = 20, + ) -> Dict[str, Any]: + """Build a mock search response. + + Args: + items: List of items in the search results + total: Total count of items (defaults to len(items)) + page: Current page number + per_page: Items per page + + Returns: + Dictionary with data and meta information + """ + if items is None: + items = [] + return { + "data": items, + "meta": { + "total_count": total if total is not None else len(items), + "page": page, + "per_page": per_page, + }, + } + + @staticmethod + def search_tags_response( + items: List[Dict[str, Any]] = None, + tags: List[str] = None, + ) -> List[Dict[str, Any]]: + """Build a mock search_tags response. + + Args: + items: List of items matching the tags + tags: Tags that were searched for + + Returns: + List of matching items + """ + if items is None: + items = [] + return items