From 620f5eb19ab4963383a7529af888e13c51c3eb72 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Tue, 22 Oct 2024 22:51:59 +0530 Subject: [PATCH 01/20] Source Intercom: migrate to manifest only --- .../connectors/source-intercom/README.md | 89 +- .../acceptance-test-config.yml | 30 +- .../{source_intercom => }/components.py | 0 .../connectors/source-intercom/main.py | 8 - .../connectors/source-intercom/manifest.yaml | 7751 +++++++++++++++++ .../connectors/source-intercom/metadata.yaml | 81 +- .../connectors/source-intercom/poetry.lock | 1716 ---- .../connectors/source-intercom/pyproject.toml | 28 - .../source_intercom/__init__.py | 8 - .../source_intercom/manifest.yaml | 2408 ----- .../source-intercom/source_intercom/run.py | 14 - .../source-intercom/source_intercom/source.py | 18 - .../source-intercom/source_intercom/spec.json | 98 - .../unit_tests/test_components.py | 96 - .../source-intercom/unit_tests/test_source.py | 9 - docs/integrations/sources/intercom.md | 1 + 16 files changed, 7833 insertions(+), 4522 deletions(-) rename airbyte-integrations/connectors/source-intercom/{source_intercom => }/components.py (100%) delete mode 100644 airbyte-integrations/connectors/source-intercom/main.py create mode 100644 airbyte-integrations/connectors/source-intercom/manifest.yaml delete mode 100644 airbyte-integrations/connectors/source-intercom/poetry.lock delete mode 100644 airbyte-integrations/connectors/source-intercom/pyproject.toml delete mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/__init__.py delete mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/manifest.yaml delete mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/run.py delete mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/source.py delete mode 100644 airbyte-integrations/connectors/source-intercom/source_intercom/spec.json delete mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py delete mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/test_source.py diff --git a/airbyte-integrations/connectors/source-intercom/README.md b/airbyte-integrations/connectors/source-intercom/README.md index 258f2dd41d78..da0194c9aab1 100644 --- a/airbyte-integrations/connectors/source-intercom/README.md +++ b/airbyte-integrations/connectors/source-intercom/README.md @@ -1,49 +1,22 @@ # Intercom source connector -This is the repository for the Intercom source connector, written in Python. -For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.com/integrations/sources/intercom). +This directory contains the manifest-only connector for `source-intercom`. +This _manifest-only_ connector is not a Python package on its own, as it runs inside of the base `source-declarative-manifest` image. -## Local development - -### Prerequisites - -- Python (~=3.9) -- Poetry (~=1.7) - installation instructions [here](https://python-poetry.org/docs/#installation) - -### Installing the connector - -From this connector directory, run: - -```bash -poetry install --with dev -``` - -### Create credentials +For information about how to configure and use this connector within Airbyte, see [the connector's full documentation](https://docs.airbyte.com/integrations/sources/intercom). -**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.com/integrations/sources/intercom) -to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_intercom/spec.yaml` file. -Note that any directory named `secrets` is gitignored across the entire Airbyte repo, so there is no danger of accidentally checking in sensitive information. -See `sample_files/sample_config.json` for a sample config file. - -### Locally running the connector - -``` -poetry run source-intercom spec -poetry run source-intercom check --config secrets/config.json -poetry run source-intercom discover --config secrets/config.json -poetry run source-intercom read --config secrets/config.json --catalog integration_tests/configured_catalog.json -``` +## Local development -### Running unit tests +We recommend using the Connector Builder to edit this connector. +Using either Airbyte Cloud or your local Airbyte OSS instance, navigate to the **Builder** tab and select **Import a YAML**. +Then select the connector's `manifest.yaml` file to load the connector into the Builder. You're now ready to make changes to the connector! -To run unit tests locally, from the connector directory run: - -``` -poetry run pytest unit_tests -``` +If you prefer to develop locally, you can follow the instructions below. ### Building the docker image +You can build any manifest-only connector with `airbyte-ci`: + 1. Install [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md) 2. Run the following command to build the docker image: @@ -53,18 +26,24 @@ airbyte-ci connectors --name=source-intercom build An image will be available on your host with the tag `airbyte/source-intercom:dev`. +### Creating credentials + +**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.com/integrations/sources/intercom) +to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `spec` object in the connector's `manifest.yaml` file. +Note that any directory named `secrets` is gitignored across the entire Airbyte repo, so there is no danger of accidentally checking in sensitive information. + ### Running as a docker container -Then run any of the connector commands as follows: +Then run any of the standard source connector commands: -``` +```bash docker run --rm airbyte/source-intercom:dev spec docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-intercom:dev check --config /secrets/config.json docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-intercom:dev discover --config /secrets/config.json docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-intercom:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json ``` -### Running our CI test suite +### Running the CI test suite You can run our full test suite locally using [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md): @@ -72,33 +51,15 @@ You can run our full test suite locally using [`airbyte-ci`](https://github.com/ airbyte-ci connectors --name=source-intercom test ``` -### Customizing acceptance Tests - -Customize `acceptance-test-config.yml` file to configure acceptance tests. See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) for more information. -If your connector requires to create or destroy resources for use during acceptance tests create fixtures for it and place them inside integration_tests/acceptance.py. - -### Dependency Management - -All of your dependencies should be managed via Poetry. -To add a new dependency, run: - -```bash -poetry add -``` - -Please commit the changes to `pyproject.toml` and `poetry.lock` files. - ## Publishing a new version of the connector -You've checked out the repo, implemented a million dollar feature, and you're ready to share your changes with the world. Now what? - -1. Make sure your changes are passing our test suite: `airbyte-ci connectors --name=source-intercom test` -2. Bump the connector version (please follow [semantic versioning for connectors](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#semantic-versioning-for-connectors)): - - bump the `dockerImageTag` value in in `metadata.yaml` - - bump the `version` value in `pyproject.toml` -3. Make sure the `metadata.yaml` content is up to date. +If you want to contribute changes to `source-intercom`, here's how you can do that: +1. Make your changes locally, or load the connector's manifest into Connector Builder and make changes there. +2. Make sure your changes are passing our test suite with `airbyte-ci connectors --name=source-intercom test` +3. Bump the connector version (please follow [semantic versioning for connectors](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#semantic-versioning-for-connectors)): + - bump the `dockerImageTag` value in in `metadata.yaml` 4. Make sure the connector documentation and its changelog is up to date (`docs/integrations/sources/intercom.md`). 5. Create a Pull Request: use [our PR naming conventions](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#pull-request-title-convention). 6. Pat yourself on the back for being an awesome contributor. 7. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master. -8. Once your PR is merged, the new version of the connector will be automatically published to Docker Hub and our connector registry. +8. Once your PR is merged, the new version of the connector will be automatically published to Docker Hub and our connector registry. \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml index 37dd822467c7..0f0d5da224da 100644 --- a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml @@ -5,28 +5,28 @@ test_strictness_level: high acceptance_tests: spec: tests: - - spec_path: "source_intercom/spec.json" + - spec_path: "manifest.yaml" connection: tests: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: tests: - - config_path: "secrets/config.json" + - config_path: "secrets/config.json" basic_read: tests: - - config_path: "secrets/config.json" - expect_records: - path: "integration_tests/expected_records.jsonl" + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" incremental: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/incremental_catalog.json" - future_state: - future_state_path: "integration_tests/abnormal_state.json" + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/incremental_catalog.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" full_refresh: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/components.py b/airbyte-integrations/connectors/source-intercom/components.py similarity index 100% rename from airbyte-integrations/connectors/source-intercom/source_intercom/components.py rename to airbyte-integrations/connectors/source-intercom/components.py diff --git a/airbyte-integrations/connectors/source-intercom/main.py b/airbyte-integrations/connectors/source-intercom/main.py deleted file mode 100644 index 410860c90fd8..000000000000 --- a/airbyte-integrations/connectors/source-intercom/main.py +++ /dev/null @@ -1,8 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from source_intercom.run import run - -if __name__ == "__main__": - run() diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml new file mode 100644 index 000000000000..f4a880fba58d --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -0,0 +1,7751 @@ +version: 4.3.2 +definitions: + selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + requester_incremental_search: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} }, + { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') + }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') + }}' }" + stream_full_refresh: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + admins: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-admins" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + admin_ids: + description: Array of unique identifiers for admins + anyOf: + - type: array + items: + type: integer + - type: "null" + avatar: + description: Admin avatar details + type: + - "null" + - object + properties: + image_url: + description: URL of the admin's avatar image + type: + - "null" + - string + away_mode_enabled: + description: Flag indicating if away mode is enabled for the admin + type: + - "null" + - boolean + away_mode_reassign: + description: Flag indicating if away mode reassignment is enabled for + the admin + type: + - "null" + - boolean + email: + description: Email address of the admin + type: + - "null" + - string + has_inbox_seat: + description: Flag indicating if the admin has a seat in the inbox + type: + - "null" + - boolean + id: + description: Unique identifier for the admin + type: + - "null" + - string + job_title: + description: Job title of the admin + type: + - "null" + - string + name: + description: Name of the admin + type: + - "null" + - string + team_ids: + description: Array of team identifiers the admin belongs to + anyOf: + - type: array + items: + type: integer + - type: "null" + type: + description: Type of the admin (e.g., full-time, part-time) + type: + - "null" + - string + team_priority_level: + description: Detailed team priority level information for the admin + type: + - "null" + - object + properties: + primary_team_ids: + description: Array of primary team identifiers for the admin + type: + - "null" + - array + items: + type: + - "null" + - integer + secondary_team_ids: + description: Array of secondary team identifiers for the admin + type: + - "null" + - array + items: + type: + - "null" + - integer + tags: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique identifier for the tag. + type: + - "null" + - string + name: + description: Name of the tag used for identification. + type: + - "null" + - string + type: + description: Type of the tag indicating its purpose or category. + type: + - "null" + - string + teams: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-teams" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + admin_ids: + description: Array of user IDs representing the admins of the team. + anyOf: + - type: array + items: + type: integer + - type: "null" + id: + description: Unique identifier for the team. + type: + - "null" + - string + name: + description: Name of the team. + type: + - "null" + - string + type: + description: Type of team (e.g., 'internal', 'external'). + type: + - "null" + - string + stream_data_attributes: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_parameters: + model: "{{ parameters.get('model') }}" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" + company_attributes: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_parameters: + model: "{{ parameters.get('model') }}" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique ID assigned to the company attribute. + type: + - "null" + - integer + admin_id: + description: The ID of the admin user associated with the company. + type: + - "null" + - string + api_writable: + description: Indicates whether the field is writable through the API. + type: + - "null" + - boolean + archived: + description: Flag to indicate if the company data is archived. + type: + - "null" + - boolean + created_at: + description: Timestamp when the company data was created. + type: + - "null" + - integer + custom: + description: Custom attribute specific to the company. + type: + - "null" + - boolean + data_type: + description: Type of data stored in the attribute field. + type: + - "null" + - string + description: + description: Description or details about the company attribute. + type: + - "null" + - string + full_name: + description: Full name associated with the company. + type: + - "null" + - string + label: + description: Label or display name for the company attribute. + type: + - "null" + - string + model: + description: Model or schema used for storing the company attribute. + type: + - "null" + - string + name: + description: Name of the company attribute. + type: + - "null" + - string + options: + description: Available options or values for the company attribute. + anyOf: + - type: array + items: + type: string + - type: "null" + type: + description: Type of data structure for the company attribute. + type: + - "null" + - string + ui_writable: + description: Indicates whether the field is writable through the UI. + type: + - "null" + - boolean + updated_at: + description: Timestamp when the company data was last updated. + type: + - "null" + - integer + messenger_writable: + description: Indicates whether the field is writable through the messenger. + type: + - "null" + - boolean + contact_attributes: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_parameters: + model: "{{ parameters.get('model') }}" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique identifier for the contact attribute. + type: + - "null" + - integer + type: + description: The type of contact attribute (e.g., text, number, boolean). + type: + - "null" + - string + model: + description: Model to which the contact attribute is associated. + type: + - "null" + - string + name: + description: The name of the contact attribute. + type: + - "null" + - string + full_name: + description: The full name associated with the contact attribute. + type: + - "null" + - string + label: + description: Label representing the attribute in user interfaces. + type: + - "null" + - string + description: + description: Description of the contact attribute for better understanding. + type: + - "null" + - string + data_type: + description: The data type of the contact attribute value. + type: + - "null" + - string + options: + description: List of available options for the attribute. + type: + - "null" + - array + items: + type: + - "null" + - string + api_writable: + description: Indicates whether the attribute is writable via API. + type: + - "null" + - boolean + ui_writable: + description: Indicates whether the attribute is writable via user interface. + type: + - "null" + - boolean + custom: + description: Indicates if the attribute is a custom user-defined field. + type: + - "null" + - boolean + archived: + description: Flag to signify if the contact attribute is archived. + type: + - "null" + - boolean + admin_id: + description: Unique identifier for the admin associated with the contact + attribute. + type: + - "null" + - string + created_at: + description: Timestamp of when the contact attribute was created. + type: + - "null" + - integer + updated_at: + description: Timestamp of when the contact attribute was last updated. + type: + - "null" + - integer + messenger_writable: + description: Indicates whether the attribute is writable via messenger. + type: + - "null" + - boolean + stream_semi_incremental: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400) }}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + segments: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400) }}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestPath + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference#list-segments" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + created_at: + description: The date and time when the segment was created + type: + - "null" + - integer + count: + description: The number of items in the segment + type: + - "null" + - integer + id: + description: Unique identifier for the segment + type: + - "null" + - string + name: + description: The name or title of the segment + type: + - "null" + - string + type: + description: The type or category of the segment + type: + - "null" + - string + person_type: + description: Type of persons included in the segment + type: + - "null" + - string + updated_at: + description: The date and time when the segment was last updated + type: + - "null" + - integer + companies: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400) }}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + description: " 400 - existing scroll_param, need to wait at least 60 sec + to continue and retry 500 - server-side error, should retry after 60 + sec. " + response_filters: + - http_codes: + - 400 + action: RETRY + failure_type: transient_error + error_message: "A scroll (export) job is already in progress for this + Intercom account, causing the request to fail. Only one active scroll + per Intercom account is allowed; ensure no overlap by limiting active + connections or scheduling jobs appropriately." + - http_codes: + - 500 + action: RETRY + failure_type: transient_error + backoff_strategies: + - type: ConstantBackoffStrategy + backoff_time_in_seconds: 60 + - type: DefaultErrorHandler + description: "404 - scroll_param is expired or not found while requesting, + ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('scroll_param') }}" + stop_condition: "{{ not response.get('data') }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestOption + field_name: scroll_param + inject_into: request_parameter + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: The type of the company + type: + - "null" + - string + company_id: + description: The unique identifier of the company + type: + - "null" + - string + id: + description: The ID of the company + type: + - "null" + - string + app_id: + description: The ID of the application associated with the company + type: + - "null" + - string + name: + description: The name of the company + type: + - "null" + - string + created_at: + description: The date and time when the company was created + type: + - "null" + - integer + updated_at: + description: The date and time when the company was last updated + type: + - "null" + - integer + monthly_spend: + description: The monthly spend of the company + type: + - "null" + - number + multipleOf: 0.00000001 + session_count: + description: The number of sessions related to the company + type: + - "null" + - integer + user_count: + description: The number of users associated with the company + type: + - "null" + - integer + size: + description: The size of the company + type: + - "null" + - integer + tags: + description: Tags associated with the company + type: object + properties: + type: + description: The type of tags associated with the company + type: string + tags: + description: List of tags + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the tag + type: string + name: + description: The name of the tag + type: string + id: + description: The ID of the tag + oneOf: + - type: + - "null" + - string + - type: + - "null" + - integer + segments: + description: Segments associated with the company + type: object + properties: + type: + description: The type of segments associated with the company + type: string + segments: + description: List of segments + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the segment + type: string + id: + description: The ID of the segment + type: string + plan: + description: Details of the company's subscription plan + type: + - "null" + - object + properties: + id: + description: The ID of the subscription plan + type: + - "null" + - string + name: + description: The name of the subscription plan + type: + - "null" + - string + type: + description: The type of the subscription plan + type: + - "null" + - string + custom_attributes: + description: Custom attributes specific to the company + type: + - "null" + - object + additionalProperties: true + industry: + description: The industry in which the company operates + type: + - "null" + - string + remote_created_at: + description: The remote date and time when the company was created + type: + - "null" + - integer + website: + description: The website of the company + type: + - "null" + - string + substream_semi_incremental: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "NoPagination" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: "updated_at" + conversation_parts: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + field_path: + - "conversation_parts" + - "conversation_parts" + record_filter: + condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: DefaultErrorHandler + description: "404 - conversation is not found while requesting, ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + paginator: + type: "NoPagination" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: "updated_at" + parent_stream_configs: + - type: ParentStreamConfig + stream: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "2.9" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue + using API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ + stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': + {{ next_page_token.get('next_page_token').get('page') }}, 'starting_after': + '{{ next_page_token.get('next_page_token').get('starting_after') + }}' }" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assignee: + description: The assigned user responsible for the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the assignee + type: + - "null" + - string + type: + description: The type of the assignee (e.g., admin, agent) + type: + - "null" + - string + name: + description: The name of the assignee + type: + - "null" + - string + email: + description: The email of the assignee + type: + - "null" + - string + source: + description: Source details of the conversation. + type: + - "null" + - object + properties: + type: + description: The type of the source + type: + - "null" + - string + id: + description: The ID of the source + type: + - "null" + - string + redacted: + description: Indicates if the source is redacted + type: + - "null" + - boolean + delivered_as: + description: The delivery status of the source + type: + - "null" + - string + subject: + description: The subject of the source + type: + - "null" + - string + body: + description: The body/content of the source + type: + - "null" + - string + author: + description: Author of the source. + type: + - "null" + - object + properties: + id: + description: The ID of the source author + type: + - "null" + - string + type: + description: The type of the source author (e.g., admin, + customer) + type: + - "null" + - string + name: + description: The name of the source author + type: + - "null" + - string + email: + description: The email of the source author + type: + - "null" + - string + attachments: + description: Attachments related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + additionalProperties: true + properties: {} + url: + description: The URL of the source + type: + - "null" + - string + contacts: + description: List of contacts involved in the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + type: + description: The type of the contact + type: + - "null" + - string + id: + description: The ID of the contact + type: + - "null" + - string + teammates: + description: List of teammates involved in the conversation. + type: + - "null" + - object + properties: + admins: + description: Admin teammates involved in the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + id: + description: The ID of the teammate admin + type: + - "null" + - string + type: + description: The type of the teammate (admin) + type: + - "null" + - string + type: + description: The type of teammates + type: + - "null" + - string + first_contact_reply: + description: Timestamp indicating when the first contact replied. + type: + - "null" + - object + properties: + type: + description: The type of the first contact reply + type: + - "null" + - string + url: + description: The URL of the first contact reply + type: + - "null" + - string + created_at: + description: The timestamp of the first contact's reply + type: + - "null" + - integer + custom_attributes: + description: Custom attributes associated with the conversation + type: + - "null" + - object + priority: + description: The priority level of the conversation + type: + - "null" + - string + conversation_message: + description: The main message content of the conversation. + type: + - "null" + - object + properties: + attachments: + description: Attachments in the conversation message + anyOf: + - type: array + items: + type: object + properties: + type: + type: + - "null" + - string + name: + type: + - "null" + - string + url: + type: + - "null" + - string + content_type: + type: + - "null" + - string + filesize: + type: + - "null" + - integer + height: + type: + - "null" + - integer + width: + type: + - "null" + - integer + - type: "null" + author: + description: The author of the conversation message. + type: + - "null" + - object + properties: + id: + description: The ID of the author of the message + type: + - "null" + - string + type: + description: The type of the author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the author of the message + type: + - "null" + - string + email: + description: The email of the author of the message + type: + - "null" + - string + body: + description: The body/content of the conversation message + type: + - "null" + - string + delivered_as: + description: The delivery status of the message + type: + - "null" + - string + id: + description: The ID of the conversation message + type: + - "null" + - string + subject: + description: The subject of the conversation message + type: + - "null" + - string + type: + description: The type of the conversation message + type: + - "null" + - string + url: + description: The URL of the conversation message + type: + - "null" + - string + conversation_rating: + description: Ratings given to the conversation by the customer and + teammate. + type: + - "null" + - object + properties: + created_at: + description: The timestamp when the rating was created + type: + - "null" + - integer + customer: + description: Rating given by the customer. + type: + - "null" + - object + properties: + id: + description: The ID of the customer who provided the rating + type: + - "null" + - string + type: + description: The type of the customer providing the rating + type: + - "null" + - string + rating: + description: The rating given to the conversation + type: + - "null" + - integer + remark: + description: Any remarks provided with the rating + type: + - "null" + - string + teammate: + description: Rating given by the teammate. + type: + - "null" + - object + properties: + id: + description: The ID of the teammate being rated + type: + - "null" + - integer + type: + description: The type of the teammate being rated + type: + - "null" + - string + created_at: + description: The timestamp when the conversation was created + type: + - "null" + - integer + customer_first_reply: + description: Timestamp indicating when the customer first replied. + type: + - "null" + - object + properties: + created_at: + description: The timestamp of the customer's first reply + type: + - "null" + - integer + type: + description: The type of the first customer reply + type: + - "null" + - string + url: + description: The URL of the first customer reply + type: + - "null" + - string + customers: + description: List of customers involved in the conversation + anyOf: + - type: array + items: + type: + - "null" + - object + properties: + id: + type: + - "null" + - string + type: + type: + - "null" + - string + - type: "null" + id: + description: The unique ID of the conversation + type: + - "null" + - string + open: + description: Indicates if the conversation is open or closed + type: + - "null" + - boolean + read: + description: Indicates if the conversation has been read + type: + - "null" + - boolean + sent_at: + description: The timestamp when the conversation was sent + type: + - "null" + - integer + snoozed_until: + description: Timestamp until the conversation is snoozed + type: + - "null" + - integer + sla_applied: + description: Service Level Agreement details applied to the conversation. + type: + - "null" + - object + properties: + sla_name: + description: The name of the SLA applied + type: + - "null" + - string + sla_status: + description: The status of the SLA applied + type: + - "null" + - string + state: + description: The state of the conversation (e.g., new, in progress) + type: + - "null" + - string + statistics: + description: Statistics related to the conversation. + type: + - "null" + - object + properties: + type: + description: The type of conversation statistics + type: + - "null" + - string + time_to_assignment: + description: Time taken for assignment + type: + - "null" + - integer + time_to_admin_reply: + description: Time taken to reply by admin + type: + - "null" + - integer + time_to_first_close: + description: Time taken to first close the conversation + type: + - "null" + - integer + time_to_last_close: + description: Time taken to last close the conversation + type: + - "null" + - integer + median_time_to_reply: + description: The median time taken to reply to the conversation + type: + - "null" + - integer + first_contact_reply_at: + description: Timestamp of the first contact reply + type: + - "null" + - integer + first_assignment_at: + description: Timestamp of the first assignment + type: + - "null" + - integer + first_admin_reply_at: + description: Timestamp of the first admin reply + type: + - "null" + - integer + first_close_at: + description: Timestamp of the first conversation close + type: + - "null" + - integer + last_assignment_at: + description: Timestamp of the last assignment + type: + - "null" + - integer + last_assignment_admin_reply_at: + description: Timestamp of the last assignment admin reply + type: + - "null" + - integer + last_contact_reply_at: + description: Timestamp of the last contact reply + type: + - "null" + - integer + last_admin_reply_at: + description: Timestamp of the last admin reply + type: + - "null" + - integer + last_close_at: + description: Timestamp of the last conversation close + type: + - "null" + - integer + last_closed_by_id: + description: The ID of the last user who closed the conversation + type: + - "null" + - integer + count_reopens: + description: The total count of conversation reopens + type: + - "null" + - integer + count_assignments: + description: The total count of assignments for the conversation + type: + - "null" + - integer + count_conversation_parts: + description: The total count of conversation parts + type: + - "null" + - integer + tags: + description: Tags applied to the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + applied_at: + description: Timestamp when the tag was applied + type: + - "null" + - integer + applied_by: + description: User who applied the tag. + type: + - "null" + - object + properties: + id: + description: The ID of the user who applied the tag + type: + - "null" + - string + type: + description: The type of the user who applied the tag + type: + - "null" + - string + id: + description: The ID of the tag + type: + - "null" + - string + name: + description: The name of the tag + type: + - "null" + - string + type: + description: The type of the tag + type: + - "null" + - string + type: + description: The type of the conversation + type: + - "null" + - string + updated_at: + description: The timestamp when the conversation was last updated + type: + - "null" + - integer + user: + description: The user related to the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the user associated with the conversation + type: + - "null" + - string + type: + description: The type of the user + type: + - "null" + - string + waiting_since: + description: Timestamp since waiting for a response + type: + - "null" + - integer + admin_assignee_id: + description: The ID of the administrator assigned to the conversation + type: + - "null" + - integer + title: + description: The title of the conversation + type: + - "null" + - string + team_assignee_id: + description: The ID of the team assigned to the conversation + type: + - "null" + - integer + redacted: + description: Indicates if the conversation is redacted + type: + - "null" + - boolean + topics: + description: Topics associated with the conversation. + type: + - "null" + - object + properties: + type: + description: The type of topics + type: + - "null" + - string + topics: + description: List of topics related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type of the topic + type: + - "null" + - string + id: + description: The ID of the topic + type: + - "null" + - integer + name: + description: The name of the topic + type: + - "null" + - string + total_count: + description: The total count of topics + type: + - "null" + - integer + parent_key: "id" + partition_field: "id" + transformations: + - type: AddFields + fields: + - path: + - "conversation_id" + value: "'{{ stream_slice.id }}'" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assigned_to: + description: The user or team member who is assigned to handle this conversation + part. + oneOf: + - type: object + properties: + type: + type: + - "null" + - string + id: + type: + - "null" + - string + - type: string + - type: "null" + attachments: + description: Represents the attachments associated with the conversation + part. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type or category of the attachment. + type: + - "null" + - string + name: + description: The filename or name of the attachment. + type: + - "null" + - string + url: + description: The URL or location where the attachment can be accessed. + type: + - "null" + - string + content_type: + description: The MIME type of the attachment content. + type: + - "null" + - string + filesize: + description: The size of the attachment file in bytes. + type: + - "null" + - integer + height: + description: The height dimension of the attachment in pixels. + type: + - "null" + - integer + width: + description: The width dimension of the attachment in pixels. + type: + - "null" + - integer + author: + description: Represents the author of the conversation part. + type: + - "null" + - object + properties: + id: + description: The unique identifier of the conversation author. + type: + - "null" + - string + type: + description: The type of author, such as customer or agent. + type: + - "null" + - string + name: + description: The name of the conversation author. + type: + - "null" + - string + email: + description: The email address of the conversation author. + type: + - "null" + - string + body: + description: The main content or message body of the conversation part. + type: + - "null" + - string + conversation_id: + description: The unique identifier of the conversation. + type: + - "null" + - string + conversation_created_at: + description: The date and time when the conversation was created. + type: + - "null" + - integer + conversation_updated_at: + description: The date and time when the conversation was last updated. + type: + - "null" + - integer + conversation_total_parts: + description: The total number of parts in the conversation. + type: + - "null" + - integer + created_at: + description: The date and time when the conversation part was created. + type: + - "null" + - integer + external_id: + description: An external identifier associated with the conversation part. + type: + - "null" + - string + id: + description: The unique identifier of the conversation part. + type: + - "null" + - string + notified_at: + description: The date and time when the conversation part was last notified. + type: + - "null" + - integer + part_type: + description: The type or category of the conversation part. + type: + - "null" + - string + type: + description: The type of conversation part, such as message or note. + type: + - "null" + - string + updated_at: + description: The date and time when the conversation part was last updated. + type: + - "null" + - integer + redacted: + description: Indicates if the conversation part has been redacted or censored. + type: + - "null" + - boolean + company_segments: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "NoPagination" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: "updated_at" + parent_complete_fetch: true + parent_stream_configs: + - type: ParentStreamConfig + stream: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400) }}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + description: " 400 - existing scroll_param, need to wait at least + 60 sec to continue and retry 500 - server-side error, should retry + after 60 sec. " + response_filters: + - http_codes: + - 400 + action: RETRY + failure_type: transient_error + error_message: "A scroll (export) job is already in progress for + this Intercom account, causing the request to fail. Only one + active scroll per Intercom account is allowed; ensure no overlap + by limiting active connections or scheduling jobs appropriately." + - http_codes: + - 500 + action: RETRY + failure_type: transient_error + backoff_strategies: + - type: ConstantBackoffStrategy + backoff_time_in_seconds: 60 + - type: DefaultErrorHandler + description: "404 - scroll_param is expired or not found while requesting, + ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('scroll_param') }}" + stop_condition: "{{ not response.get('data') }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + page_token_option: + type: RequestOption + field_name: scroll_param + inject_into: request_parameter + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: The type of the company + type: + - "null" + - string + company_id: + description: The unique identifier of the company + type: + - "null" + - string + id: + description: The ID of the company + type: + - "null" + - string + app_id: + description: The ID of the application associated with the company + type: + - "null" + - string + name: + description: The name of the company + type: + - "null" + - string + created_at: + description: The date and time when the company was created + type: + - "null" + - integer + updated_at: + description: The date and time when the company was last updated + type: + - "null" + - integer + monthly_spend: + description: The monthly spend of the company + type: + - "null" + - number + multipleOf: 0.00000001 + session_count: + description: The number of sessions related to the company + type: + - "null" + - integer + user_count: + description: The number of users associated with the company + type: + - "null" + - integer + size: + description: The size of the company + type: + - "null" + - integer + tags: + description: Tags associated with the company + type: object + properties: + type: + description: The type of tags associated with the company + type: string + tags: + description: List of tags + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the tag + type: string + name: + description: The name of the tag + type: string + id: + description: The ID of the tag + oneOf: + - type: + - "null" + - string + - type: + - "null" + - integer + segments: + description: Segments associated with the company + type: object + properties: + type: + description: The type of segments associated with the company + type: string + segments: + description: List of segments + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the segment + type: string + id: + description: The ID of the segment + type: string + plan: + description: Details of the company's subscription plan + type: + - "null" + - object + properties: + id: + description: The ID of the subscription plan + type: + - "null" + - string + name: + description: The name of the subscription plan + type: + - "null" + - string + type: + description: The type of the subscription plan + type: + - "null" + - string + custom_attributes: + description: Custom attributes specific to the company + type: + - "null" + - object + additionalProperties: true + industry: + description: The industry in which the company operates + type: + - "null" + - string + remote_created_at: + description: The remote date and time when the company was created + type: + - "null" + - integer + website: + description: The website of the company + type: + - "null" + - string + parent_key: "id" + partition_field: "id" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + created_at: + description: The timestamp when the company segment was created. + type: + - "null" + - integer + count: + description: The count of company segments returned in the response. + type: + - "null" + - integer + id: + description: The unique identifier associated with the company segment. + type: + - "null" + - string + name: + description: The name of the company segment. + type: + - "null" + - string + type: + description: The category or type of the company segment. + type: + - "null" + - string + person_type: + description: The type of person associated with the company segment. + type: + - "null" + - string + updated_at: + description: The timestamp when the company segment was last updated. + type: + - "null" + - integer + stream_incremental_search: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') + }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ + next_page_token.get('next_page_token').get('page') }}, 'starting_after': + '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + contacts: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') + }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ + next_page_token.get('next_page_token').get('page') }}, 'starting_after': + '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: Type of contact. + type: + - "null" + - string + id: + description: The unique identifier of the contact. + type: + - "null" + - string + workspace_id: + description: The unique identifier of the workspace associated with the + contact. + type: + - "null" + - string + external_id: + description: External identifier for the contact. + type: + - "null" + - string + role: + description: Role or position of the contact. + type: + - "null" + - string + email: + description: The email address of the contact. + type: + - "null" + - string + phone: + description: The phone number of the contact. + type: + - "null" + - string + name: + description: The name of the contact. + type: + - "null" + - string + avatar: + description: URL pointing to the contact's avatar image. + type: + - "null" + - string + owner_id: + description: The unique identifier of the contact's owner. + type: + - "null" + - integer + social_profiles: + description: Social profiles associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of social profile connection. + type: + - "null" + - string + data: + description: Array of social profile data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of social profile. + type: + - "null" + - string + name: + description: Name of the social profile. + type: + - "null" + - string + url: + description: URL of the social profile. + type: + - "null" + - string + has_hard_bounced: + description: Flag indicating if the contact has hard bounced. + type: + - "null" + - boolean + marked_email_as_spam: + description: Flag indicating if the contact's email was marked as spam. + type: + - "null" + - boolean + unsubscribed_from_emails: + description: Flag indicating if the contact unsubscribed from emails. + type: + - "null" + - boolean + unsubscribed_from_sms: + description: Flag indicating if the contact unsubscribed from SMS. + type: + - "null" + - boolean + created_at: + description: The date and time when the contact was created. + type: + - "null" + - integer + updated_at: + description: The date and time when the contact was last updated. + type: + - "null" + - integer + signed_up_at: + description: The date and time when the contact signed up. + type: + - "null" + - integer + sms_consent: + description: Consent status for SMS communication. + type: + - "null" + - boolean + last_seen_at: + description: The date and time when the contact was last seen overall. + type: + - "null" + - integer + last_replied_at: + description: The date and time when the contact last replied. + type: + - "null" + - integer + last_contacted_at: + description: The date and time when the contact was last contacted. + type: + - "null" + - integer + last_email_opened_at: + description: The date and time when the contact last opened an email. + type: + - "null" + - integer + last_email_clicked_at: + description: The date and time when the contact last clicked an email. + type: + - "null" + - integer + language_override: + description: Language override set for the contact. + type: + - "null" + - string + browser: + description: The browser used by the contact. + type: + - "null" + - string + browser_version: + description: The version of the browser used by the contact. + type: + - "null" + - string + browser_language: + description: The language preference set in the contact's browser. + type: + - "null" + - string + os: + description: Operating system of the contact's device. + type: + - "null" + - string + location: + description: Location details of the contact. + type: + - "null" + - object + properties: + type: + description: Type of location. + type: + - "null" + - string + country: + description: Country of the contact's location. + type: + - "null" + - string + region: + description: Region of the contact's location. + type: + - "null" + - string + city: + description: City of the contact's location. + type: + - "null" + - string + continent_code: + description: Continent code of the contact's location. + type: + - "null" + - string + country_code: + description: Country code of the contact's location. + type: + - "null" + - string + android_app_name: + description: The name of the Android app associated with the contact. + type: + - "null" + - string + android_app_version: + description: The version of the Android app associated with the contact. + type: + - "null" + - string + android_device: + description: The device used by the contact for Android. + type: + - "null" + - string + android_os_version: + description: The operating system version of the Android device. + type: + - "null" + - string + android_sdk_version: + description: The SDK version of the Android device. + type: + - "null" + - string + android_last_seen_at: + description: The date and time when the contact was last seen on Android. + type: + - "null" + - string + format: date-time + ios_app_name: + description: The name of the iOS app associated with the contact. + type: + - "null" + - string + ios_app_version: + description: The version of the iOS app associated with the contact. + type: + - "null" + - string + ios_device: + description: The device used by the contact for iOS. + type: + - "null" + - string + ios_os_version: + description: The operating system version of the iOS device. + type: + - "null" + - string + ios_sdk_version: + description: The SDK version of the iOS device. + type: + - "null" + - string + ios_last_seen_at: + description: The date and time when the contact was last seen on iOS. + type: + - "null" + - integer + custom_attributes: + description: Custom attributes defined for the contact. + type: + - "null" + - object + additionalProperties: true + properties: {} + tags: + description: Tags associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the tags. + type: + - "null" + - string + data: + description: Array of tag data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of tag. + type: + - "null" + - string + id: + description: The unique identifier of the tag. + type: + - "null" + - string + url: + description: URL of the tag. + type: + - "null" + - string + url: + description: URL to access more tag information. + type: + - "null" + - string + total_count: + description: Total count of tags associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more tags to load. + type: + - "null" + - boolean + notes: + description: Notes associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the notes. + type: + - "null" + - string + data: + description: Array of note data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of note. + type: + - "null" + - string + id: + description: The unique identifier of the note. + type: + - "null" + - string + url: + description: URL of the note. + type: + - "null" + - string + url: + description: URL to access more note information. + type: + - "null" + - string + total_count: + description: Total count of notes associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more notes to load. + type: + - "null" + - boolean + companies: + description: Companies associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the companies. + type: + - "null" + - string + data: + description: Array of company data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of company. + type: + - "null" + - string + id: + description: The unique identifier of the company. + type: + - "null" + - string + url: + description: URL of the company. + type: + - "null" + - string + url: + description: URL to access more company information. + type: + - "null" + - string + total_count: + description: Total count of companies associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more companies to load. + type: + - "null" + - boolean + opted_out_subscription_types: + description: Subscription types the contact opted out from. + type: + - "null" + - object + properties: + type: + description: Type of connection with the subscription types. + type: + - "null" + - string + data: + description: Array of subscription type data opted out from by the + contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of subscription. + type: + - "null" + - string + id: + description: The unique identifier of the subscription type. + type: + - "null" + - string + url: + description: URL of the subscription type. + type: + - "null" + - string + url: + description: URL to access more subscription type information. + type: + - "null" + - string + total_count: + description: Total count of subscription types the contact opted out + from. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more subscription types + to load. + type: + - "null" + - boolean + opted_in_subscription_types: + description: Subscription types the contact opted into. + type: + - "null" + - object + properties: + type: + description: Type of connection with the subscription types. + type: + - "null" + - string + data: + description: Array of subscription type data opted into by the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of subscription. + type: + - "null" + - string + id: + description: The unique identifier of the subscription type. + type: + - "null" + - string + url: + description: URL of the subscription type. + type: + - "null" + - string + url: + description: URL to access more subscription type information. + type: + - "null" + - string + total_count: + description: Total count of subscription types the contact opted into. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more subscription types + to load. + type: + - "null" + - boolean + utm_content: + description: Content data from UTM parameters. + type: + - "null" + - string + utm_campaign: + description: Campaign data from UTM parameters. + type: + - "null" + - string + utm_source: + description: Source data from UTM parameters. + type: + - "null" + - string + referrer: + description: Referrer information related to the contact. + type: + - "null" + - string + utm_term: + description: Term data from UTM parameters. + type: + - "null" + - string + utm_medium: + description: Medium data from UTM parameters. + type: + - "null" + - string + conversations: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400)}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "2.9" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') + }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ + next_page_token.get('next_page_token').get('page') }}, 'starting_after': + '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assignee: + description: The assigned user responsible for the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the assignee + type: + - "null" + - string + type: + description: The type of the assignee (e.g., admin, agent) + type: + - "null" + - string + name: + description: The name of the assignee + type: + - "null" + - string + email: + description: The email of the assignee + type: + - "null" + - string + source: + description: Source details of the conversation. + type: + - "null" + - object + properties: + type: + description: The type of the source + type: + - "null" + - string + id: + description: The ID of the source + type: + - "null" + - string + redacted: + description: Indicates if the source is redacted + type: + - "null" + - boolean + delivered_as: + description: The delivery status of the source + type: + - "null" + - string + subject: + description: The subject of the source + type: + - "null" + - string + body: + description: The body/content of the source + type: + - "null" + - string + author: + description: Author of the source. + type: + - "null" + - object + properties: + id: + description: The ID of the source author + type: + - "null" + - string + type: + description: The type of the source author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the source author + type: + - "null" + - string + email: + description: The email of the source author + type: + - "null" + - string + attachments: + description: Attachments related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + additionalProperties: true + properties: {} + url: + description: The URL of the source + type: + - "null" + - string + contacts: + description: List of contacts involved in the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + type: + description: The type of the contact + type: + - "null" + - string + id: + description: The ID of the contact + type: + - "null" + - string + teammates: + description: List of teammates involved in the conversation. + type: + - "null" + - object + properties: + admins: + description: Admin teammates involved in the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + id: + description: The ID of the teammate admin + type: + - "null" + - string + type: + description: The type of the teammate (admin) + type: + - "null" + - string + type: + description: The type of teammates + type: + - "null" + - string + first_contact_reply: + description: Timestamp indicating when the first contact replied. + type: + - "null" + - object + properties: + type: + description: The type of the first contact reply + type: + - "null" + - string + url: + description: The URL of the first contact reply + type: + - "null" + - string + created_at: + description: The timestamp of the first contact's reply + type: + - "null" + - integer + custom_attributes: + description: Custom attributes associated with the conversation + type: + - "null" + - object + priority: + description: The priority level of the conversation + type: + - "null" + - string + conversation_message: + description: The main message content of the conversation. + type: + - "null" + - object + properties: + attachments: + description: Attachments in the conversation message + anyOf: + - type: array + items: + type: object + properties: + type: + type: + - "null" + - string + name: + type: + - "null" + - string + url: + type: + - "null" + - string + content_type: + type: + - "null" + - string + filesize: + type: + - "null" + - integer + height: + type: + - "null" + - integer + width: + type: + - "null" + - integer + - type: "null" + author: + description: The author of the conversation message. + type: + - "null" + - object + properties: + id: + description: The ID of the author of the message + type: + - "null" + - string + type: + description: The type of the author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the author of the message + type: + - "null" + - string + email: + description: The email of the author of the message + type: + - "null" + - string + body: + description: The body/content of the conversation message + type: + - "null" + - string + delivered_as: + description: The delivery status of the message + type: + - "null" + - string + id: + description: The ID of the conversation message + type: + - "null" + - string + subject: + description: The subject of the conversation message + type: + - "null" + - string + type: + description: The type of the conversation message + type: + - "null" + - string + url: + description: The URL of the conversation message + type: + - "null" + - string + conversation_rating: + description: Ratings given to the conversation by the customer and teammate. + type: + - "null" + - object + properties: + created_at: + description: The timestamp when the rating was created + type: + - "null" + - integer + customer: + description: Rating given by the customer. + type: + - "null" + - object + properties: + id: + description: The ID of the customer who provided the rating + type: + - "null" + - string + type: + description: The type of the customer providing the rating + type: + - "null" + - string + rating: + description: The rating given to the conversation + type: + - "null" + - integer + remark: + description: Any remarks provided with the rating + type: + - "null" + - string + teammate: + description: Rating given by the teammate. + type: + - "null" + - object + properties: + id: + description: The ID of the teammate being rated + type: + - "null" + - integer + type: + description: The type of the teammate being rated + type: + - "null" + - string + created_at: + description: The timestamp when the conversation was created + type: + - "null" + - integer + customer_first_reply: + description: Timestamp indicating when the customer first replied. + type: + - "null" + - object + properties: + created_at: + description: The timestamp of the customer's first reply + type: + - "null" + - integer + type: + description: The type of the first customer reply + type: + - "null" + - string + url: + description: The URL of the first customer reply + type: + - "null" + - string + customers: + description: List of customers involved in the conversation + anyOf: + - type: array + items: + type: + - "null" + - object + properties: + id: + type: + - "null" + - string + type: + type: + - "null" + - string + - type: "null" + id: + description: The unique ID of the conversation + type: + - "null" + - string + open: + description: Indicates if the conversation is open or closed + type: + - "null" + - boolean + read: + description: Indicates if the conversation has been read + type: + - "null" + - boolean + sent_at: + description: The timestamp when the conversation was sent + type: + - "null" + - integer + snoozed_until: + description: Timestamp until the conversation is snoozed + type: + - "null" + - integer + sla_applied: + description: Service Level Agreement details applied to the conversation. + type: + - "null" + - object + properties: + sla_name: + description: The name of the SLA applied + type: + - "null" + - string + sla_status: + description: The status of the SLA applied + type: + - "null" + - string + state: + description: The state of the conversation (e.g., new, in progress) + type: + - "null" + - string + statistics: + description: Statistics related to the conversation. + type: + - "null" + - object + properties: + type: + description: The type of conversation statistics + type: + - "null" + - string + time_to_assignment: + description: Time taken for assignment + type: + - "null" + - integer + time_to_admin_reply: + description: Time taken to reply by admin + type: + - "null" + - integer + time_to_first_close: + description: Time taken to first close the conversation + type: + - "null" + - integer + time_to_last_close: + description: Time taken to last close the conversation + type: + - "null" + - integer + median_time_to_reply: + description: The median time taken to reply to the conversation + type: + - "null" + - integer + first_contact_reply_at: + description: Timestamp of the first contact reply + type: + - "null" + - integer + first_assignment_at: + description: Timestamp of the first assignment + type: + - "null" + - integer + first_admin_reply_at: + description: Timestamp of the first admin reply + type: + - "null" + - integer + first_close_at: + description: Timestamp of the first conversation close + type: + - "null" + - integer + last_assignment_at: + description: Timestamp of the last assignment + type: + - "null" + - integer + last_assignment_admin_reply_at: + description: Timestamp of the last assignment admin reply + type: + - "null" + - integer + last_contact_reply_at: + description: Timestamp of the last contact reply + type: + - "null" + - integer + last_admin_reply_at: + description: Timestamp of the last admin reply + type: + - "null" + - integer + last_close_at: + description: Timestamp of the last conversation close + type: + - "null" + - integer + last_closed_by_id: + description: The ID of the last user who closed the conversation + type: + - "null" + - integer + count_reopens: + description: The total count of conversation reopens + type: + - "null" + - integer + count_assignments: + description: The total count of assignments for the conversation + type: + - "null" + - integer + count_conversation_parts: + description: The total count of conversation parts + type: + - "null" + - integer + tags: + description: Tags applied to the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + applied_at: + description: Timestamp when the tag was applied + type: + - "null" + - integer + applied_by: + description: User who applied the tag. + type: + - "null" + - object + properties: + id: + description: The ID of the user who applied the tag + type: + - "null" + - string + type: + description: The type of the user who applied the tag + type: + - "null" + - string + id: + description: The ID of the tag + type: + - "null" + - string + name: + description: The name of the tag + type: + - "null" + - string + type: + description: The type of the tag + type: + - "null" + - string + type: + description: The type of the conversation + type: + - "null" + - string + updated_at: + description: The timestamp when the conversation was last updated + type: + - "null" + - integer + user: + description: The user related to the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the user associated with the conversation + type: + - "null" + - string + type: + description: The type of the user + type: + - "null" + - string + waiting_since: + description: Timestamp since waiting for a response + type: + - "null" + - integer + admin_assignee_id: + description: The ID of the administrator assigned to the conversation + type: + - "null" + - integer + title: + description: The title of the conversation + type: + - "null" + - string + team_assignee_id: + description: The ID of the team assigned to the conversation + type: + - "null" + - integer + redacted: + description: Indicates if the conversation is redacted + type: + - "null" + - boolean + topics: + description: Topics associated with the conversation. + type: + - "null" + - object + properties: + type: + description: The type of topics + type: + - "null" + - string + topics: + description: List of topics related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type of the topic + type: + - "null" + - string + id: + description: The ID of the topic + type: + - "null" + - integer + name: + description: The name of the topic + type: + - "null" + - string + total_count: + description: The total count of topics + type: + - "null" + - integer + activity_logs: + retriever: + description: "The Retriever without passing page size option" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue using + API." + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_token_option: + type: RequestPath + primary_key: id + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + lookback_window: "P{{ config.get('lookback_window', 0) }}D" + cursor_granularity: "PT1S" + step: "P{{ config.get('activity_logs_time_step', 30) }}D" + start_datetime: + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_time_option: + field_name: "created_at_before" + inject_into: "request_parameter" + start_time_option: + field_name: "created_at_after" + inject_into: "request_parameter" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + performed_by: + description: The user who performed the activity + type: + - "null" + - object + properties: + id: + description: Unique identifier of the user who performed the activity + type: + - "null" + - string + type: + description: Type of the user who performed the activity (e.g., admin, + user) + type: + - "null" + - string + ip: + description: IP address from where the activity was performed + type: + - "null" + - string + email: + description: Email of the user who performed the activity + type: + - "null" + - string + id: + description: Unique identifier for the activity log entry + type: + - "null" + - string + metadata: + description: Additional data or information related to the activity + type: + - "null" + - object + activity_type: + description: The type or category of the activity + type: + - "null" + - string + activity_description: + description: A description of the activity that took place + type: + - "null" + - string + created_at: + description: The timestamp when the activity occurred + type: + - "null" + - integer +streams: +- retriever: + description: "The Retriever without passing page size option" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "admins/activity_logs" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_token_option: + type: RequestPath + type: SimpleRetriever + primary_key: id + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + lookback_window: "P{{ config.get('lookback_window', 0) }}D" + cursor_granularity: "PT1S" + step: "P{{ config.get('activity_logs_time_step', 30) }}D" + start_datetime: + datetime: "{{ config['start_date'] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + type: MinMaxDatetime + end_time_option: + field_name: "created_at_before" + inject_into: "request_parameter" + type: RequestOption + start_time_option: + field_name: "created_at_after" + inject_into: "request_parameter" + type: RequestOption + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + performed_by: + description: The user who performed the activity + type: + - "null" + - object + properties: + id: + description: Unique identifier of the user who performed the activity + type: + - "null" + - string + type: + description: Type of the user who performed the activity (e.g., admin, + user) + type: + - "null" + - string + ip: + description: IP address from where the activity was performed + type: + - "null" + - string + email: + description: Email of the user who performed the activity + type: + - "null" + - string + id: + description: Unique identifier for the activity log entry + type: + - "null" + - string + metadata: + description: Additional data or information related to the activity + type: + - "null" + - object + activity_type: + description: The type or category of the activity + type: + - "null" + - string + activity_description: + description: A description of the activity that took place + type: + - "null" + - string + created_at: + description: The timestamp when the activity occurred + type: + - "null" + - integer + type: DeclarativeStream + name: "activity_logs" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "admins" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference#list-admins" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + admin_ids: + description: Array of unique identifiers for admins + anyOf: + - type: array + items: + type: integer + - type: "null" + avatar: + description: Admin avatar details + type: + - "null" + - object + properties: + image_url: + description: URL of the admin's avatar image + type: + - "null" + - string + away_mode_enabled: + description: Flag indicating if away mode is enabled for the admin + type: + - "null" + - boolean + away_mode_reassign: + description: Flag indicating if away mode reassignment is enabled for the + admin + type: + - "null" + - boolean + email: + description: Email address of the admin + type: + - "null" + - string + has_inbox_seat: + description: Flag indicating if the admin has a seat in the inbox + type: + - "null" + - boolean + id: + description: Unique identifier for the admin + type: + - "null" + - string + job_title: + description: Job title of the admin + type: + - "null" + - string + name: + description: Name of the admin + type: + - "null" + - string + team_ids: + description: Array of team identifiers the admin belongs to + anyOf: + - type: array + items: + type: integer + - type: "null" + type: + description: Type of the admin (e.g., full-time, part-time) + type: + - "null" + - string + team_priority_level: + description: Detailed team priority level information for the admin + type: + - "null" + - object + properties: + primary_team_ids: + description: Array of primary team identifiers for the admin + type: + - "null" + - array + items: + type: + - "null" + - integer + secondary_team_ids: + description: Array of secondary team identifiers for the admin + type: + - "null" + - array + items: + type: + - "null" + - integer + type: DeclarativeStream + name: "admins" + primary_key: "id" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "tags" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique identifier for the tag. + type: + - "null" + - string + name: + description: Name of the tag used for identification. + type: + - "null" + - string + type: + description: Type of the tag indicating its purpose or category. + type: + - "null" + - string + type: DeclarativeStream + name: "tags" + primary_key: "name" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "teams" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference#list-teams" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + admin_ids: + description: Array of user IDs representing the admins of the team. + anyOf: + - type: array + items: + type: integer + - type: "null" + id: + description: Unique identifier for the team. + type: + - "null" + - string + name: + description: Name of the team. + type: + - "null" + - string + type: + description: Type of team (e.g., 'internal', 'external'). + type: + - "null" + - string + type: DeclarativeStream + name: "teams" + primary_key: "name" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400) + }}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "segments" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference#list-segments" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + created_at: + description: The date and time when the segment was created + type: + - "null" + - integer + count: + description: The number of items in the segment + type: + - "null" + - integer + id: + description: Unique identifier for the segment + type: + - "null" + - string + name: + description: The name or title of the segment + type: + - "null" + - string + type: + description: The type or category of the segment + type: + - "null" + - string + person_type: + description: Type of persons included in the segment + type: + - "null" + - string + updated_at: + description: The date and time when the segment was last updated + type: + - "null" + - integer + type: DeclarativeStream + name: "segments" + primary_key: "id" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400) + }}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + description: " 400 - existing scroll_param, need to wait at least 60 sec + to continue and retry 500 - server-side error, should retry after 60 sec. " + response_filters: + - http_codes: + - 400 + action: RETRY + failure_type: transient_error + error_message: "A scroll (export) job is already in progress for this + Intercom account, causing the request to fail. Only one active scroll + per Intercom account is allowed; ensure no overlap by limiting active + connections or scheduling jobs appropriately." + type: HttpResponseFilter + - http_codes: + - 500 + action: RETRY + failure_type: transient_error + type: HttpResponseFilter + backoff_strategies: + - type: ConstantBackoffStrategy + backoff_time_in_seconds: 60 + - type: DefaultErrorHandler + description: "404 - scroll_param is expired or not found while requesting, + ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + type: HttpResponseFilter + path: "companies/scroll" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('scroll_param') }}" + stop_condition: "{{ not response.get('data') }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestOption + field_name: scroll_param + inject_into: request_parameter + type: SimpleRetriever + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: The type of the company + type: + - "null" + - string + company_id: + description: The unique identifier of the company + type: + - "null" + - string + id: + description: The ID of the company + type: + - "null" + - string + app_id: + description: The ID of the application associated with the company + type: + - "null" + - string + name: + description: The name of the company + type: + - "null" + - string + created_at: + description: The date and time when the company was created + type: + - "null" + - integer + updated_at: + description: The date and time when the company was last updated + type: + - "null" + - integer + monthly_spend: + description: The monthly spend of the company + type: + - "null" + - number + multipleOf: 0.00000001 + session_count: + description: The number of sessions related to the company + type: + - "null" + - integer + user_count: + description: The number of users associated with the company + type: + - "null" + - integer + size: + description: The size of the company + type: + - "null" + - integer + tags: + description: Tags associated with the company + type: object + properties: + type: + description: The type of tags associated with the company + type: string + tags: + description: List of tags + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the tag + type: string + name: + description: The name of the tag + type: string + id: + description: The ID of the tag + oneOf: + - type: + - "null" + - string + - type: + - "null" + - integer + segments: + description: Segments associated with the company + type: object + properties: + type: + description: The type of segments associated with the company + type: string + segments: + description: List of segments + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the segment + type: string + id: + description: The ID of the segment + type: string + plan: + description: Details of the company's subscription plan + type: + - "null" + - object + properties: + id: + description: The ID of the subscription plan + type: + - "null" + - string + name: + description: The name of the subscription plan + type: + - "null" + - string + type: + description: The type of the subscription plan + type: + - "null" + - string + custom_attributes: + description: Custom attributes specific to the company + type: + - "null" + - object + additionalProperties: true + industry: + description: The industry in which the company operates + type: + - "null" + - string + remote_created_at: + description: The remote date and time when the company was created + type: + - "null" + - integer + website: + description: The website of the company + type: + - "null" + - string + type: DeclarativeStream + name: "companies" + primary_key: "id" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + request_parameters: + model: "{{ parameters.get('model') }}" + path: "data_attributes" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique ID assigned to the company attribute. + type: + - "null" + - integer + admin_id: + description: The ID of the admin user associated with the company. + type: + - "null" + - string + api_writable: + description: Indicates whether the field is writable through the API. + type: + - "null" + - boolean + archived: + description: Flag to indicate if the company data is archived. + type: + - "null" + - boolean + created_at: + description: Timestamp when the company data was created. + type: + - "null" + - integer + custom: + description: Custom attribute specific to the company. + type: + - "null" + - boolean + data_type: + description: Type of data stored in the attribute field. + type: + - "null" + - string + description: + description: Description or details about the company attribute. + type: + - "null" + - string + full_name: + description: Full name associated with the company. + type: + - "null" + - string + label: + description: Label or display name for the company attribute. + type: + - "null" + - string + model: + description: Model or schema used for storing the company attribute. + type: + - "null" + - string + name: + description: Name of the company attribute. + type: + - "null" + - string + options: + description: Available options or values for the company attribute. + anyOf: + - type: array + items: + type: string + - type: "null" + type: + description: Type of data structure for the company attribute. + type: + - "null" + - string + ui_writable: + description: Indicates whether the field is writable through the UI. + type: + - "null" + - boolean + updated_at: + description: Timestamp when the company data was last updated. + type: + - "null" + - integer + messenger_writable: + description: Indicates whether the field is writable through the messenger. + type: + - "null" + - boolean + type: DeclarativeStream + name: "company_attributes" + primary_key: "name" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + request_parameters: + model: "{{ parameters.get('model') }}" + path: "data_attributes" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestPath + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + id: + description: Unique identifier for the contact attribute. + type: + - "null" + - integer + type: + description: The type of contact attribute (e.g., text, number, boolean). + type: + - "null" + - string + model: + description: Model to which the contact attribute is associated. + type: + - "null" + - string + name: + description: The name of the contact attribute. + type: + - "null" + - string + full_name: + description: The full name associated with the contact attribute. + type: + - "null" + - string + label: + description: Label representing the attribute in user interfaces. + type: + - "null" + - string + description: + description: Description of the contact attribute for better understanding. + type: + - "null" + - string + data_type: + description: The data type of the contact attribute value. + type: + - "null" + - string + options: + description: List of available options for the attribute. + type: + - "null" + - array + items: + type: + - "null" + - string + api_writable: + description: Indicates whether the attribute is writable via API. + type: + - "null" + - boolean + ui_writable: + description: Indicates whether the attribute is writable via user interface. + type: + - "null" + - boolean + custom: + description: Indicates if the attribute is a custom user-defined field. + type: + - "null" + - boolean + archived: + description: Flag to signify if the contact attribute is archived. + type: + - "null" + - boolean + admin_id: + description: Unique identifier for the admin associated with the contact + attribute. + type: + - "null" + - string + created_at: + description: Timestamp of when the contact attribute was created. + type: + - "null" + - integer + updated_at: + description: Timestamp of when the contact attribute was last updated. + type: + - "null" + - integer + messenger_writable: + description: Indicates whether the attribute is writable via messenger. + type: + - "null" + - boolean + type: DeclarativeStream + name: "contact_attributes" + primary_key: "name" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400)}}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} + }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') + }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') + }}' }" + path: "contacts/search" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: Type of contact. + type: + - "null" + - string + id: + description: The unique identifier of the contact. + type: + - "null" + - string + workspace_id: + description: The unique identifier of the workspace associated with the + contact. + type: + - "null" + - string + external_id: + description: External identifier for the contact. + type: + - "null" + - string + role: + description: Role or position of the contact. + type: + - "null" + - string + email: + description: The email address of the contact. + type: + - "null" + - string + phone: + description: The phone number of the contact. + type: + - "null" + - string + name: + description: The name of the contact. + type: + - "null" + - string + avatar: + description: URL pointing to the contact's avatar image. + type: + - "null" + - string + owner_id: + description: The unique identifier of the contact's owner. + type: + - "null" + - integer + social_profiles: + description: Social profiles associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of social profile connection. + type: + - "null" + - string + data: + description: Array of social profile data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of social profile. + type: + - "null" + - string + name: + description: Name of the social profile. + type: + - "null" + - string + url: + description: URL of the social profile. + type: + - "null" + - string + has_hard_bounced: + description: Flag indicating if the contact has hard bounced. + type: + - "null" + - boolean + marked_email_as_spam: + description: Flag indicating if the contact's email was marked as spam. + type: + - "null" + - boolean + unsubscribed_from_emails: + description: Flag indicating if the contact unsubscribed from emails. + type: + - "null" + - boolean + unsubscribed_from_sms: + description: Flag indicating if the contact unsubscribed from SMS. + type: + - "null" + - boolean + created_at: + description: The date and time when the contact was created. + type: + - "null" + - integer + updated_at: + description: The date and time when the contact was last updated. + type: + - "null" + - integer + signed_up_at: + description: The date and time when the contact signed up. + type: + - "null" + - integer + sms_consent: + description: Consent status for SMS communication. + type: + - "null" + - boolean + last_seen_at: + description: The date and time when the contact was last seen overall. + type: + - "null" + - integer + last_replied_at: + description: The date and time when the contact last replied. + type: + - "null" + - integer + last_contacted_at: + description: The date and time when the contact was last contacted. + type: + - "null" + - integer + last_email_opened_at: + description: The date and time when the contact last opened an email. + type: + - "null" + - integer + last_email_clicked_at: + description: The date and time when the contact last clicked an email. + type: + - "null" + - integer + language_override: + description: Language override set for the contact. + type: + - "null" + - string + browser: + description: The browser used by the contact. + type: + - "null" + - string + browser_version: + description: The version of the browser used by the contact. + type: + - "null" + - string + browser_language: + description: The language preference set in the contact's browser. + type: + - "null" + - string + os: + description: Operating system of the contact's device. + type: + - "null" + - string + location: + description: Location details of the contact. + type: + - "null" + - object + properties: + type: + description: Type of location. + type: + - "null" + - string + country: + description: Country of the contact's location. + type: + - "null" + - string + region: + description: Region of the contact's location. + type: + - "null" + - string + city: + description: City of the contact's location. + type: + - "null" + - string + continent_code: + description: Continent code of the contact's location. + type: + - "null" + - string + country_code: + description: Country code of the contact's location. + type: + - "null" + - string + android_app_name: + description: The name of the Android app associated with the contact. + type: + - "null" + - string + android_app_version: + description: The version of the Android app associated with the contact. + type: + - "null" + - string + android_device: + description: The device used by the contact for Android. + type: + - "null" + - string + android_os_version: + description: The operating system version of the Android device. + type: + - "null" + - string + android_sdk_version: + description: The SDK version of the Android device. + type: + - "null" + - string + android_last_seen_at: + description: The date and time when the contact was last seen on Android. + type: + - "null" + - string + format: date-time + ios_app_name: + description: The name of the iOS app associated with the contact. + type: + - "null" + - string + ios_app_version: + description: The version of the iOS app associated with the contact. + type: + - "null" + - string + ios_device: + description: The device used by the contact for iOS. + type: + - "null" + - string + ios_os_version: + description: The operating system version of the iOS device. + type: + - "null" + - string + ios_sdk_version: + description: The SDK version of the iOS device. + type: + - "null" + - string + ios_last_seen_at: + description: The date and time when the contact was last seen on iOS. + type: + - "null" + - integer + custom_attributes: + description: Custom attributes defined for the contact. + type: + - "null" + - object + additionalProperties: true + properties: {} + tags: + description: Tags associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the tags. + type: + - "null" + - string + data: + description: Array of tag data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of tag. + type: + - "null" + - string + id: + description: The unique identifier of the tag. + type: + - "null" + - string + url: + description: URL of the tag. + type: + - "null" + - string + url: + description: URL to access more tag information. + type: + - "null" + - string + total_count: + description: Total count of tags associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more tags to load. + type: + - "null" + - boolean + notes: + description: Notes associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the notes. + type: + - "null" + - string + data: + description: Array of note data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of note. + type: + - "null" + - string + id: + description: The unique identifier of the note. + type: + - "null" + - string + url: + description: URL of the note. + type: + - "null" + - string + url: + description: URL to access more note information. + type: + - "null" + - string + total_count: + description: Total count of notes associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more notes to load. + type: + - "null" + - boolean + companies: + description: Companies associated with the contact. + type: + - "null" + - object + properties: + type: + description: Type of connection with the companies. + type: + - "null" + - string + data: + description: Array of company data associated with the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of company. + type: + - "null" + - string + id: + description: The unique identifier of the company. + type: + - "null" + - string + url: + description: URL of the company. + type: + - "null" + - string + url: + description: URL to access more company information. + type: + - "null" + - string + total_count: + description: Total count of companies associated with the contact. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more companies to load. + type: + - "null" + - boolean + opted_out_subscription_types: + description: Subscription types the contact opted out from. + type: + - "null" + - object + properties: + type: + description: Type of connection with the subscription types. + type: + - "null" + - string + data: + description: Array of subscription type data opted out from by the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of subscription. + type: + - "null" + - string + id: + description: The unique identifier of the subscription type. + type: + - "null" + - string + url: + description: URL of the subscription type. + type: + - "null" + - string + url: + description: URL to access more subscription type information. + type: + - "null" + - string + total_count: + description: Total count of subscription types the contact opted out + from. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more subscription types to + load. + type: + - "null" + - boolean + opted_in_subscription_types: + description: Subscription types the contact opted into. + type: + - "null" + - object + properties: + type: + description: Type of connection with the subscription types. + type: + - "null" + - string + data: + description: Array of subscription type data opted into by the contact. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: Type of subscription. + type: + - "null" + - string + id: + description: The unique identifier of the subscription type. + type: + - "null" + - string + url: + description: URL of the subscription type. + type: + - "null" + - string + url: + description: URL to access more subscription type information. + type: + - "null" + - string + total_count: + description: Total count of subscription types the contact opted into. + type: + - "null" + - integer + has_more: + description: Flag indicating if there are more subscription types to + load. + type: + - "null" + - boolean + utm_content: + description: Content data from UTM parameters. + type: + - "null" + - string + utm_campaign: + description: Campaign data from UTM parameters. + type: + - "null" + - string + utm_source: + description: Source data from UTM parameters. + type: + - "null" + - string + referrer: + description: Referrer information related to the contact. + type: + - "null" + - string + utm_term: + description: Term data from UTM parameters. + type: + - "null" + - string + utm_medium: + description: Medium data from UTM parameters. + type: + - "null" + - string + type: DeclarativeStream + name: "contacts" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400)}}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "2.9" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} + }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') + }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') + }}' }" + path: "conversations/search" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assignee: + description: The assigned user responsible for the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the assignee + type: + - "null" + - string + type: + description: The type of the assignee (e.g., admin, agent) + type: + - "null" + - string + name: + description: The name of the assignee + type: + - "null" + - string + email: + description: The email of the assignee + type: + - "null" + - string + source: + description: Source details of the conversation. + type: + - "null" + - object + properties: + type: + description: The type of the source + type: + - "null" + - string + id: + description: The ID of the source + type: + - "null" + - string + redacted: + description: Indicates if the source is redacted + type: + - "null" + - boolean + delivered_as: + description: The delivery status of the source + type: + - "null" + - string + subject: + description: The subject of the source + type: + - "null" + - string + body: + description: The body/content of the source + type: + - "null" + - string + author: + description: Author of the source. + type: + - "null" + - object + properties: + id: + description: The ID of the source author + type: + - "null" + - string + type: + description: The type of the source author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the source author + type: + - "null" + - string + email: + description: The email of the source author + type: + - "null" + - string + attachments: + description: Attachments related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + additionalProperties: true + properties: {} + url: + description: The URL of the source + type: + - "null" + - string + contacts: + description: List of contacts involved in the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + type: + description: The type of the contact + type: + - "null" + - string + id: + description: The ID of the contact + type: + - "null" + - string + teammates: + description: List of teammates involved in the conversation. + type: + - "null" + - object + properties: + admins: + description: Admin teammates involved in the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + id: + description: The ID of the teammate admin + type: + - "null" + - string + type: + description: The type of the teammate (admin) + type: + - "null" + - string + type: + description: The type of teammates + type: + - "null" + - string + first_contact_reply: + description: Timestamp indicating when the first contact replied. + type: + - "null" + - object + properties: + type: + description: The type of the first contact reply + type: + - "null" + - string + url: + description: The URL of the first contact reply + type: + - "null" + - string + created_at: + description: The timestamp of the first contact's reply + type: + - "null" + - integer + custom_attributes: + description: Custom attributes associated with the conversation + type: + - "null" + - object + priority: + description: The priority level of the conversation + type: + - "null" + - string + conversation_message: + description: The main message content of the conversation. + type: + - "null" + - object + properties: + attachments: + description: Attachments in the conversation message + anyOf: + - type: array + items: + type: object + properties: + type: + type: + - "null" + - string + name: + type: + - "null" + - string + url: + type: + - "null" + - string + content_type: + type: + - "null" + - string + filesize: + type: + - "null" + - integer + height: + type: + - "null" + - integer + width: + type: + - "null" + - integer + - type: "null" + author: + description: The author of the conversation message. + type: + - "null" + - object + properties: + id: + description: The ID of the author of the message + type: + - "null" + - string + type: + description: The type of the author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the author of the message + type: + - "null" + - string + email: + description: The email of the author of the message + type: + - "null" + - string + body: + description: The body/content of the conversation message + type: + - "null" + - string + delivered_as: + description: The delivery status of the message + type: + - "null" + - string + id: + description: The ID of the conversation message + type: + - "null" + - string + subject: + description: The subject of the conversation message + type: + - "null" + - string + type: + description: The type of the conversation message + type: + - "null" + - string + url: + description: The URL of the conversation message + type: + - "null" + - string + conversation_rating: + description: Ratings given to the conversation by the customer and teammate. + type: + - "null" + - object + properties: + created_at: + description: The timestamp when the rating was created + type: + - "null" + - integer + customer: + description: Rating given by the customer. + type: + - "null" + - object + properties: + id: + description: The ID of the customer who provided the rating + type: + - "null" + - string + type: + description: The type of the customer providing the rating + type: + - "null" + - string + rating: + description: The rating given to the conversation + type: + - "null" + - integer + remark: + description: Any remarks provided with the rating + type: + - "null" + - string + teammate: + description: Rating given by the teammate. + type: + - "null" + - object + properties: + id: + description: The ID of the teammate being rated + type: + - "null" + - integer + type: + description: The type of the teammate being rated + type: + - "null" + - string + created_at: + description: The timestamp when the conversation was created + type: + - "null" + - integer + customer_first_reply: + description: Timestamp indicating when the customer first replied. + type: + - "null" + - object + properties: + created_at: + description: The timestamp of the customer's first reply + type: + - "null" + - integer + type: + description: The type of the first customer reply + type: + - "null" + - string + url: + description: The URL of the first customer reply + type: + - "null" + - string + customers: + description: List of customers involved in the conversation + anyOf: + - type: array + items: + type: + - "null" + - object + properties: + id: + type: + - "null" + - string + type: + type: + - "null" + - string + - type: "null" + id: + description: The unique ID of the conversation + type: + - "null" + - string + open: + description: Indicates if the conversation is open or closed + type: + - "null" + - boolean + read: + description: Indicates if the conversation has been read + type: + - "null" + - boolean + sent_at: + description: The timestamp when the conversation was sent + type: + - "null" + - integer + snoozed_until: + description: Timestamp until the conversation is snoozed + type: + - "null" + - integer + sla_applied: + description: Service Level Agreement details applied to the conversation. + type: + - "null" + - object + properties: + sla_name: + description: The name of the SLA applied + type: + - "null" + - string + sla_status: + description: The status of the SLA applied + type: + - "null" + - string + state: + description: The state of the conversation (e.g., new, in progress) + type: + - "null" + - string + statistics: + description: Statistics related to the conversation. + type: + - "null" + - object + properties: + type: + description: The type of conversation statistics + type: + - "null" + - string + time_to_assignment: + description: Time taken for assignment + type: + - "null" + - integer + time_to_admin_reply: + description: Time taken to reply by admin + type: + - "null" + - integer + time_to_first_close: + description: Time taken to first close the conversation + type: + - "null" + - integer + time_to_last_close: + description: Time taken to last close the conversation + type: + - "null" + - integer + median_time_to_reply: + description: The median time taken to reply to the conversation + type: + - "null" + - integer + first_contact_reply_at: + description: Timestamp of the first contact reply + type: + - "null" + - integer + first_assignment_at: + description: Timestamp of the first assignment + type: + - "null" + - integer + first_admin_reply_at: + description: Timestamp of the first admin reply + type: + - "null" + - integer + first_close_at: + description: Timestamp of the first conversation close + type: + - "null" + - integer + last_assignment_at: + description: Timestamp of the last assignment + type: + - "null" + - integer + last_assignment_admin_reply_at: + description: Timestamp of the last assignment admin reply + type: + - "null" + - integer + last_contact_reply_at: + description: Timestamp of the last contact reply + type: + - "null" + - integer + last_admin_reply_at: + description: Timestamp of the last admin reply + type: + - "null" + - integer + last_close_at: + description: Timestamp of the last conversation close + type: + - "null" + - integer + last_closed_by_id: + description: The ID of the last user who closed the conversation + type: + - "null" + - integer + count_reopens: + description: The total count of conversation reopens + type: + - "null" + - integer + count_assignments: + description: The total count of assignments for the conversation + type: + - "null" + - integer + count_conversation_parts: + description: The total count of conversation parts + type: + - "null" + - integer + tags: + description: Tags applied to the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + applied_at: + description: Timestamp when the tag was applied + type: + - "null" + - integer + applied_by: + description: User who applied the tag. + type: + - "null" + - object + properties: + id: + description: The ID of the user who applied the tag + type: + - "null" + - string + type: + description: The type of the user who applied the tag + type: + - "null" + - string + id: + description: The ID of the tag + type: + - "null" + - string + name: + description: The name of the tag + type: + - "null" + - string + type: + description: The type of the tag + type: + - "null" + - string + type: + description: The type of the conversation + type: + - "null" + - string + updated_at: + description: The timestamp when the conversation was last updated + type: + - "null" + - integer + user: + description: The user related to the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the user associated with the conversation + type: + - "null" + - string + type: + description: The type of the user + type: + - "null" + - string + waiting_since: + description: Timestamp since waiting for a response + type: + - "null" + - integer + admin_assignee_id: + description: The ID of the administrator assigned to the conversation + type: + - "null" + - integer + title: + description: The title of the conversation + type: + - "null" + - string + team_assignee_id: + description: The ID of the team assigned to the conversation + type: + - "null" + - integer + redacted: + description: Indicates if the conversation is redacted + type: + - "null" + - boolean + topics: + description: Topics associated with the conversation. + type: + - "null" + - object + properties: + type: + description: The type of topics + type: + - "null" + - string + topics: + description: List of topics related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type of the topic + type: + - "null" + - string + id: + description: The ID of the topic + type: + - "null" + - integer + name: + description: The name of the topic + type: + - "null" + - string + total_count: + description: The total count of topics + type: + - "null" + - integer + type: DeclarativeStream + name: "conversations" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + field_path: + - "conversation_parts" + - "conversation_parts" + type: DpathExtractor + record_filter: + condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400)}}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: DefaultErrorHandler + description: "404 - conversation is not found while requesting, ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + type: HttpResponseFilter + path: "/conversations/{{ stream_slice.id }}" + paginator: + type: "NoPagination" + type: SimpleRetriever + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: "updated_at" + parent_stream_configs: + - type: ParentStreamConfig + stream: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400)}}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "POST" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "2.9" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription + needed. Please, validate your current Intercom plan to continue + using API." + request_body_json: + query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': + '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], '%s') + }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], }" + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': + {{ next_page_token.get('next_page_token').get('page') }}, 'starting_after': + '{{ next_page_token.get('next_page_token').get('starting_after') }}' + }" + path: "conversations/search" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + page_size: 150 + type: SimpleRetriever + description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assignee: + description: The assigned user responsible for the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the assignee + type: + - "null" + - string + type: + description: The type of the assignee (e.g., admin, agent) + type: + - "null" + - string + name: + description: The name of the assignee + type: + - "null" + - string + email: + description: The email of the assignee + type: + - "null" + - string + source: + description: Source details of the conversation. + type: + - "null" + - object + properties: + type: + description: The type of the source + type: + - "null" + - string + id: + description: The ID of the source + type: + - "null" + - string + redacted: + description: Indicates if the source is redacted + type: + - "null" + - boolean + delivered_as: + description: The delivery status of the source + type: + - "null" + - string + subject: + description: The subject of the source + type: + - "null" + - string + body: + description: The body/content of the source + type: + - "null" + - string + author: + description: Author of the source. + type: + - "null" + - object + properties: + id: + description: The ID of the source author + type: + - "null" + - string + type: + description: The type of the source author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the source author + type: + - "null" + - string + email: + description: The email of the source author + type: + - "null" + - string + attachments: + description: Attachments related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + additionalProperties: true + properties: {} + url: + description: The URL of the source + type: + - "null" + - string + contacts: + description: List of contacts involved in the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + type: + description: The type of the contact + type: + - "null" + - string + id: + description: The ID of the contact + type: + - "null" + - string + teammates: + description: List of teammates involved in the conversation. + type: + - "null" + - object + properties: + admins: + description: Admin teammates involved in the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + id: + description: The ID of the teammate admin + type: + - "null" + - string + type: + description: The type of the teammate (admin) + type: + - "null" + - string + type: + description: The type of teammates + type: + - "null" + - string + first_contact_reply: + description: Timestamp indicating when the first contact replied. + type: + - "null" + - object + properties: + type: + description: The type of the first contact reply + type: + - "null" + - string + url: + description: The URL of the first contact reply + type: + - "null" + - string + created_at: + description: The timestamp of the first contact's reply + type: + - "null" + - integer + custom_attributes: + description: Custom attributes associated with the conversation + type: + - "null" + - object + priority: + description: The priority level of the conversation + type: + - "null" + - string + conversation_message: + description: The main message content of the conversation. + type: + - "null" + - object + properties: + attachments: + description: Attachments in the conversation message + anyOf: + - type: array + items: + type: object + properties: + type: + type: + - "null" + - string + name: + type: + - "null" + - string + url: + type: + - "null" + - string + content_type: + type: + - "null" + - string + filesize: + type: + - "null" + - integer + height: + type: + - "null" + - integer + width: + type: + - "null" + - integer + - type: "null" + author: + description: The author of the conversation message. + type: + - "null" + - object + properties: + id: + description: The ID of the author of the message + type: + - "null" + - string + type: + description: The type of the author (e.g., admin, customer) + type: + - "null" + - string + name: + description: The name of the author of the message + type: + - "null" + - string + email: + description: The email of the author of the message + type: + - "null" + - string + body: + description: The body/content of the conversation message + type: + - "null" + - string + delivered_as: + description: The delivery status of the message + type: + - "null" + - string + id: + description: The ID of the conversation message + type: + - "null" + - string + subject: + description: The subject of the conversation message + type: + - "null" + - string + type: + description: The type of the conversation message + type: + - "null" + - string + url: + description: The URL of the conversation message + type: + - "null" + - string + conversation_rating: + description: Ratings given to the conversation by the customer and + teammate. + type: + - "null" + - object + properties: + created_at: + description: The timestamp when the rating was created + type: + - "null" + - integer + customer: + description: Rating given by the customer. + type: + - "null" + - object + properties: + id: + description: The ID of the customer who provided the rating + type: + - "null" + - string + type: + description: The type of the customer providing the rating + type: + - "null" + - string + rating: + description: The rating given to the conversation + type: + - "null" + - integer + remark: + description: Any remarks provided with the rating + type: + - "null" + - string + teammate: + description: Rating given by the teammate. + type: + - "null" + - object + properties: + id: + description: The ID of the teammate being rated + type: + - "null" + - integer + type: + description: The type of the teammate being rated + type: + - "null" + - string + created_at: + description: The timestamp when the conversation was created + type: + - "null" + - integer + customer_first_reply: + description: Timestamp indicating when the customer first replied. + type: + - "null" + - object + properties: + created_at: + description: The timestamp of the customer's first reply + type: + - "null" + - integer + type: + description: The type of the first customer reply + type: + - "null" + - string + url: + description: The URL of the first customer reply + type: + - "null" + - string + customers: + description: List of customers involved in the conversation + anyOf: + - type: array + items: + type: + - "null" + - object + properties: + id: + type: + - "null" + - string + type: + type: + - "null" + - string + - type: "null" + id: + description: The unique ID of the conversation + type: + - "null" + - string + open: + description: Indicates if the conversation is open or closed + type: + - "null" + - boolean + read: + description: Indicates if the conversation has been read + type: + - "null" + - boolean + sent_at: + description: The timestamp when the conversation was sent + type: + - "null" + - integer + snoozed_until: + description: Timestamp until the conversation is snoozed + type: + - "null" + - integer + sla_applied: + description: Service Level Agreement details applied to the conversation. + type: + - "null" + - object + properties: + sla_name: + description: The name of the SLA applied + type: + - "null" + - string + sla_status: + description: The status of the SLA applied + type: + - "null" + - string + state: + description: The state of the conversation (e.g., new, in progress) + type: + - "null" + - string + statistics: + description: Statistics related to the conversation. + type: + - "null" + - object + properties: + type: + description: The type of conversation statistics + type: + - "null" + - string + time_to_assignment: + description: Time taken for assignment + type: + - "null" + - integer + time_to_admin_reply: + description: Time taken to reply by admin + type: + - "null" + - integer + time_to_first_close: + description: Time taken to first close the conversation + type: + - "null" + - integer + time_to_last_close: + description: Time taken to last close the conversation + type: + - "null" + - integer + median_time_to_reply: + description: The median time taken to reply to the conversation + type: + - "null" + - integer + first_contact_reply_at: + description: Timestamp of the first contact reply + type: + - "null" + - integer + first_assignment_at: + description: Timestamp of the first assignment + type: + - "null" + - integer + first_admin_reply_at: + description: Timestamp of the first admin reply + type: + - "null" + - integer + first_close_at: + description: Timestamp of the first conversation close + type: + - "null" + - integer + last_assignment_at: + description: Timestamp of the last assignment + type: + - "null" + - integer + last_assignment_admin_reply_at: + description: Timestamp of the last assignment admin reply + type: + - "null" + - integer + last_contact_reply_at: + description: Timestamp of the last contact reply + type: + - "null" + - integer + last_admin_reply_at: + description: Timestamp of the last admin reply + type: + - "null" + - integer + last_close_at: + description: Timestamp of the last conversation close + type: + - "null" + - integer + last_closed_by_id: + description: The ID of the last user who closed the conversation + type: + - "null" + - integer + count_reopens: + description: The total count of conversation reopens + type: + - "null" + - integer + count_assignments: + description: The total count of assignments for the conversation + type: + - "null" + - integer + count_conversation_parts: + description: The total count of conversation parts + type: + - "null" + - integer + tags: + description: Tags applied to the conversation. + type: + - "null" + - object + items: + type: + - "null" + - object + properties: + applied_at: + description: Timestamp when the tag was applied + type: + - "null" + - integer + applied_by: + description: User who applied the tag. + type: + - "null" + - object + properties: + id: + description: The ID of the user who applied the tag + type: + - "null" + - string + type: + description: The type of the user who applied the tag + type: + - "null" + - string + id: + description: The ID of the tag + type: + - "null" + - string + name: + description: The name of the tag + type: + - "null" + - string + type: + description: The type of the tag + type: + - "null" + - string + type: + description: The type of the conversation + type: + - "null" + - string + updated_at: + description: The timestamp when the conversation was last updated + type: + - "null" + - integer + user: + description: The user related to the conversation. + type: + - "null" + - object + properties: + id: + description: The ID of the user associated with the conversation + type: + - "null" + - string + type: + description: The type of the user + type: + - "null" + - string + waiting_since: + description: Timestamp since waiting for a response + type: + - "null" + - integer + admin_assignee_id: + description: The ID of the administrator assigned to the conversation + type: + - "null" + - integer + title: + description: The title of the conversation + type: + - "null" + - string + team_assignee_id: + description: The ID of the team assigned to the conversation + type: + - "null" + - integer + redacted: + description: Indicates if the conversation is redacted + type: + - "null" + - boolean + topics: + description: Topics associated with the conversation. + type: + - "null" + - object + properties: + type: + description: The type of topics + type: + - "null" + - string + topics: + description: List of topics related to the conversation. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type of the topic + type: + - "null" + - string + id: + description: The ID of the topic + type: + - "null" + - integer + name: + description: The name of the topic + type: + - "null" + - string + total_count: + description: The total count of topics + type: + - "null" + - integer + type: DeclarativeStream + name: "conversations" + primary_key: "id" + parent_key: "id" + partition_field: "id" + transformations: + - type: AddFields + fields: + - path: + - "conversation_id" + value: "'{{ stream_slice.id }}'" + type: AddedFieldDefinition + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + assigned_to: + description: The user or team member who is assigned to handle this conversation + part. + oneOf: + - type: object + properties: + type: + type: + - "null" + - string + id: + type: + - "null" + - string + - type: string + - type: "null" + attachments: + description: Represents the attachments associated with the conversation + part. + type: + - "null" + - array + items: + type: + - "null" + - object + properties: + type: + description: The type or category of the attachment. + type: + - "null" + - string + name: + description: The filename or name of the attachment. + type: + - "null" + - string + url: + description: The URL or location where the attachment can be accessed. + type: + - "null" + - string + content_type: + description: The MIME type of the attachment content. + type: + - "null" + - string + filesize: + description: The size of the attachment file in bytes. + type: + - "null" + - integer + height: + description: The height dimension of the attachment in pixels. + type: + - "null" + - integer + width: + description: The width dimension of the attachment in pixels. + type: + - "null" + - integer + author: + description: Represents the author of the conversation part. + type: + - "null" + - object + properties: + id: + description: The unique identifier of the conversation author. + type: + - "null" + - string + type: + description: The type of author, such as customer or agent. + type: + - "null" + - string + name: + description: The name of the conversation author. + type: + - "null" + - string + email: + description: The email address of the conversation author. + type: + - "null" + - string + body: + description: The main content or message body of the conversation part. + type: + - "null" + - string + conversation_id: + description: The unique identifier of the conversation. + type: + - "null" + - string + conversation_created_at: + description: The date and time when the conversation was created. + type: + - "null" + - integer + conversation_updated_at: + description: The date and time when the conversation was last updated. + type: + - "null" + - integer + conversation_total_parts: + description: The total number of parts in the conversation. + type: + - "null" + - integer + created_at: + description: The date and time when the conversation part was created. + type: + - "null" + - integer + external_id: + description: An external identifier associated with the conversation part. + type: + - "null" + - string + id: + description: The unique identifier of the conversation part. + type: + - "null" + - string + notified_at: + description: The date and time when the conversation part was last notified. + type: + - "null" + - integer + part_type: + description: The type or category of the conversation part. + type: + - "null" + - string + type: + description: The type of conversation part, such as message or note. + type: + - "null" + - string + updated_at: + description: The date and time when the conversation part was last updated. + type: + - "null" + - integer + redacted: + description: Indicates if the conversation part has been redacted or censored. + type: + - "null" + - boolean + type: DeclarativeStream + name: "conversation_parts" + primary_key: "id" +- retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', + 0) - (config.get('lookback_window', 0) * 86400)}}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: "Active subscription needed" + action: FAIL + failure_type: config_error + error_message: "Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using API." + path: "/companies/{{ stream_slice.id }}/segments" + paginator: + type: "NoPagination" + type: SimpleRetriever + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: "updated_at" + parent_complete_fetch: true + parent_stream_configs: + - type: ParentStreamConfig + stream: + retriever: + description: "Base Retriever for Full Refresh streams" + record_selector: + description: "Base records selector for Full Refresh streams" + extractor: + type: DpathExtractor + field_path: + - "{{ parameters.get('data_field', 'data')}}" + record_filter: + condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) + if stream_state else stream_slice.get('prior_state', {}).get('updated_at', + 0) ) - (config.get('lookback_window', 0) * 86400) }}" + type: RecordFilter + type: RecordSelector + requester: + description: "Base Requester for Full Refresh streams" + type: HttpRequester + url_base: "https://api.intercom.io/" + http_method: "GET" + authenticator: + type: BearerAuthenticator + api_token: "{{ config['access_token'] }}" + request_headers: + Intercom-Version: "'2.10'" + Accept: "application/json" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + description: " 400 - existing scroll_param, need to wait at least + 60 sec to continue and retry 500 - server-side error, should retry + after 60 sec. " + response_filters: + - http_codes: + - 400 + action: RETRY + failure_type: transient_error + error_message: "A scroll (export) job is already in progress for + this Intercom account, causing the request to fail. Only one active + scroll per Intercom account is allowed; ensure no overlap by limiting + active connections or scheduling jobs appropriately." + type: HttpResponseFilter + - http_codes: + - 500 + action: RETRY + failure_type: transient_error + type: HttpResponseFilter + backoff_strategies: + - type: ConstantBackoffStrategy + backoff_time_in_seconds: 60 + - type: DefaultErrorHandler + description: "404 - scroll_param is expired or not found while requesting, + ignore" + response_filters: + - http_codes: + - 404 + action: IGNORE + type: HttpResponseFilter + path: "companies/scroll" + paginator: + type: "DefaultPaginator" + url_base: "https://api.intercom.io/" + pagination_strategy: + type: "CursorPagination" + cursor_value: "{{ response.get('scroll_param') }}" + stop_condition: "{{ not response.get('data') }}" + page_size: 150 + page_size_option: + inject_into: request_parameter + field_name: per_page + type: RequestOption + page_token_option: + type: RequestOption + field_name: scroll_param + inject_into: request_parameter + type: SimpleRetriever + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: "updated_at" + description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + type: + description: The type of the company + type: + - "null" + - string + company_id: + description: The unique identifier of the company + type: + - "null" + - string + id: + description: The ID of the company + type: + - "null" + - string + app_id: + description: The ID of the application associated with the company + type: + - "null" + - string + name: + description: The name of the company + type: + - "null" + - string + created_at: + description: The date and time when the company was created + type: + - "null" + - integer + updated_at: + description: The date and time when the company was last updated + type: + - "null" + - integer + monthly_spend: + description: The monthly spend of the company + type: + - "null" + - number + multipleOf: 0.00000001 + session_count: + description: The number of sessions related to the company + type: + - "null" + - integer + user_count: + description: The number of users associated with the company + type: + - "null" + - integer + size: + description: The size of the company + type: + - "null" + - integer + tags: + description: Tags associated with the company + type: object + properties: + type: + description: The type of tags associated with the company + type: string + tags: + description: List of tags + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the tag + type: string + name: + description: The name of the tag + type: string + id: + description: The ID of the tag + oneOf: + - type: + - "null" + - string + - type: + - "null" + - integer + segments: + description: Segments associated with the company + type: object + properties: + type: + description: The type of segments associated with the company + type: string + segments: + description: List of segments + type: array + items: + type: + - "null" + - object + properties: + type: + description: The type of the segment + type: string + id: + description: The ID of the segment + type: string + plan: + description: Details of the company's subscription plan + type: + - "null" + - object + properties: + id: + description: The ID of the subscription plan + type: + - "null" + - string + name: + description: The name of the subscription plan + type: + - "null" + - string + type: + description: The type of the subscription plan + type: + - "null" + - string + custom_attributes: + description: Custom attributes specific to the company + type: + - "null" + - object + additionalProperties: true + industry: + description: The industry in which the company operates + type: + - "null" + - string + remote_created_at: + description: The remote date and time when the company was created + type: + - "null" + - integer + website: + description: The website of the company + type: + - "null" + - string + type: DeclarativeStream + name: "companies" + primary_key: "id" + parent_key: "id" + partition_field: "id" + schema_loader: + type: InlineSchemaLoader + schema: + type: object + properties: + created_at: + description: The timestamp when the company segment was created. + type: + - "null" + - integer + count: + description: The count of company segments returned in the response. + type: + - "null" + - integer + id: + description: The unique identifier associated with the company segment. + type: + - "null" + - string + name: + description: The name of the company segment. + type: + - "null" + - string + type: + description: The category or type of the company segment. + type: + - "null" + - string + person_type: + description: The type of person associated with the company segment. + type: + - "null" + - string + updated_at: + description: The timestamp when the company segment was last updated. + type: + - "null" + - integer + type: DeclarativeStream + name: "company_segments" + primary_key: "id" +check: + stream_names: + - "tags" + type: CheckStream +spec: + type: Spec + documentation_url: https://docs.airbyte.com/integrations/sources/intercom + connection_specification: + $schema: http://json-schema.org/draft-07/schema# + title: Source Intercom Spec + type: object + required: + - start_date + - access_token + additionalProperties: true + properties: + start_date: + type: string + title: Start date + description: UTC date and time in the format 2017-01-25T00:00:00Z. Any data + before this date will not be replicated. + examples: + - '2020-11-16T00:00:00Z' + pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" + format: date-time + access_token: + title: Access token + type: string + description: Access token for making authenticated requests. See the Intercom + docs for more information. + airbyte_secret: true + order: 0 + client_id: + title: Client Id + type: string + description: Client Id for your Intercom application. + airbyte_secret: true + order: 1 + client_secret: + title: Client Secret + type: string + description: Client Secret for your Intercom application. + airbyte_secret: true + order: 2 + activity_logs_time_step: + type: integer + default: 30 + minimum: 1 + maximum: 91 + title: Activity logs stream slice step size (in days) + description: Set lower value in case of failing long running sync of Activity + Logs stream. + examples: + - 30 + - 10 + - 5 + order: 3 + advanced_auth: + auth_flow_type: oauth2.0 + oauth_config_specification: + complete_oauth_output_specification: + type: object + properties: + access_token: + type: string + path_in_connector_config: + - access_token + complete_oauth_server_input_specification: + type: object + properties: + client_id: + type: string + client_secret: + type: string + complete_oauth_server_output_specification: + type: object + properties: + client_id: + type: string + path_in_connector_config: + - client_id + client_secret: + type: string + path_in_connector_config: + - client_secret +type: DeclarativeSource diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 9b080353da5e..1aaf46adc24f 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -4,13 +4,14 @@ data: sl: 300 allowedHosts: hosts: - - api.intercom.io + - api.intercom.io connectorBuildOptions: - baseImage: docker.io/airbyte/python-connector-base:2.0.0@sha256:c44839ba84406116e8ba68722a0f30e8f6e7056c726f447681bb9e9ece8bd916 + baseImage: + docker.io/airbyte/source-declarative-manifest:5.14.0@sha256:accdf6c1bbcabd45b40f836692e4f3b1a1e1f0b28267973802ee212cd9c2c16a connectorSubtype: api connectorType: source definitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a - dockerImageTag: 0.8.0 + dockerImageTag: 0.9.0 dockerRepository: airbyte/source-intercom documentationUrl: https://docs.airbyte.com/integrations/sources/intercom githubIssueLabel: source-intercom @@ -20,7 +21,7 @@ data: name: Intercom remoteRegistries: pypi: - enabled: true + enabled: false packageName: airbyte-source-intercom registryOverrides: cloud: @@ -30,43 +31,43 @@ data: releaseStage: generally_available suggestedStreams: streams: - - conversations - - contacts - - conversation_parts - - teams - - companies + - conversations + - contacts + - conversation_parts + - teams + - companies supportLevel: certified tags: - - language:python - - cdk:low-code + - cdk:low-code + - language:manifest-only connectorTestSuitesOptions: - - suite: liveTests - testConnections: - - name: intercom_config_dev_null - id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 - - suite: unitTests - - suite: integrationTests - testSecrets: - - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS - fileName: config_apikey.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-INTERCOM__CREDS - fileName: config.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - suite: acceptanceTests - testSecrets: - - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS - fileName: config_apikey.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-INTERCOM__CREDS - fileName: config.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store + - suite: liveTests + testConnections: + - name: intercom_config_dev_null + id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 + - suite: unitTests + - suite: integrationTests + testSecrets: + - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS + fileName: config_apikey.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - name: SECRET_SOURCE-INTERCOM__CREDS + fileName: config.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - suite: acceptanceTests + testSecrets: + - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS + fileName: config_apikey.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - name: SECRET_SOURCE-INTERCOM__CREDS + fileName: config.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store metadataSpecVersion: "1.0" diff --git a/airbyte-integrations/connectors/source-intercom/poetry.lock b/airbyte-integrations/connectors/source-intercom/poetry.lock deleted file mode 100644 index b64d5cc8c88f..000000000000 --- a/airbyte-integrations/connectors/source-intercom/poetry.lock +++ /dev/null @@ -1,1716 +0,0 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. - -[[package]] -name = "airbyte-cdk" -version = "4.6.2" -description = "A framework for writing Airbyte Connectors." -optional = false -python-versions = "<4.0,>=3.10" -files = [ - {file = "airbyte_cdk-4.6.2-py3-none-any.whl", hash = "sha256:3a37bd96c4b4f874b15fc18839b1e163eb30d1e4ef80d7dde2854e6a48efe934"}, - {file = "airbyte_cdk-4.6.2.tar.gz", hash = "sha256:c034f11ba6abe73dd7346ce2bc7017ff71ef0db1fd1ae86fb86beaeae35d8baf"}, -] - -[package.dependencies] -airbyte-protocol-models-pdv2 = ">=0.12.2,<0.13.0" -backoff = "*" -cachetools = "*" -cryptography = ">=42.0.5,<43.0.0" -Deprecated = ">=1.2,<1.3" -dpath = ">=2.1.6,<3.0.0" -genson = "1.2.2" -isodate = ">=0.6.1,<0.7.0" -Jinja2 = ">=3.1.2,<3.2.0" -jsonref = ">=0.2,<0.3" -jsonschema = ">=3.2.0,<3.3.0" -langchain_core = "0.1.42" -nltk = "3.8.1" -orjson = ">=3.10.7,<4.0.0" -pendulum = "<3.0.0" -pydantic = ">=2.7,<3.0" -pyjwt = ">=2.8.0,<3.0.0" -pyrate-limiter = ">=3.1.0,<3.2.0" -python-dateutil = "*" -pytz = "2024.1" -PyYAML = ">=6.0.1,<7.0.0" -requests = "*" -requests_cache = "*" -wcmatch = "8.4" - -[package.extras] -file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pandas (==2.2.0)", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] -sphinx-docs = ["Sphinx (>=4.2,<4.3)", "sphinx-rtd-theme (>=1.0,<1.1)"] -vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.4.0)"] - -[[package]] -name = "airbyte-protocol-models-pdv2" -version = "0.12.2" -description = "Declares the Airbyte Protocol." -optional = false -python-versions = ">=3.8" -files = [ - {file = "airbyte_protocol_models_pdv2-0.12.2-py3-none-any.whl", hash = "sha256:8b3f9d0388928547cdf2e9134c0d589e4bcaa6f63bf71a21299f6824bfb7ad0e"}, - {file = "airbyte_protocol_models_pdv2-0.12.2.tar.gz", hash = "sha256:130c9ab289f3f53749ce63ff1abbfb67a44b7e5bd2794865315a2976138b672b"}, -] - -[package.dependencies] -pydantic = ">=2.7.2,<3.0.0" - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.6.2.post1" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, - {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "attrs" -version = "24.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - -[[package]] -name = "bracex" -version = "2.5.post1" -description = "Bash style brace expander." -optional = false -python-versions = ">=3.8" -files = [ - {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, - {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, -] - -[[package]] -name = "cachetools" -version = "5.5.0" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, - {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, -] - -[[package]] -name = "cattrs" -version = "24.1.2" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, - {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, -] - -[package.dependencies] -attrs = ">=23.1.0" -exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} - -[package.extras] -bson = ["pymongo (>=4.4.0)"] -cbor2 = ["cbor2 (>=5.4.6)"] -msgpack = ["msgpack (>=1.0.5)"] -msgspec = ["msgspec (>=0.18.5)"] -orjson = ["orjson (>=3.9.2)"] -pyyaml = ["pyyaml (>=6.0)"] -tomlkit = ["tomlkit (>=0.11.8)"] -ujson = ["ujson (>=5.7.0)"] - -[[package]] -name = "certifi" -version = "2024.8.30" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.4.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "42.0.8" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - -[[package]] -name = "dpath" -version = "2.2.0" -description = "Filesystem-like pathing and searching for dictionaries" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, - {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "genson" -version = "1.2.2" -description = "GenSON is a powerful, user-friendly JSON Schema generator." -optional = false -python-versions = "*" -files = [ - {file = "genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.6" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.27.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "isodate" -version = "0.6.1" -description = "An ISO 8601 date/time/duration parser and formatter" -optional = false -python-versions = "*" -files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "joblib" -version = "1.4.2" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, - {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "jsonref" -version = "0.2" -description = "An implementation of JSON Reference for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonref-0.2-py3-none-any.whl", hash = "sha256:b1e82fa0b62e2c2796a13e5401fe51790b248f6d9bf9d7212a3e31a3501b291f"}, - {file = "jsonref-0.2.tar.gz", hash = "sha256:f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697"}, -] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "langchain-core" -version = "0.1.42" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_core-0.1.42-py3-none-any.whl", hash = "sha256:c5653ffa08a44f740295c157a24c0def4a753333f6a2c41f76bf431cd00be8b5"}, - {file = "langchain_core-0.1.42.tar.gz", hash = "sha256:40751bf60ea5d8e2b2efe65290db434717ee3834870c002e40e2811f09d814e6"}, -] - -[package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.0,<0.2.0" -packaging = ">=23.2,<24.0" -pydantic = ">=1,<3" -PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" - -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] - -[[package]] -name = "langsmith" -version = "0.1.136" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langsmith-0.1.136-py3-none-any.whl", hash = "sha256:cad2215eb7a754ee259878e19c558f4f8d3795aa1b699f087d4500e640f80d0a"}, - {file = "langsmith-0.1.136.tar.gz", hash = "sha256:5c0de01a313db70dd9a85845c0f416a69b5b653b3e98ba413d7d41e8851315b1"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<1" -orjson = ">=3.9.14,<4.0.0" -pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} -requests = ">=2,<3" -requests-toolbelt = ">=1.0.0,<2.0.0" - -[[package]] -name = "markupsafe" -version = "3.0.2" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.9" -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, -] - -[[package]] -name = "nltk" -version = "3.8.1" -description = "Natural Language Toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, -] - -[package.dependencies] -click = "*" -joblib = "*" -regex = ">=2021.8.3" -tqdm = "*" - -[package.extras] -all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] -corenlp = ["requests"] -machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] -plot = ["matplotlib"] -tgrep = ["pyparsing"] -twitter = ["twython"] - -[[package]] -name = "orjson" -version = "3.10.9" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a377186a11b48c55969e34f0aa414c2826a234f212d6f2b312ba512e3cdb2c6f"}, - {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bf37bf0ca538065c34efe1803378b2dadd7e05b06610a086c2857f15ee59e12"}, - {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d9d83a91168aa48309acba804e393b7d9216b66f15e38f339b9fbb00db8986d"}, - {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0014038a17a1fe273da0a5489787677ef5a64566ab383ad6d929e44ed5683f4"}, - {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6ae1b1733e4528e45675ed09a732b6ac37d716bce2facaf467f84ce774adecd"}, - {file = "orjson-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe91c2259c4a859356b6db1c6e649b40577492f66d483da8b8af6da0f87c00e3"}, - {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a04f912c32463386ba117591c99a3d9e40b3b69bed9c5123d89dff06f0f5a4b0"}, - {file = "orjson-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae82ca347829ca47431767b079f96bb977f592189250ccdede676339a80c8982"}, - {file = "orjson-3.10.9-cp310-none-win32.whl", hash = "sha256:fd5083906825d7f5d23089425ce5424d783d6294020bcabb8518a3e1f97833e5"}, - {file = "orjson-3.10.9-cp310-none-win_amd64.whl", hash = "sha256:e9ff9521b5be0340c8e686bcfe2619777fd7583f71e7b494601cc91ad3919d2e"}, - {file = "orjson-3.10.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f3bd9df47385b8fabb3b2ee1e83f9960b8accc1905be971a1c257f16c32b491e"}, - {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4948961b6bce1e2086b2cf0b56cc454cdab589d40c7f85be71fb5a5556c51d3"}, - {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a9fc7a6cf2b229ddc323e136df13b3fb4466c50d84ed600cd0898223dd2fea3"}, - {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2314846e1029a2d2b899140f350eaaf3a73281df43ba84ac44d94ca861b5b269"}, - {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f52d993504827503411df2d60e60acf52885561458d6273f99ecd172f31c4352"}, - {file = "orjson-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29bbf08d907756c145a3a3a1f7ce2f11f15e3edbd3342842589d6030981b76f"}, - {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ae82992c00b480c3cc7dac6739324554be8c5d8e858a90044928506a3333ef4"}, - {file = "orjson-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6fdf8d32b6d94019dc15163542d345e9ce4c4661f56b318608aa3088a1a3a23b"}, - {file = "orjson-3.10.9-cp311-none-win32.whl", hash = "sha256:01f5fef452b4d7615f2e94153479370a4b59e0c964efb32dd902978f807a45cd"}, - {file = "orjson-3.10.9-cp311-none-win_amd64.whl", hash = "sha256:95361c4197c7ce9afdf56255de6f4e2474c39d16a277cce31d1b99a2520486d8"}, - {file = "orjson-3.10.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:43ad5560db54331c007dc38be5ba7706cb72974a29ae8227019d89305d750a6f"}, - {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1471c3274b1a4a9b8f4b9ed6effaea9ad885796373797515c44b365b375c256d"}, - {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:41d8cac575acd15918903d74cfaabb5dbe57b357b93341332f647d1013928dcc"}, - {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2920c8754f1aedc98bd357ec172af18ce48f5f1017a92244c85fe41d16d3c6e0"}, - {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7fa3ff6a0d9d15a0d0d2254cca16cd919156a18423654ce5574591392fe9914"}, - {file = "orjson-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e91b90c0c26bd79593967c1adef421bcff88c9e723d49c93bb7ad8af80bc6b"}, - {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f11949024f785ace1a516db32fa6255f6227226b2c988abf66f5aee61d43d8f7"}, - {file = "orjson-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:060e020d85d0ec145bc1b536b1fd9c10a0519c91991ead9724d6f759ebe26b9a"}, - {file = "orjson-3.10.9-cp312-none-win32.whl", hash = "sha256:71f73439999fe662843da3607cdf6e75b1551c330f487e5801d463d969091c63"}, - {file = "orjson-3.10.9-cp312-none-win_amd64.whl", hash = "sha256:12e2efe81356b8448f1cd130f8d75d3718de583112d71f2e2f8baa81bd835bb9"}, - {file = "orjson-3.10.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0ab6e3ad10e964392f0e838751bcce2ef9c8fa8be7deddffff83088e5791566d"}, - {file = "orjson-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ef65223baab00f469c8698f771ab3e6ccf6af2a987e77de5b566b4ec651150"}, - {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6f130848205fea90a2cb9fa2b11cafff9a9f31f4efad225800bc8b9e4a702f24"}, - {file = "orjson-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2ea7a98f3295ed8adb6730a5788cc78dafea28300d19932a1d2143457f7db802"}, - {file = "orjson-3.10.9-cp313-none-win32.whl", hash = "sha256:bdce39f96149a74fddeb2674c54f1da5e57724d32952eb6df2ac719b66d453cc"}, - {file = "orjson-3.10.9-cp313-none-win_amd64.whl", hash = "sha256:d11383701d4b58e795039b662ada46987744293d57bfa2719e7379b8d67bc796"}, - {file = "orjson-3.10.9-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3a1e845916a3739ab4162bb48dee66e0e727a19faf397176a7db0d9826cc3c"}, - {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063ca59d93d93d1387f0c4bb766c6d4f5b0e423fe7c366d0bd4401a56d1669d1"}, - {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:938b7fcd79cf06fe348fb24b6163fbaa2fdc9fbed8b1f06318f24467f1487e63"}, - {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc32a9e43c7693011ccde6f8eff8cba75ca0d2a55de11092faa4a716101e67f5"}, - {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b3069b7e2f57f3eef2282029b9c2ba21f08a55f1018e483663a3356f046af4c"}, - {file = "orjson-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4289b5d1f88fd05dcafdd7a1f3b17bb722e77712b7618f98e86bdda560e0a1a"}, - {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:74f5a7a7f282d326be71b722b0c350da7af6f5f15b9378da177e0e4a09bd91a3"}, - {file = "orjson-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:80e0c013e50cf7198319d8137931684eb9f32daa067e8276d9dbdd4010bb4add"}, - {file = "orjson-3.10.9-cp38-none-win32.whl", hash = "sha256:9d989152df8f60a76867354e0e08d896292ab9fb96a7ef89a5b3838de174522c"}, - {file = "orjson-3.10.9-cp38-none-win_amd64.whl", hash = "sha256:485358fe9892d6bfd88e5885b66bf88496e1842c8f35f61682ff9928b12a6cf0"}, - {file = "orjson-3.10.9-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ca54e6f320e33c8a6e471c424ee16576361d905c15d69e134c2906d3fcb31795"}, - {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9a9eb03a29c9b30b6c8bb35e5fa20d96589a76e0042005be59b7c3af10a7e43"}, - {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:731e8859fc99b398c286320726906404091141e9223dd5e9e6917f7e32e1cc68"}, - {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75b061c11f5aab979a95927a76394b4a85e3e4d63d0a2a16b56a4f7c6503afab"}, - {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b61b08f6397f004570fd6a840f4a58946b63b4c7029408cdedb45fe85c7d17f7"}, - {file = "orjson-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4f5e0360b7f0aba91dafe12469108109a0e8973956d4a9865ca262a6881406"}, - {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e403429e2947a059545e305d97e4b0eb90d3bb44b396d6f327d7ae2018391e13"}, - {file = "orjson-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0e492b93e122264c2dc78700859122631a4715bda88fabf57d9226954cfe7ec5"}, - {file = "orjson-3.10.9-cp39-none-win32.whl", hash = "sha256:bfba9605e85bfd19b83a21c2c25c2bed2000d5f097f3fa3ad5b5f8a7263a3148"}, - {file = "orjson-3.10.9-cp39-none-win_amd64.whl", hash = "sha256:77d277fa138d4bf145e8b24042004891c188c52ac8492724a183f42b0031cf0c"}, - {file = "orjson-3.10.9.tar.gz", hash = "sha256:c378074e0c46035dc66e57006993233ec66bf8487d501bab41649b4b7289ed4d"}, -] - -[[package]] -name = "packaging" -version = "23.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "pendulum" -version = "2.1.2" -description = "Python datetimes made easy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, - {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, - {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, - {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, - {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, - {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, - {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, - {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, - {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, - {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, - {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, - {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, - {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, - {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, - {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, - {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, -] - -[package.dependencies] -python-dateutil = ">=2.6,<3.0" -pytzdata = ">=2020.1" - -[[package]] -name = "platformdirs" -version = "4.3.6" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pydantic" -version = "2.9.2" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.23.4" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyjwt" -version = "2.9.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pyrate-limiter" -version = "3.1.1" -description = "Python Rate-Limiter using Leaky-Bucket Algorithm" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "pyrate_limiter-3.1.1-py3-none-any.whl", hash = "sha256:c51906f1d51d56dc992ff6c26e8300e32151bc6cfa3e6559792e31971dfd4e2b"}, - {file = "pyrate_limiter-3.1.1.tar.gz", hash = "sha256:2f57eda712687e6eccddf6afe8f8a15b409b97ed675fe64a626058f12863b7b7"}, -] - -[package.extras] -all = ["filelock (>=3.0)", "redis (>=5.0.0,<6.0.0)"] -docs = ["furo (>=2022.3.4,<2023.0.0)", "myst-parser (>=0.17)", "sphinx (>=4.3.0,<5.0.0)", "sphinx-autodoc-typehints (>=1.17,<2.0)", "sphinx-copybutton (>=0.5)", "sphinxcontrib-apidoc (>=0.3,<0.4)"] - -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - -[[package]] -name = "pytest" -version = "8.3.3" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, - {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - -[[package]] -name = "pytzdata" -version = "2020.1" -description = "The Olson timezone database for Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, - {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "regex" -version = "2024.9.11" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.8" -files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-cache" -version = "1.2.1" -description = "A persistent cache for python requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, - {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, -] - -[package.dependencies] -attrs = ">=21.2" -cattrs = ">=22.2" -platformdirs = ">=2.5" -requests = ">=2.22" -url-normalize = ">=1.4" -urllib3 = ">=1.25.5" - -[package.extras] -all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] -bson = ["bson (>=0.5)"] -docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] -dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] -json = ["ujson (>=5.4)"] -mongodb = ["pymongo (>=3)"] -redis = ["redis (>=3)"] -security = ["itsdangerous (>=2.0)"] -yaml = ["pyyaml (>=6.0.1)"] - -[[package]] -name = "requests-mock" -version = "1.12.1" -description = "Mock out responses from the requests package" -optional = false -python-versions = ">=3.5" -files = [ - {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, - {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, -] - -[package.dependencies] -requests = ">=2.22,<3" - -[package.extras] -fixture = ["fixtures"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "setuptools" -version = "75.2.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, - {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "tenacity" -version = "8.5.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tomli" -version = "2.0.2" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, -] - -[[package]] -name = "tqdm" -version = "4.66.5" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "url-normalize" -version = "1.4.3" -description = "URL normalization for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, - {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "urllib3" -version = "2.2.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wcmatch" -version = "8.4" -description = "Wildcard/glob file name matcher." -optional = false -python-versions = ">=3.7" -files = [ - {file = "wcmatch-8.4-py3-none-any.whl", hash = "sha256:dc7351e5a7f8bbf4c6828d51ad20c1770113f5f3fd3dfe2a03cfde2a63f03f98"}, - {file = "wcmatch-8.4.tar.gz", hash = "sha256:ba4fc5558f8946bf1ffc7034b05b814d825d694112499c86035e0e4d398b6a67"}, -] - -[package.dependencies] -bracex = ">=2.1.1" - -[[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.6" -files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.10,<3.12" -content-hash = "e75fecfda21bb185122d6218ee0e5cc1318b240bef1db615ed5052597e23ba11" diff --git a/airbyte-integrations/connectors/source-intercom/pyproject.toml b/airbyte-integrations/connectors/source-intercom/pyproject.toml deleted file mode 100644 index 983cb6bbcb65..000000000000 --- a/airbyte-integrations/connectors/source-intercom/pyproject.toml +++ /dev/null @@ -1,28 +0,0 @@ -[build-system] -requires = [ "poetry-core>=1.0.0",] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -version = "0.8.0" -name = "source-intercom" -description = "Source implementation for Intercom Yaml." -authors = [ "Airbyte ",] -license = "MIT" -readme = "README.md" -documentation = "https://docs.airbyte.com/integrations/sources/intercom" -homepage = "https://airbyte.com" -repository = "https://github.com/airbytehq/airbyte" -[[tool.poetry.packages]] -include = "source_intercom" - -[tool.poetry.dependencies] -python = "^3.10,<3.12" -airbyte-cdk = "^4.5.4" - -[tool.poetry.scripts] -source-intercom = "source_intercom.run:run" - -[tool.poetry.group.dev.dependencies] -requests-mock = "^1.9.3" -pytest-mock = "^3.12.0" -pytest = "^8.0.0" diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/__init__.py b/airbyte-integrations/connectors/source-intercom/source_intercom/__init__.py deleted file mode 100644 index de88c85697a0..000000000000 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -# Copyright (c) 2022 Airbyte, Inc., all rights reserved. -# - - -from .source import SourceIntercom - -__all__ = ["SourceIntercom"] diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/source_intercom/manifest.yaml deleted file mode 100644 index feb1122b22e1..000000000000 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/manifest.yaml +++ /dev/null @@ -1,2408 +0,0 @@ -version: 0.72.1 - -definitions: - ## bases - selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: ["{{ parameters.get('data_field', 'data')}}"] - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - # There is a bug in interpolation, causing the `2.10` string to be evaluated to `2.1`, cutting off the `0`. - # the workaround is to put the `string` inside the `string`, then it's evaluated properly to `2.10` - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_intercom.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API." - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - $ref: "#/definitions/selector" - requester: - $ref: "#/definitions/requester" - paginator: - type: "DefaultPaginator" - url_base: "#/definitions/requester/url_base" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - requester_incremental_search: - $ref: "#/definitions/requester" - http_method: "POST" - request_body_json: - query: - "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} }, - { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: - "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') - }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') - }}' }" - - ## streams - # full-refresh - stream_full_refresh: - retriever: - $ref: "#/definitions/retriever" - admins: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-admins" - $ref: "#/definitions/stream_full_refresh" - $parameters: - name: "admins" - primary_key: "id" - path: "admins" - data_field: "admins" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of unique identifiers for admins - anyOf: - - type: array - items: - type: integer - - type: "null" - avatar: - description: Admin avatar details - type: - - "null" - - object - properties: - image_url: - description: URL of the admin's avatar image - type: - - "null" - - string - away_mode_enabled: - description: Flag indicating if away mode is enabled for the admin - type: - - "null" - - boolean - away_mode_reassign: - description: - Flag indicating if away mode reassignment is enabled for - the admin - type: - - "null" - - boolean - email: - description: Email address of the admin - type: - - "null" - - string - has_inbox_seat: - description: Flag indicating if the admin has a seat in the inbox - type: - - "null" - - boolean - id: - description: Unique identifier for the admin - type: - - "null" - - string - job_title: - description: Job title of the admin - type: - - "null" - - string - name: - description: Name of the admin - type: - - "null" - - string - team_ids: - description: Array of team identifiers the admin belongs to - anyOf: - - type: array - items: - type: integer - - type: "null" - type: - description: Type of the admin (e.g., full-time, part-time) - type: - - "null" - - string - team_priority_level: - description: Detailed team priority level information for the admin - type: - - "null" - - object - properties: - primary_team_ids: - description: Array of primary team identifiers for the admin - type: - - "null" - - array - items: - type: - - "null" - - integer - secondary_team_ids: - description: Array of secondary team identifiers for the admin - type: - - "null" - - array - items: - type: - - "null" - - integer - tags: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app" - $ref: "#/definitions/stream_full_refresh" - $parameters: - name: "tags" - primary_key: "name" - path: "tags" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique identifier for the tag. - type: - - "null" - - string - name: - description: Name of the tag used for identification. - type: - - "null" - - string - type: - description: Type of the tag indicating its purpose or category. - type: - - "null" - - string - teams: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-teams" - $ref: "#/definitions/stream_full_refresh" - $parameters: - name: "teams" - primary_key: "name" - path: "teams" - data_field: "teams" - - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of user IDs representing the admins of the team. - anyOf: - - type: array - items: - type: integer - - type: "null" - id: - description: Unique identifier for the team. - type: - - "null" - - string - name: - description: Name of the team. - type: - - "null" - - string - type: - description: Type of team (e.g., 'internal', 'external'). - type: - - "null" - - string - stream_data_attributes: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - $ref: "#/definitions/stream_full_refresh" - retriever: - $ref: "#/definitions/retriever" - requester: - $ref: "#/definitions/requester" - request_parameters: - model: "{{ parameters.get('model') }}" - company_attributes: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - $ref: "#/definitions/stream_data_attributes" - $parameters: - name: "company_attributes" - primary_key: "name" - path: "data_attributes" - model: "company" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique ID assigned to the company attribute. - type: - - "null" - - integer - admin_id: - description: The ID of the admin user associated with the company. - type: - - "null" - - string - api_writable: - description: Indicates whether the field is writable through the API. - type: - - "null" - - boolean - archived: - description: Flag to indicate if the company data is archived. - type: - - "null" - - boolean - created_at: - description: Timestamp when the company data was created. - type: - - "null" - - integer - custom: - description: Custom attribute specific to the company. - type: - - "null" - - boolean - data_type: - description: Type of data stored in the attribute field. - type: - - "null" - - string - description: - description: Description or details about the company attribute. - type: - - "null" - - string - full_name: - description: Full name associated with the company. - type: - - "null" - - string - label: - description: Label or display name for the company attribute. - type: - - "null" - - string - model: - description: Model or schema used for storing the company attribute. - type: - - "null" - - string - name: - description: Name of the company attribute. - type: - - "null" - - string - options: - description: Available options or values for the company attribute. - anyOf: - - type: array - items: - type: string - - type: "null" - type: - description: Type of data structure for the company attribute. - type: - - "null" - - string - ui_writable: - description: Indicates whether the field is writable through the UI. - type: - - "null" - - boolean - updated_at: - description: Timestamp when the company data was last updated. - type: - - "null" - - integer - messenger_writable: - description: Indicates whether the field is writable through the messenger. - type: - - "null" - - boolean - contact_attributes: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - $ref: "#/definitions/stream_data_attributes" - $parameters: - name: "contact_attributes" - primary_key: "name" - path: "data_attributes" - model: "contact" - - # semi-incremental - # (full-refresh and emit records >= *prior state) - # (prior state - frozen state from previous sync, it automatically updates with next sync) - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique identifier for the contact attribute. - type: - - "null" - - integer - type: - description: The type of contact attribute (e.g., text, number, boolean). - type: - - "null" - - string - model: - description: Model to which the contact attribute is associated. - type: - - "null" - - string - name: - description: The name of the contact attribute. - type: - - "null" - - string - full_name: - description: The full name associated with the contact attribute. - type: - - "null" - - string - label: - description: Label representing the attribute in user interfaces. - type: - - "null" - - string - description: - description: Description of the contact attribute for better understanding. - type: - - "null" - - string - data_type: - description: The data type of the contact attribute value. - type: - - "null" - - string - options: - description: List of available options for the attribute. - type: - - "null" - - array - items: - type: - - "null" - - string - api_writable: - description: Indicates whether the attribute is writable via API. - type: - - "null" - - boolean - ui_writable: - description: Indicates whether the attribute is writable via user interface. - type: - - "null" - - boolean - custom: - description: Indicates if the attribute is a custom user-defined field. - type: - - "null" - - boolean - archived: - description: Flag to signify if the contact attribute is archived. - type: - - "null" - - boolean - admin_id: - description: - Unique identifier for the admin associated with the contact - attribute. - type: - - "null" - - string - created_at: - description: Timestamp of when the contact attribute was created. - type: - - "null" - - integer - updated_at: - description: Timestamp of when the contact attribute was last updated. - type: - - "null" - - integer - messenger_writable: - description: Indicates whether the attribute is writable via messenger. - type: - - "null" - - boolean - stream_semi_incremental: - $ref: "#/definitions/stream_full_refresh" - incremental_sync: - type: CustomIncrementalSync - class_name: source_intercom.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - retriever: - $ref: "#/definitions/stream_full_refresh/retriever" - record_selector: - $ref: "#/definitions/selector" - record_filter: - condition: - "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400) }}" - segments: - description: "https://developers.intercom.com/intercom-api-reference/reference#list-segments" - $ref: "#/definitions/stream_semi_incremental" - $parameters: - name: "segments" - primary_key: "id" - path: "segments" - data_field: "segments" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The date and time when the segment was created - type: - - "null" - - integer - count: - description: The number of items in the segment - type: - - "null" - - integer - id: - description: Unique identifier for the segment - type: - - "null" - - string - name: - description: The name or title of the segment - type: - - "null" - - string - type: - description: The type or category of the segment - type: - - "null" - - string - person_type: - description: Type of persons included in the segment - type: - - "null" - - string - updated_at: - description: The date and time when the segment was last updated - type: - - "null" - - integer - companies: - description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" - $ref: "#/definitions/stream_semi_incremental" - $parameters: - name: "companies" - primary_key: "id" - path: "companies/scroll" - retriever: - $ref: "#/definitions/stream_semi_incremental/retriever" - paginator: - type: "DefaultPaginator" - url_base: "#/definitions/requester/url_base" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('scroll_param') }}" - stop_condition: "{{ not response.get('data') }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestOption - field_name: scroll_param - inject_into: request_parameter - requester: - $ref: "#/definitions/requester" - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - description: - " 400 - existing scroll_param, need to wait at least 60 sec - to continue and retry 500 - server-side error, should retry after 60 - sec. " - response_filters: - - http_codes: [400] - action: RETRY - failure_type: transient_error - error_message: "A scroll (export) job is already in progress for this Intercom account, causing the request to fail. Only one active scroll per Intercom account is allowed; ensure no overlap by limiting active connections or scheduling jobs appropriately." - - http_codes: [500] - action: RETRY - failure_type: transient_error - backoff_strategies: - - type: ConstantBackoffStrategy - backoff_time_in_seconds: 60 - - type: DefaultErrorHandler - description: - "404 - scroll_param is expired or not found while requesting, - ignore" - response_filters: - - http_codes: [404] - action: IGNORE - - # semi-incremental substreams - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: The type of the company - type: - - "null" - - string - company_id: - description: The unique identifier of the company - type: - - "null" - - string - id: - description: The ID of the company - type: - - "null" - - string - app_id: - description: The ID of the application associated with the company - type: - - "null" - - string - name: - description: The name of the company - type: - - "null" - - string - created_at: - description: The date and time when the company was created - type: - - "null" - - integer - updated_at: - description: The date and time when the company was last updated - type: - - "null" - - integer - monthly_spend: - description: The monthly spend of the company - type: - - "null" - - number - multipleOf: 0.00000001 - session_count: - description: The number of sessions related to the company - type: - - "null" - - integer - user_count: - description: The number of users associated with the company - type: - - "null" - - integer - size: - description: The size of the company - type: - - "null" - - integer - tags: - description: Tags associated with the company - type: object - properties: - type: - description: The type of tags associated with the company - type: string - tags: - description: List of tags - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the tag - type: string - name: - description: The name of the tag - type: string - id: - description: The ID of the tag - oneOf: - - type: - - "null" - - string - - type: - - "null" - - integer - segments: - description: Segments associated with the company - type: object - properties: - type: - description: The type of segments associated with the company - type: string - segments: - description: List of segments - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the segment - type: string - id: - description: The ID of the segment - type: string - plan: - description: Details of the company's subscription plan - type: - - "null" - - object - properties: - id: - description: The ID of the subscription plan - type: - - "null" - - string - name: - description: The name of the subscription plan - type: - - "null" - - string - type: - description: The type of the subscription plan - type: - - "null" - - string - custom_attributes: - description: Custom attributes specific to the company - type: - - "null" - - object - additionalProperties: true - industry: - description: The industry in which the company operates - type: - - "null" - - string - remote_created_at: - description: The remote date and time when the company was created - type: - - "null" - - integer - website: - description: The website of the company - type: - - "null" - - string - substream_semi_incremental: - $ref: "#/definitions/stream_full_refresh" - incremental_sync: - type: CustomIncrementalSync - class_name: source_intercom.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - retriever: - $ref: "#/definitions/stream_full_refresh/retriever" - paginator: - type: "NoPagination" - record_selector: - $ref: "#/definitions/selector" - record_filter: - condition: - "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - conversation_parts: - $ref: "#/definitions/substream_semi_incremental" - incremental_sync: - $ref: "#/definitions/substream_semi_incremental/incremental_sync" - parent_stream_configs: - - type: ParentStreamConfig - stream: "#/definitions/conversations" - parent_key: "id" - partition_field: "id" - $parameters: - name: "conversation_parts" - primary_key: "id" - path: "/conversations/{{ stream_slice.id }}" - transformations: - - type: AddFields - fields: - - path: ["conversation_id"] - value: "'{{ stream_slice.id }}'" - retriever: - $ref: "#/definitions/substream_semi_incremental/retriever" - record_selector: - $ref: "#/definitions/substream_semi_incremental/retriever/record_selector" - extractor: - field_path: ["conversation_parts", "conversation_parts"] - requester: - $ref: "#/definitions/requester" - error_handler: - type: DefaultErrorHandler - description: "404 - conversation is not found while requesting, ignore" - response_filters: - - http_codes: [404] - action: IGNORE - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assigned_to: - description: - The user or team member who is assigned to handle this conversation - part. - oneOf: - - type: object - properties: - type: - type: - - "null" - - string - id: - type: - - "null" - - string - - type: string - - type: "null" - attachments: - description: - Represents the attachments associated with the conversation - part. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type or category of the attachment. - type: - - "null" - - string - name: - description: The filename or name of the attachment. - type: - - "null" - - string - url: - description: The URL or location where the attachment can be accessed. - type: - - "null" - - string - content_type: - description: The MIME type of the attachment content. - type: - - "null" - - string - filesize: - description: The size of the attachment file in bytes. - type: - - "null" - - integer - height: - description: The height dimension of the attachment in pixels. - type: - - "null" - - integer - width: - description: The width dimension of the attachment in pixels. - type: - - "null" - - integer - author: - description: Represents the author of the conversation part. - type: - - "null" - - object - properties: - id: - description: The unique identifier of the conversation author. - type: - - "null" - - string - type: - description: The type of author, such as customer or agent. - type: - - "null" - - string - name: - description: The name of the conversation author. - type: - - "null" - - string - email: - description: The email address of the conversation author. - type: - - "null" - - string - body: - description: The main content or message body of the conversation part. - type: - - "null" - - string - conversation_id: - description: The unique identifier of the conversation. - type: - - "null" - - string - conversation_created_at: - description: The date and time when the conversation was created. - type: - - "null" - - integer - conversation_updated_at: - description: The date and time when the conversation was last updated. - type: - - "null" - - integer - conversation_total_parts: - description: The total number of parts in the conversation. - type: - - "null" - - integer - created_at: - description: The date and time when the conversation part was created. - type: - - "null" - - integer - external_id: - description: An external identifier associated with the conversation part. - type: - - "null" - - string - id: - description: The unique identifier of the conversation part. - type: - - "null" - - string - notified_at: - description: The date and time when the conversation part was last notified. - type: - - "null" - - integer - part_type: - description: The type or category of the conversation part. - type: - - "null" - - string - type: - description: The type of conversation part, such as message or note. - type: - - "null" - - string - updated_at: - description: The date and time when the conversation part was last updated. - type: - - "null" - - integer - redacted: - description: Indicates if the conversation part has been redacted or censored. - type: - - "null" - - boolean - company_segments: - $ref: "#/definitions/substream_semi_incremental" - $parameters: - name: "company_segments" - primary_key: "id" - path: "/companies/{{ stream_slice.id }}/segments" - incremental_sync: - $ref: "#/definitions/substream_semi_incremental/incremental_sync" - parent_complete_fetch: true - parent_stream_configs: - - type: ParentStreamConfig - stream: "#/definitions/companies" - parent_key: "id" - partition_field: "id" - retriever: - $ref: "#/definitions/substream_semi_incremental/retriever" - - # incremental search - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The timestamp when the company segment was created. - type: - - "null" - - integer - count: - description: The count of company segments returned in the response. - type: - - "null" - - integer - id: - description: The unique identifier associated with the company segment. - type: - - "null" - - string - name: - description: The name of the company segment. - type: - - "null" - - string - type: - description: The category or type of the company segment. - type: - - "null" - - string - person_type: - description: The type of person associated with the company segment. - type: - - "null" - - string - updated_at: - description: The timestamp when the company segment was last updated. - type: - - "null" - - integer - stream_incremental_search: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - $ref: "#/definitions/stream_full_refresh" - incremental_sync: - type: CustomIncrementalSync - class_name: source_intercom.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - retriever: - $ref: "#/definitions/stream_full_refresh/retriever" - requester: - $ref: "#/definitions/requester_incremental_search" - record_selector: - $ref: "#/definitions/selector" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: - "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400)}}" - paginator: - type: "DefaultPaginator" - url_base: "#/definitions/requester/url_base" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - contacts: - $ref: "#/definitions/stream_incremental_search" - $parameters: - name: "contacts" - path: "contacts/search" - page_size: 150 - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: Type of contact. - type: - - "null" - - string - id: - description: The unique identifier of the contact. - type: - - "null" - - string - workspace_id: - description: - The unique identifier of the workspace associated with the - contact. - type: - - "null" - - string - external_id: - description: External identifier for the contact. - type: - - "null" - - string - role: - description: Role or position of the contact. - type: - - "null" - - string - email: - description: The email address of the contact. - type: - - "null" - - string - phone: - description: The phone number of the contact. - type: - - "null" - - string - name: - description: The name of the contact. - type: - - "null" - - string - avatar: - description: URL pointing to the contact's avatar image. - type: - - "null" - - string - owner_id: - description: The unique identifier of the contact's owner. - type: - - "null" - - integer - social_profiles: - description: Social profiles associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of social profile connection. - type: - - "null" - - string - data: - description: Array of social profile data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of social profile. - type: - - "null" - - string - name: - description: Name of the social profile. - type: - - "null" - - string - url: - description: URL of the social profile. - type: - - "null" - - string - has_hard_bounced: - description: Flag indicating if the contact has hard bounced. - type: - - "null" - - boolean - marked_email_as_spam: - description: Flag indicating if the contact's email was marked as spam. - type: - - "null" - - boolean - unsubscribed_from_emails: - description: Flag indicating if the contact unsubscribed from emails. - type: - - "null" - - boolean - unsubscribed_from_sms: - description: Flag indicating if the contact unsubscribed from SMS. - type: - - "null" - - boolean - created_at: - description: The date and time when the contact was created. - type: - - "null" - - integer - updated_at: - description: The date and time when the contact was last updated. - type: - - "null" - - integer - signed_up_at: - description: The date and time when the contact signed up. - type: - - "null" - - integer - sms_consent: - description: Consent status for SMS communication. - type: - - "null" - - boolean - last_seen_at: - description: The date and time when the contact was last seen overall. - type: - - "null" - - integer - last_replied_at: - description: The date and time when the contact last replied. - type: - - "null" - - integer - last_contacted_at: - description: The date and time when the contact was last contacted. - type: - - "null" - - integer - last_email_opened_at: - description: The date and time when the contact last opened an email. - type: - - "null" - - integer - last_email_clicked_at: - description: The date and time when the contact last clicked an email. - type: - - "null" - - integer - language_override: - description: Language override set for the contact. - type: - - "null" - - string - browser: - description: The browser used by the contact. - type: - - "null" - - string - browser_version: - description: The version of the browser used by the contact. - type: - - "null" - - string - browser_language: - description: The language preference set in the contact's browser. - type: - - "null" - - string - os: - description: Operating system of the contact's device. - type: - - "null" - - string - location: - description: Location details of the contact. - type: - - "null" - - object - properties: - type: - description: Type of location. - type: - - "null" - - string - country: - description: Country of the contact's location. - type: - - "null" - - string - region: - description: Region of the contact's location. - type: - - "null" - - string - city: - description: City of the contact's location. - type: - - "null" - - string - continent_code: - description: Continent code of the contact's location. - type: - - "null" - - string - country_code: - description: Country code of the contact's location. - type: - - "null" - - string - android_app_name: - description: The name of the Android app associated with the contact. - type: - - "null" - - string - android_app_version: - description: The version of the Android app associated with the contact. - type: - - "null" - - string - android_device: - description: The device used by the contact for Android. - type: - - "null" - - string - android_os_version: - description: The operating system version of the Android device. - type: - - "null" - - string - android_sdk_version: - description: The SDK version of the Android device. - type: - - "null" - - string - android_last_seen_at: - description: The date and time when the contact was last seen on Android. - type: - - "null" - - string - format: date-time - ios_app_name: - description: The name of the iOS app associated with the contact. - type: - - "null" - - string - ios_app_version: - description: The version of the iOS app associated with the contact. - type: - - "null" - - string - ios_device: - description: The device used by the contact for iOS. - type: - - "null" - - string - ios_os_version: - description: The operating system version of the iOS device. - type: - - "null" - - string - ios_sdk_version: - description: The SDK version of the iOS device. - type: - - "null" - - string - ios_last_seen_at: - description: The date and time when the contact was last seen on iOS. - type: - - "null" - - integer - custom_attributes: - description: Custom attributes defined for the contact. - type: - - "null" - - object - additionalProperties: true - properties: {} - tags: - description: Tags associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the tags. - type: - - "null" - - string - data: - description: Array of tag data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of tag. - type: - - "null" - - string - id: - description: The unique identifier of the tag. - type: - - "null" - - string - url: - description: URL of the tag. - type: - - "null" - - string - url: - description: URL to access more tag information. - type: - - "null" - - string - total_count: - description: Total count of tags associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more tags to load. - type: - - "null" - - boolean - notes: - description: Notes associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the notes. - type: - - "null" - - string - data: - description: Array of note data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of note. - type: - - "null" - - string - id: - description: The unique identifier of the note. - type: - - "null" - - string - url: - description: URL of the note. - type: - - "null" - - string - url: - description: URL to access more note information. - type: - - "null" - - string - total_count: - description: Total count of notes associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more notes to load. - type: - - "null" - - boolean - companies: - description: Companies associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the companies. - type: - - "null" - - string - data: - description: Array of company data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of company. - type: - - "null" - - string - id: - description: The unique identifier of the company. - type: - - "null" - - string - url: - description: URL of the company. - type: - - "null" - - string - url: - description: URL to access more company information. - type: - - "null" - - string - total_count: - description: Total count of companies associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more companies to load. - type: - - "null" - - boolean - opted_out_subscription_types: - description: Subscription types the contact opted out from. - type: - - "null" - - object - properties: - type: - description: Type of connection with the subscription types. - type: - - "null" - - string - data: - description: - Array of subscription type data opted out from by the - contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of subscription. - type: - - "null" - - string - id: - description: The unique identifier of the subscription type. - type: - - "null" - - string - url: - description: URL of the subscription type. - type: - - "null" - - string - url: - description: URL to access more subscription type information. - type: - - "null" - - string - total_count: - description: - Total count of subscription types the contact opted out - from. - type: - - "null" - - integer - has_more: - description: - Flag indicating if there are more subscription types - to load. - type: - - "null" - - boolean - opted_in_subscription_types: - description: Subscription types the contact opted into. - type: - - "null" - - object - properties: - type: - description: Type of connection with the subscription types. - type: - - "null" - - string - data: - description: Array of subscription type data opted into by the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of subscription. - type: - - "null" - - string - id: - description: The unique identifier of the subscription type. - type: - - "null" - - string - url: - description: URL of the subscription type. - type: - - "null" - - string - url: - description: URL to access more subscription type information. - type: - - "null" - - string - total_count: - description: Total count of subscription types the contact opted into. - type: - - "null" - - integer - has_more: - description: - Flag indicating if there are more subscription types - to load. - type: - - "null" - - boolean - utm_content: - description: Content data from UTM parameters. - type: - - "null" - - string - utm_campaign: - description: Campaign data from UTM parameters. - type: - - "null" - - string - utm_source: - description: Source data from UTM parameters. - type: - - "null" - - string - referrer: - description: Referrer information related to the contact. - type: - - "null" - - string - utm_term: - description: Term data from UTM parameters. - type: - - "null" - - string - utm_medium: - description: Medium data from UTM parameters. - type: - - "null" - - string - conversations: - $ref: "#/definitions/stream_incremental_search" - retriever: - $ref: "#/definitions/stream_incremental_search/retriever" - requester: - $ref: "#/definitions/requester_incremental_search" - request_headers: - # API version header - # There are 404 - User Not Found issue, when `2.10` is used, for certain users: - # https://github.com/airbytehq/oncall/issues/4514 - Intercom-Version: "2.9" - Accept: "application/json" - $parameters: - name: "conversations" - path: "conversations/search" - data_field: "conversations" - page_size: 150 - - # activity logs stream is incremental based on created_at field - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assignee: - description: The assigned user responsible for the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the assignee - type: - - "null" - - string - type: - description: The type of the assignee (e.g., admin, agent) - type: - - "null" - - string - name: - description: The name of the assignee - type: - - "null" - - string - email: - description: The email of the assignee - type: - - "null" - - string - source: - description: Source details of the conversation. - type: - - "null" - - object - properties: - type: - description: The type of the source - type: - - "null" - - string - id: - description: The ID of the source - type: - - "null" - - string - redacted: - description: Indicates if the source is redacted - type: - - "null" - - boolean - delivered_as: - description: The delivery status of the source - type: - - "null" - - string - subject: - description: The subject of the source - type: - - "null" - - string - body: - description: The body/content of the source - type: - - "null" - - string - author: - description: Author of the source. - type: - - "null" - - object - properties: - id: - description: The ID of the source author - type: - - "null" - - string - type: - description: The type of the source author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the source author - type: - - "null" - - string - email: - description: The email of the source author - type: - - "null" - - string - attachments: - description: Attachments related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - additionalProperties: true - properties: {} - url: - description: The URL of the source - type: - - "null" - - string - contacts: - description: List of contacts involved in the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - type: - description: The type of the contact - type: - - "null" - - string - id: - description: The ID of the contact - type: - - "null" - - string - teammates: - description: List of teammates involved in the conversation. - type: - - "null" - - object - properties: - admins: - description: Admin teammates involved in the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - id: - description: The ID of the teammate admin - type: - - "null" - - string - type: - description: The type of the teammate (admin) - type: - - "null" - - string - type: - description: The type of teammates - type: - - "null" - - string - first_contact_reply: - description: Timestamp indicating when the first contact replied. - type: - - "null" - - object - properties: - type: - description: The type of the first contact reply - type: - - "null" - - string - url: - description: The URL of the first contact reply - type: - - "null" - - string - created_at: - description: The timestamp of the first contact's reply - type: - - "null" - - integer - custom_attributes: - description: Custom attributes associated with the conversation - type: - - "null" - - object - priority: - description: The priority level of the conversation - type: - - "null" - - string - conversation_message: - description: The main message content of the conversation. - type: - - "null" - - object - properties: - attachments: - description: Attachments in the conversation message - anyOf: - - type: array - items: - type: object - properties: - type: - type: - - "null" - - string - name: - type: - - "null" - - string - url: - type: - - "null" - - string - content_type: - type: - - "null" - - string - filesize: - type: - - "null" - - integer - height: - type: - - "null" - - integer - width: - type: - - "null" - - integer - - type: "null" - author: - description: The author of the conversation message. - type: - - "null" - - object - properties: - id: - description: The ID of the author of the message - type: - - "null" - - string - type: - description: The type of the author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the author of the message - type: - - "null" - - string - email: - description: The email of the author of the message - type: - - "null" - - string - body: - description: The body/content of the conversation message - type: - - "null" - - string - delivered_as: - description: The delivery status of the message - type: - - "null" - - string - id: - description: The ID of the conversation message - type: - - "null" - - string - subject: - description: The subject of the conversation message - type: - - "null" - - string - type: - description: The type of the conversation message - type: - - "null" - - string - url: - description: The URL of the conversation message - type: - - "null" - - string - conversation_rating: - description: Ratings given to the conversation by the customer and teammate. - type: - - "null" - - object - properties: - created_at: - description: The timestamp when the rating was created - type: - - "null" - - integer - customer: - description: Rating given by the customer. - type: - - "null" - - object - properties: - id: - description: The ID of the customer who provided the rating - type: - - "null" - - string - type: - description: The type of the customer providing the rating - type: - - "null" - - string - rating: - description: The rating given to the conversation - type: - - "null" - - integer - remark: - description: Any remarks provided with the rating - type: - - "null" - - string - teammate: - description: Rating given by the teammate. - type: - - "null" - - object - properties: - id: - description: The ID of the teammate being rated - type: - - "null" - - integer - type: - description: The type of the teammate being rated - type: - - "null" - - string - created_at: - description: The timestamp when the conversation was created - type: - - "null" - - integer - customer_first_reply: - description: Timestamp indicating when the customer first replied. - type: - - "null" - - object - properties: - created_at: - description: The timestamp of the customer's first reply - type: - - "null" - - integer - type: - description: The type of the first customer reply - type: - - "null" - - string - url: - description: The URL of the first customer reply - type: - - "null" - - string - customers: - description: List of customers involved in the conversation - anyOf: - - type: array - items: - type: - - "null" - - object - properties: - id: - type: - - "null" - - string - type: - type: - - "null" - - string - - type: "null" - id: - description: The unique ID of the conversation - type: - - "null" - - string - open: - description: Indicates if the conversation is open or closed - type: - - "null" - - boolean - read: - description: Indicates if the conversation has been read - type: - - "null" - - boolean - sent_at: - description: The timestamp when the conversation was sent - type: - - "null" - - integer - snoozed_until: - description: Timestamp until the conversation is snoozed - type: - - "null" - - integer - sla_applied: - description: Service Level Agreement details applied to the conversation. - type: - - "null" - - object - properties: - sla_name: - description: The name of the SLA applied - type: - - "null" - - string - sla_status: - description: The status of the SLA applied - type: - - "null" - - string - state: - description: The state of the conversation (e.g., new, in progress) - type: - - "null" - - string - statistics: - description: Statistics related to the conversation. - type: - - "null" - - object - properties: - type: - description: The type of conversation statistics - type: - - "null" - - string - time_to_assignment: - description: Time taken for assignment - type: - - "null" - - integer - time_to_admin_reply: - description: Time taken to reply by admin - type: - - "null" - - integer - time_to_first_close: - description: Time taken to first close the conversation - type: - - "null" - - integer - time_to_last_close: - description: Time taken to last close the conversation - type: - - "null" - - integer - median_time_to_reply: - description: The median time taken to reply to the conversation - type: - - "null" - - integer - first_contact_reply_at: - description: Timestamp of the first contact reply - type: - - "null" - - integer - first_assignment_at: - description: Timestamp of the first assignment - type: - - "null" - - integer - first_admin_reply_at: - description: Timestamp of the first admin reply - type: - - "null" - - integer - first_close_at: - description: Timestamp of the first conversation close - type: - - "null" - - integer - last_assignment_at: - description: Timestamp of the last assignment - type: - - "null" - - integer - last_assignment_admin_reply_at: - description: Timestamp of the last assignment admin reply - type: - - "null" - - integer - last_contact_reply_at: - description: Timestamp of the last contact reply - type: - - "null" - - integer - last_admin_reply_at: - description: Timestamp of the last admin reply - type: - - "null" - - integer - last_close_at: - description: Timestamp of the last conversation close - type: - - "null" - - integer - last_closed_by_id: - description: The ID of the last user who closed the conversation - type: - - "null" - - integer - count_reopens: - description: The total count of conversation reopens - type: - - "null" - - integer - count_assignments: - description: The total count of assignments for the conversation - type: - - "null" - - integer - count_conversation_parts: - description: The total count of conversation parts - type: - - "null" - - integer - tags: - description: Tags applied to the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - applied_at: - description: Timestamp when the tag was applied - type: - - "null" - - integer - applied_by: - description: User who applied the tag. - type: - - "null" - - object - properties: - id: - description: The ID of the user who applied the tag - type: - - "null" - - string - type: - description: The type of the user who applied the tag - type: - - "null" - - string - id: - description: The ID of the tag - type: - - "null" - - string - name: - description: The name of the tag - type: - - "null" - - string - type: - description: The type of the tag - type: - - "null" - - string - type: - description: The type of the conversation - type: - - "null" - - string - updated_at: - description: The timestamp when the conversation was last updated - type: - - "null" - - integer - user: - description: The user related to the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the user associated with the conversation - type: - - "null" - - string - type: - description: The type of the user - type: - - "null" - - string - waiting_since: - description: Timestamp since waiting for a response - type: - - "null" - - integer - admin_assignee_id: - description: The ID of the administrator assigned to the conversation - type: - - "null" - - integer - title: - description: The title of the conversation - type: - - "null" - - string - team_assignee_id: - description: The ID of the team assigned to the conversation - type: - - "null" - - integer - redacted: - description: Indicates if the conversation is redacted - type: - - "null" - - boolean - topics: - description: Topics associated with the conversation. - type: - - "null" - - object - properties: - type: - description: The type of topics - type: - - "null" - - string - topics: - description: List of topics related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type of the topic - type: - - "null" - - string - id: - description: The ID of the topic - type: - - "null" - - integer - name: - description: The name of the topic - type: - - "null" - - string - total_count: - description: The total count of topics - type: - - "null" - - integer - activity_logs: - $ref: "#/definitions/stream_full_refresh" - primary_key: id - $parameters: - name: "activity_logs" - path: "admins/activity_logs" - data_field: "activity_logs" - retriever: - $ref: "#/definitions/retriever" - description: "The Retriever without passing page size option" - paginator: - type: "DefaultPaginator" - url_base: "#/definitions/requester/url_base" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_token_option: - type: RequestPath - incremental_sync: - type: DatetimeBasedCursor - cursor_field: created_at - cursor_datetime_formats: - - "%s" - datetime_format: "%s" - lookback_window: "P{{ config.get('lookback_window', 0) }}D" - cursor_granularity: "PT1S" - step: "P{{ config.get('activity_logs_time_step', 30) }}D" - start_datetime: - datetime: "{{ config['start_date'] }}" - datetime_format: "%Y-%m-%dT%H:%M:%SZ" - end_time_option: - field_name: "created_at_before" - inject_into: "request_parameter" - start_time_option: - field_name: "created_at_after" - inject_into: "request_parameter" - - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - performed_by: - description: The user who performed the activity - type: - - "null" - - object - properties: - id: - description: Unique identifier of the user who performed the activity - type: - - "null" - - string - type: - description: - Type of the user who performed the activity (e.g., admin, - user) - type: - - "null" - - string - ip: - description: IP address from where the activity was performed - type: - - "null" - - string - email: - description: Email of the user who performed the activity - type: - - "null" - - string - id: - description: Unique identifier for the activity log entry - type: - - "null" - - string - metadata: - description: Additional data or information related to the activity - type: - - "null" - - object - activity_type: - description: The type or category of the activity - type: - - "null" - - string - activity_description: - description: A description of the activity that took place - type: - - "null" - - string - created_at: - description: The timestamp when the activity occurred - type: - - "null" - - integer -streams: - - "#/definitions/activity_logs" - - "#/definitions/admins" - - "#/definitions/tags" - - "#/definitions/teams" - - "#/definitions/segments" - - "#/definitions/companies" - - "#/definitions/company_attributes" - - "#/definitions/contact_attributes" - - "#/definitions/contacts" - - "#/definitions/conversations" - - "#/definitions/conversation_parts" - - "#/definitions/company_segments" - -check: - stream_names: - - "tags" diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/run.py b/airbyte-integrations/connectors/source-intercom/source_intercom/run.py deleted file mode 100644 index 434766998b6e..000000000000 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/run.py +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - - -import sys - -from airbyte_cdk.entrypoint import launch -from source_intercom import SourceIntercom - - -def run(): - source = SourceIntercom() - launch(source, sys.argv[1:]) diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/source.py b/airbyte-integrations/connectors/source-intercom/source_intercom/source.py deleted file mode 100644 index bd527bbced67..000000000000 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/source.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource - -""" -This file provides the necessary constructs to interpret a provided declarative YAML configuration file into -source connector. - -WARNING: Do not modify this file. -""" - - -# Declarative Source -class SourceIntercom(YamlDeclarativeSource): - def __init__(self): - super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/spec.json b/airbyte-integrations/connectors/source-intercom/source_intercom/spec.json deleted file mode 100644 index b544fd8b43bd..000000000000 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/spec.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "documentationUrl": "https://docs.airbyte.com/integrations/sources/intercom", - "connectionSpecification": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Source Intercom Spec", - "type": "object", - "required": ["start_date", "access_token"], - "additionalProperties": true, - "properties": { - "start_date": { - "type": "string", - "title": "Start date", - "description": "UTC date and time in the format 2017-01-25T00:00:00Z. Any data before this date will not be replicated.", - "examples": ["2020-11-16T00:00:00Z"], - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$", - "format": "date-time" - }, - "access_token": { - "title": "Access token", - "type": "string", - "description": "Access token for making authenticated requests. See the Intercom docs for more information.", - "airbyte_secret": true, - "order": 0 - }, - "client_id": { - "title": "Client Id", - "type": "string", - "description": "Client Id for your Intercom application.", - "airbyte_secret": true, - "order": 1 - }, - "client_secret": { - "title": "Client Secret", - "type": "string", - "description": "Client Secret for your Intercom application.", - "airbyte_secret": true, - "order": 2 - }, - "activity_logs_time_step": { - "type": "integer", - "default": 30, - "minimum": 1, - "maximum": 91, - "title": "Activity logs stream slice step size (in days)", - "description": "Set lower value in case of failing long running sync of Activity Logs stream.", - "examples": [30, 10, 5], - "order": 3 - }, - "lookback_window": { - "title": "Lookback window", - "description": "The number of days to shift the state value backward for record sync", - "examples": [60], - "default": 0, - "minimum": 0, - "type": "integer", - "order": 4 - } - } - }, - "advanced_auth": { - "auth_flow_type": "oauth2.0", - "oauth_config_specification": { - "complete_oauth_output_specification": { - "type": "object", - "properties": { - "access_token": { - "type": "string", - "path_in_connector_config": ["access_token"] - } - } - }, - "complete_oauth_server_input_specification": { - "type": "object", - "properties": { - "client_id": { - "type": "string" - }, - "client_secret": { - "type": "string" - } - } - }, - "complete_oauth_server_output_specification": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "path_in_connector_config": ["client_id"] - }, - "client_secret": { - "type": "string", - "path_in_connector_config": ["client_secret"] - } - } - } - } - } -} diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py b/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py deleted file mode 100644 index cb3ca58063dd..000000000000 --- a/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from unittest.mock import MagicMock, Mock, patch - -import pytest -import requests -from airbyte_cdk.sources.declarative.partition_routers.substream_partition_router import ParentStreamConfig -from airbyte_cdk.sources.streams import Stream -from source_intercom.components import IncrementalSingleSliceCursor, IncrementalSubstreamSlicerCursor, IntercomRateLimiter - - -def test_slicer(): - date_time_dict = {"updated_at": 1662459010} - slicer = IncrementalSingleSliceCursor(config={}, parameters={}, cursor_field="updated_at") - slicer.observe(date_time_dict, date_time_dict) - slicer.close_slice(date_time_dict) - assert slicer.get_stream_state() == date_time_dict - assert slicer.get_request_headers() == {} - assert slicer.get_request_body_data() == {} - assert slicer.get_request_body_json() == {} - - -@pytest.mark.parametrize( - "last_record, expected, records", - [ - ( - {"first_stream_cursor": 1662459010}, - { - "first_stream_cursor": 1662459010, - "prior_state": {"first_stream_cursor": 1662459010, "parent_stream_name": {"parent_cursor_field": 1662459010}}, - "parent_stream_name": {"parent_cursor_field": 1662459010}, - }, - [{"first_stream_cursor": 1662459010}], - ) - ], -) -def test_sub_slicer(last_record, expected, records): - parent_stream = Mock(spec=Stream) - parent_stream.name = "parent_stream_name" - parent_stream.cursor_field = "parent_cursor_field" - parent_stream.state = {"parent_stream_name": {"parent_cursor_field": 1662459010}} - parent_stream.stream_slices.return_value = [{"a slice": "value"}] - parent_stream.read_records = MagicMock(return_value=records) - - parent_config = ParentStreamConfig( - stream=parent_stream, - parent_key="first_stream_cursor", - partition_field="first_stream_id", - parameters={}, - config={}, - ) - - slicer = IncrementalSubstreamSlicerCursor( - config={}, parameters={}, cursor_field="first_stream_cursor", parent_stream_configs=[parent_config], parent_complete_fetch=True - ) - slicer.set_initial_state(expected) - stream_slice = next(slicer.stream_slices()) if records else {} - slicer.observe(stream_slice, last_record) - slicer.close_slice(stream_slice) - assert slicer.get_stream_state() == expected - - -@pytest.mark.parametrize( - "rate_limit_header, backoff_time", - [ - ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 167}, 0.01), - ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 100}, 0.01), - ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 83}, 1.5), - ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 16}, 8.0), - ({}, 1.0), - ], -) -def test_rate_limiter(rate_limit_header, backoff_time): - def check_backoff_time(t): - """A replacer for original `IntercomRateLimiter.backoff_time`""" - assert backoff_time == t, f"Expected {backoff_time}, got {t}" - - class Requester: - @IntercomRateLimiter.balance_rate_limit() - def interpret_response_status(self, response: requests.Response): - """A stub for the decorator function being tested""" - - with patch.object(IntercomRateLimiter, "backoff_time") as backoff_time_mock: - # Call `check_backoff_time` instead of original `IntercomRateLimiter.backoff_time` method - backoff_time_mock.side_effect = check_backoff_time - - requester = Requester() - - # Prepare requester object with headers - response = requests.models.Response() - response.headers = rate_limit_header - - # Call a decorated method - requester.interpret_response_status(response) diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/test_source.py b/airbyte-integrations/connectors/source-intercom/unit_tests/test_source.py deleted file mode 100644 index fe7a765a2ee0..000000000000 --- a/airbyte-integrations/connectors/source-intercom/unit_tests/test_source.py +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from source_intercom import SourceIntercom - - -def test_source(): - assert SourceIntercom() diff --git a/docs/integrations/sources/intercom.md b/docs/integrations/sources/intercom.md index 0c4d7468245f..efd577122f82 100644 --- a/docs/integrations/sources/intercom.md +++ b/docs/integrations/sources/intercom.md @@ -96,6 +96,7 @@ The Intercom connector should not run into Intercom API limitations under normal | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| 0.9.0 | 2024-10-24 | [00000](https://github.com/airbytehq/airbyte/pull/00000) | Migrate to manifest-only format | | 0.8.0 | 2024-10-23 | [46658](https://github.com/airbytehq/airbyte/pull/46658) | Add `lookback_window` to the source specification | | 0.7.5 | 2024-10-21 | [47120](https://github.com/airbytehq/airbyte/pull/47120) | Update dependencies | | 0.7.4 | 2024-10-12 | [46831](https://github.com/airbytehq/airbyte/pull/46831) | Update dependencies | From 6800bbf65113fa77625d1af5e03be2a1111412ee Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Tue, 22 Oct 2024 17:30:42 +0000 Subject: [PATCH 02/20] chore: auto-fix lint and format issues --- .../acceptance-test-config.yml | 30 ++++---- .../connectors/source-intercom/metadata.yaml | 77 +++++++++---------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml index 0f0d5da224da..1645a17ccafe 100644 --- a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml @@ -5,28 +5,28 @@ test_strictness_level: high acceptance_tests: spec: tests: - - spec_path: "manifest.yaml" + - spec_path: "manifest.yaml" connection: tests: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: tests: - - config_path: "secrets/config.json" + - config_path: "secrets/config.json" basic_read: tests: - - config_path: "secrets/config.json" - expect_records: - path: "integration_tests/expected_records.jsonl" + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" incremental: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/incremental_catalog.json" - future_state: - future_state_path: "integration_tests/abnormal_state.json" + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/incremental_catalog.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" full_refresh: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 1aaf46adc24f..e7b32d56c3c2 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -4,10 +4,9 @@ data: sl: 300 allowedHosts: hosts: - - api.intercom.io + - api.intercom.io connectorBuildOptions: - baseImage: - docker.io/airbyte/source-declarative-manifest:5.14.0@sha256:accdf6c1bbcabd45b40f836692e4f3b1a1e1f0b28267973802ee212cd9c2c16a + baseImage: docker.io/airbyte/source-declarative-manifest:5.14.0@sha256:accdf6c1bbcabd45b40f836692e4f3b1a1e1f0b28267973802ee212cd9c2c16a connectorSubtype: api connectorType: source definitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a @@ -31,43 +30,43 @@ data: releaseStage: generally_available suggestedStreams: streams: - - conversations - - contacts - - conversation_parts - - teams - - companies + - conversations + - contacts + - conversation_parts + - teams + - companies supportLevel: certified tags: - - cdk:low-code - - language:manifest-only + - cdk:low-code + - language:manifest-only connectorTestSuitesOptions: - - suite: liveTests - testConnections: - - name: intercom_config_dev_null - id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 - - suite: unitTests - - suite: integrationTests - testSecrets: - - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS - fileName: config_apikey.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-INTERCOM__CREDS - fileName: config.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - suite: acceptanceTests - testSecrets: - - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS - fileName: config_apikey.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store - - name: SECRET_SOURCE-INTERCOM__CREDS - fileName: config.json - secretStore: - type: GSM - alias: airbyte-connector-testing-secret-store + - suite: liveTests + testConnections: + - name: intercom_config_dev_null + id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 + - suite: unitTests + - suite: integrationTests + testSecrets: + - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS + fileName: config_apikey.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - name: SECRET_SOURCE-INTERCOM__CREDS + fileName: config.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - suite: acceptanceTests + testSecrets: + - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS + fileName: config_apikey.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store + - name: SECRET_SOURCE-INTERCOM__CREDS + fileName: config.json + secretStore: + type: GSM + alias: airbyte-connector-testing-secret-store metadataSpecVersion: "1.0" From efcdd3b5968f257b2b0e3a04502a4e199c4ace6f Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Tue, 22 Oct 2024 23:10:09 +0530 Subject: [PATCH 03/20] update docs --- docs/integrations/sources/intercom.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/sources/intercom.md b/docs/integrations/sources/intercom.md index efd577122f82..0f9dba8fe63a 100644 --- a/docs/integrations/sources/intercom.md +++ b/docs/integrations/sources/intercom.md @@ -96,7 +96,7 @@ The Intercom connector should not run into Intercom API limitations under normal | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| 0.9.0 | 2024-10-24 | [00000](https://github.com/airbytehq/airbyte/pull/00000) | Migrate to manifest-only format | +| 0.9.0 | 2024-10-24 | [47240](https://github.com/airbytehq/airbyte/pull/47240) | Migrate to manifest-only format | | 0.8.0 | 2024-10-23 | [46658](https://github.com/airbytehq/airbyte/pull/46658) | Add `lookback_window` to the source specification | | 0.7.5 | 2024-10-21 | [47120](https://github.com/airbytehq/airbyte/pull/47120) | Update dependencies | | 0.7.4 | 2024-10-12 | [46831](https://github.com/airbytehq/airbyte/pull/46831) | Update dependencies | From 75c6c7c1162990ef07fc1f4287c1a81fa1f27ec8 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Fri, 13 Dec 2024 01:49:20 +0530 Subject: [PATCH 04/20] update manifest --- .../connectors/source-intercom/manifest.yaml | 9402 ++++------------- 1 file changed, 2263 insertions(+), 7139 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index f4a880fba58d..e6c883055e37 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -1,7751 +1,2875 @@ -version: 4.3.2 +version: 5.7.0 + +type: DeclarativeSource + +check: + type: CheckStream + stream_names: + - tags + definitions: - selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - requester_incremental_search: - description: "Base Requester for Full Refresh streams" + streams: + activity_logs: + type: DeclarativeStream + name: activity_logs + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: admins/activity_logs + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - activity_logs + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + pagination_strategy: + type: CursorPagination + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + incremental_sync: + type: DatetimeBasedCursor + cursor_field: created_at + lookback_window: P{{ config.get('lookback_window', 0) }}D + cursor_datetime_formats: + - "%s" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config[\"start_date\"] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + start_time_option: + type: RequestOption + field_name: created_at_after + inject_into: request_parameter + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/activity_logs" + admins: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-admins + name: admins + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: admins + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - admins + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/admins" + tags: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app + name: tags + primary_key: + - name + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: tags + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/tags" + teams: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-teams + name: teams + primary_key: + - name + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: teams + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - teams + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/teams" + segments: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-segments + name: segments + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: segments + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - segments + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * + 86400) }} + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: updated_at + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/segments" + companies: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies + name: companies + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: companies/scroll + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: RETRY + http_codes: + - 400 + error_message: >- + A scroll (export) job is already in progress for this + Intercom account, causing the request to fail. Only one + active scroll per Intercom account is allowed; + ensure no overlap by limiting active connections or + scheduling jobs appropriately. + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: IGNORE + http_codes: + - 404 + - type: DefaultErrorHandler + backoff_strategies: + - type: ConstantBackoffStrategy + backoff_time_in_seconds: 60 + response_filters: + - type: HttpResponseFilter + action: RETRY + http_codes: + - 500 + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * + 86400) }} + paginator: + type: DefaultPaginator + page_token_option: + type: RequestOption + inject_into: request_parameter + field_name: scroll_param + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('scroll_param') }}" + stop_condition: "{{ not response.get('data') }}" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: updated_at + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/companies" + company_attributes: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes + name: company_attributes + primary_key: + - name + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: data_attributes + http_method: GET + request_parameters: + model: company + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/company_attributes" + contact_attributes: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes + name: contact_attributes + primary_key: + - name + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: data_attributes + http_method: GET + request_parameters: + model: contact + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + inject_into: request_parameter + field_name: per_page + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contact_attributes" + contacts: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search + name: contacts + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: contacts/search + http_method: POST + request_headers: + Intercom-Version: "2.11" + Accept: application/json + request_body_json: + query: >- + { 'operator': 'OR', 'value': [ { 'field': 'updated_at', + 'operator': '>', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or + format_datetime(config['start_date'], '%s') }} }, { 'field': + 'updated_at', 'operator': '=', 'value': {{ + stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], } + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: >- + { 'per_page': {{ parameters.get('page_size') }}, 'page': {{ + next_page_token.get('next_page_token').get('page') }}, + 'starting_after': '{{ + next_page_token.get('next_page_token').get('starting_after') }}' } + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * + 86400)}} + paginator: + type: DefaultPaginator + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: updated_at + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/contacts" + conversations: + type: DeclarativeStream + description: >- + https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search + name: conversations + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: conversations/search + http_method: POST + request_headers: + Intercom-Version: "2.11" + Accept: application/json + request_body_json: + query: >- + { 'operator': 'OR', 'value': [ { 'field': 'updated_at', + 'operator': '>', 'value': {{ stream_slice.get('prior_state', + stream_state.get('prior_state', {})).get('updated_at') or + format_datetime(config['start_date'], '%s') }} }, { 'field': + 'updated_at', 'operator': '=', 'value': {{ + stream_slice.get('prior_state', stream_state.get('prior_state', + {})).get('updated_at') or format_datetime(config['start_date'], + '%s') }} }, ], } + sort: "{'field': 'updated_at', 'order': 'ascending'}" + pagination: >- + { 'per_page': {{ parameters.get('page_size') }}, 'page': {{ + next_page_token.get('next_page_token').get('page') }}, + 'starting_after': '{{ + next_page_token.get('next_page_token').get('starting_after') }}' } + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - conversations + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= ( stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400) if stream_state else stream_slice.get('prior_state', + {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * + 86400)}} + paginator: + type: DefaultPaginator + pagination_strategy: + type: CursorPagination + page_size: 150 + cursor_value: "{{ response.get('pages', {}).get('next') }}" + stop_condition: "{{ 'next' not in response.get('pages', {}) }}" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + cursor_field: updated_at + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversations" + conversation_parts: + type: DeclarativeStream + name: conversation_parts + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /conversations/{{ stream_slice.id }} + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + http_codes: + - 404 + action: IGNORE + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - conversation_parts + - conversation_parts + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400)}} + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: id + stream: + $ref: "#/definitions/streams/conversations" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: updated_at + transformations: + - type: AddFields + fields: + - path: + - conversation_id + value: "{{ stream_slice.id }}" + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/conversation_parts" + company_segments: + type: DeclarativeStream + name: company_segments + primary_key: + - id + retriever: + type: SimpleRetriever + requester: + $ref: "#/definitions/base_requester" + path: /companies/{{ stream_slice.id }}/segments + http_method: GET + request_headers: + Intercom-Version: "2.11" + Accept: application/json + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + error_message_contains: Active subscription needed + action: FAIL + failure_type: config_error + error_message: >- + Failed to perform request. Error: Active subscription needed. + Please, validate your current Intercom plan to continue using + API. + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: + - data + record_filter: + type: RecordFilter + condition: >- + {{ record['updated_at'] >= stream_state.get('prior_state', + {}).get('updated_at', 0) - (config.get('lookback_window', 0) * + 86400)}} + partition_router: + type: SubstreamPartitionRouter + parent_stream_configs: + - type: ParentStreamConfig + parent_key: id + partition_field: id + stream: + $ref: "#/definitions/streams/companies" + incremental_sync: + type: CustomIncrementalSync + class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + cursor_field: updated_at + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/company_segments" + base_requester: type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" + url_base: https://api.intercom.io/ authenticator: type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} }, - { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') - }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') - }}' }" - stream_full_refresh: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - admins: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-admins" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of unique identifiers for admins - anyOf: - - type: array - items: - type: integer - - type: "null" - avatar: - description: Admin avatar details - type: - - "null" - - object - properties: - image_url: - description: URL of the admin's avatar image - type: - - "null" - - string - away_mode_enabled: - description: Flag indicating if away mode is enabled for the admin - type: - - "null" - - boolean - away_mode_reassign: - description: Flag indicating if away mode reassignment is enabled for - the admin - type: - - "null" - - boolean - email: - description: Email address of the admin - type: - - "null" - - string - has_inbox_seat: - description: Flag indicating if the admin has a seat in the inbox - type: - - "null" - - boolean - id: - description: Unique identifier for the admin - type: - - "null" - - string - job_title: - description: Job title of the admin - type: - - "null" - - string - name: - description: Name of the admin - type: - - "null" - - string - team_ids: - description: Array of team identifiers the admin belongs to - anyOf: - - type: array - items: - type: integer - - type: "null" - type: - description: Type of the admin (e.g., full-time, part-time) - type: - - "null" - - string - team_priority_level: - description: Detailed team priority level information for the admin - type: - - "null" - - object - properties: - primary_team_ids: - description: Array of primary team identifiers for the admin - type: - - "null" - - array - items: - type: - - "null" - - integer - secondary_team_ids: - description: Array of secondary team identifiers for the admin - type: - - "null" - - array - items: - type: - - "null" - - integer - tags: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app" - schema_loader: - type: InlineSchemaLoader - schema: - type: object + api_token: "{{ config[\"access_token\"] }}" + +streams: + - $ref: "#/definitions/streams/activity_logs" + - $ref: "#/definitions/streams/admins" + - $ref: "#/definitions/streams/tags" + - $ref: "#/definitions/streams/teams" + - $ref: "#/definitions/streams/segments" + - $ref: "#/definitions/streams/companies" + - $ref: "#/definitions/streams/company_attributes" + - $ref: "#/definitions/streams/contact_attributes" + - $ref: "#/definitions/streams/contacts" + - $ref: "#/definitions/streams/conversations" + - $ref: "#/definitions/streams/conversation_parts" + - $ref: "#/definitions/streams/company_segments" + +spec: + type: Spec + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + required: + - access_token + - start_date + properties: + access_token: + type: string + description: >- + Access token for making authenticated requests. See the Intercom + docs for more information. + title: Access token + airbyte_secret: true + order: 0 + client_id: + type: string + description: Client Id for your Intercom application. + title: Client Id + airbyte_secret: true + order: 1 + client_secret: + type: string + description: Client Secret for your Intercom application. + title: Client Secret + airbyte_secret: true + order: 2 + activity_logs_time_step: + type: integer + description: >- + Set lower value in case of failing long running sync of Activity Logs + stream. + default: 30 + minimum: 1 + maximum: 91 + title: Activity logs stream slice step size (in days) + examples: + - 30 + - 10 + - 5 + order: 3 + lookback_window: + type: integer + description: The number of days to shift the state value backward for record sync + title: Lookback window + examples: + - 60 + default: 0 + minimum: 0 + order: 4 + start_date: + type: string + description: >- + UTC date and time in the format 2017-01-25T00:00:00Z. Any data before + this date will not be replicated. + title: Start date + examples: + - "2020-11-16T00:00:00Z" + pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ + format: date-time + order: 5 + additionalProperties: true + +metadata: + autoImportSchema: + activity_logs: false + admins: false + tags: false + teams: false + segments: false + companies: false + company_attributes: false + contact_attributes: false + contacts: false + conversations: false + conversation_parts: false + company_segments: false + yamlComponents: + streams: + activity_logs: + - errorHandler + admins: + - errorHandler + tags: + - errorHandler + teams: + - errorHandler + segments: + - errorHandler + - incrementalSync + companies: + - incrementalSync + company_attributes: + - errorHandler + contact_attributes: + - errorHandler + contacts: + - errorHandler + - incrementalSync + conversations: + - errorHandler + - incrementalSync + conversation_parts: + - incrementalSync + company_segments: + - errorHandler + - incrementalSync + testedStreams: + activity_logs: + streamHash: dae54ab01efc8a7c580121de6902d67a82a87775 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + assist: {} + +schemas: + activity_logs: + type: object + additionalProperties: true + properties: + metadata: + type: + - "null" + - object + description: Additional data or information related to the activity + activity_description: + type: + - "null" + - string + description: A description of the activity that took place + activity_type: + type: + - "null" + - string + description: The type or category of the activity + created_at: + type: + - "null" + - integer + description: The timestamp when the activity occurred + id: + type: + - "null" + - string + description: Unique identifier for the activity log entry + performed_by: + type: + - "null" + - object + description: The user who performed the activity properties: - id: - description: Unique identifier for the tag. - type: - - "null" - - string - name: - description: Name of the tag used for identification. - type: - - "null" - - string type: - description: Type of the tag indicating its purpose or category. - type: - - "null" - - string - teams: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-teams" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of user IDs representing the admins of the team. - anyOf: - - type: array - items: - type: integer - - type: "null" - id: - description: Unique identifier for the team. - type: - - "null" - - string - name: - description: Name of the team. type: - - "null" - - string - type: - description: Type of team (e.g., 'internal', 'external'). + - "null" + - string + description: Type of the user who performed the activity (e.g., admin, user) + email: type: - - "null" - - string - stream_data_attributes: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_parameters: - model: "{{ parameters.get('model') }}" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - company_attributes: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_parameters: - model: "{{ parameters.get('model') }}" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: + - "null" + - string + description: Email of the user who performed the activity id: - description: Unique ID assigned to the company attribute. - type: - - "null" - - integer - admin_id: - description: The ID of the admin user associated with the company. - type: - - "null" - - string - api_writable: - description: Indicates whether the field is writable through the API. - type: - - "null" - - boolean - archived: - description: Flag to indicate if the company data is archived. - type: - - "null" - - boolean - created_at: - description: Timestamp when the company data was created. - type: - - "null" - - integer - custom: - description: Custom attribute specific to the company. - type: - - "null" - - boolean - data_type: - description: Type of data stored in the attribute field. - type: - - "null" - - string - description: - description: Description or details about the company attribute. type: - - "null" - - string - full_name: - description: Full name associated with the company. - type: - - "null" - - string - label: - description: Label or display name for the company attribute. - type: - - "null" - - string - model: - description: Model or schema used for storing the company attribute. - type: - - "null" - - string - name: - description: Name of the company attribute. + - "null" + - string + description: Unique identifier of the user who performed the activity + ip: type: - - "null" - - string - options: - description: Available options or values for the company attribute. - anyOf: - - type: array - items: - type: string - - type: "null" - type: - description: Type of data structure for the company attribute. - type: - - "null" - - string - ui_writable: - description: Indicates whether the field is writable through the UI. - type: - - "null" - - boolean - updated_at: - description: Timestamp when the company data was last updated. - type: - - "null" - - integer - messenger_writable: - description: Indicates whether the field is writable through the messenger. - type: - - "null" - - boolean - contact_attributes: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_parameters: - model: "{{ parameters.get('model') }}" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique identifier for the contact attribute. - type: - - "null" - - integer - type: - description: The type of contact attribute (e.g., text, number, boolean). - type: - - "null" - - string - model: - description: Model to which the contact attribute is associated. - type: - - "null" - - string - name: - description: The name of the contact attribute. - type: - - "null" - - string - full_name: - description: The full name associated with the contact attribute. - type: - - "null" - - string - label: - description: Label representing the attribute in user interfaces. - type: - - "null" - - string - description: - description: Description of the contact attribute for better understanding. - type: - - "null" - - string - data_type: - description: The data type of the contact attribute value. - type: - - "null" - - string - options: - description: List of available options for the attribute. - type: - - "null" - - array - items: - type: - - "null" - - string - api_writable: - description: Indicates whether the attribute is writable via API. - type: - - "null" - - boolean - ui_writable: - description: Indicates whether the attribute is writable via user interface. - type: - - "null" - - boolean - custom: - description: Indicates if the attribute is a custom user-defined field. - type: - - "null" - - boolean - archived: - description: Flag to signify if the contact attribute is archived. - type: - - "null" - - boolean - admin_id: - description: Unique identifier for the admin associated with the contact - attribute. - type: - - "null" - - string - created_at: - description: Timestamp of when the contact attribute was created. - type: - - "null" - - integer - updated_at: - description: Timestamp of when the contact attribute was last updated. - type: - - "null" - - integer - messenger_writable: - description: Indicates whether the attribute is writable via messenger. - type: - - "null" - - boolean - stream_semi_incremental: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400) }}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - segments: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400) }}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestPath - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference#list-segments" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The date and time when the segment was created - type: - - "null" - - integer - count: - description: The number of items in the segment - type: - - "null" - - integer - id: - description: Unique identifier for the segment - type: - - "null" - - string - name: - description: The name or title of the segment - type: - - "null" - - string - type: - description: The type or category of the segment - type: - - "null" - - string - person_type: - description: Type of persons included in the segment - type: - - "null" - - string - updated_at: - description: The date and time when the segment was last updated - type: - - "null" - - integer - companies: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400) }}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - description: " 400 - existing scroll_param, need to wait at least 60 sec - to continue and retry 500 - server-side error, should retry after 60 - sec. " - response_filters: - - http_codes: - - 400 - action: RETRY - failure_type: transient_error - error_message: "A scroll (export) job is already in progress for this - Intercom account, causing the request to fail. Only one active scroll - per Intercom account is allowed; ensure no overlap by limiting active - connections or scheduling jobs appropriately." - - http_codes: - - 500 - action: RETRY - failure_type: transient_error - backoff_strategies: - - type: ConstantBackoffStrategy - backoff_time_in_seconds: 60 - - type: DefaultErrorHandler - description: "404 - scroll_param is expired or not found while requesting, - ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('scroll_param') }}" - stop_condition: "{{ not response.get('data') }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestOption - field_name: scroll_param - inject_into: request_parameter - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: The type of the company - type: - - "null" - - string - company_id: - description: The unique identifier of the company - type: - - "null" - - string - id: - description: The ID of the company - type: - - "null" - - string - app_id: - description: The ID of the application associated with the company - type: - - "null" - - string - name: - description: The name of the company - type: - - "null" - - string - created_at: - description: The date and time when the company was created - type: - - "null" - - integer - updated_at: - description: The date and time when the company was last updated - type: - - "null" - - integer - monthly_spend: - description: The monthly spend of the company - type: - - "null" - - number - multipleOf: 0.00000001 - session_count: - description: The number of sessions related to the company - type: - - "null" - - integer - user_count: - description: The number of users associated with the company - type: - - "null" - - integer - size: - description: The size of the company - type: - - "null" - - integer - tags: - description: Tags associated with the company - type: object - properties: - type: - description: The type of tags associated with the company - type: string - tags: - description: List of tags - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the tag - type: string - name: - description: The name of the tag - type: string - id: - description: The ID of the tag - oneOf: - - type: - - "null" - - string - - type: - - "null" - - integer - segments: - description: Segments associated with the company - type: object - properties: - type: - description: The type of segments associated with the company - type: string - segments: - description: List of segments - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the segment - type: string - id: - description: The ID of the segment - type: string - plan: - description: Details of the company's subscription plan - type: - - "null" - - object - properties: - id: - description: The ID of the subscription plan - type: - - "null" - - string - name: - description: The name of the subscription plan - type: - - "null" - - string - type: - description: The type of the subscription plan - type: - - "null" - - string - custom_attributes: - description: Custom attributes specific to the company - type: - - "null" - - object - additionalProperties: true - industry: - description: The industry in which the company operates - type: - - "null" - - string - remote_created_at: - description: The remote date and time when the company was created - type: - - "null" - - integer - website: - description: The website of the company - type: - - "null" - - string - substream_semi_incremental: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "NoPagination" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - conversation_parts: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - field_path: - - "conversation_parts" - - "conversation_parts" - record_filter: - condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: DefaultErrorHandler - description: "404 - conversation is not found while requesting, ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - paginator: - type: "NoPagination" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - parent_stream_configs: - - type: ParentStreamConfig - stream: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "2.9" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue - using API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ - stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': - {{ next_page_token.get('next_page_token').get('page') }}, 'starting_after': - '{{ next_page_token.get('next_page_token').get('starting_after') - }}' }" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assignee: - description: The assigned user responsible for the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the assignee - type: - - "null" - - string - type: - description: The type of the assignee (e.g., admin, agent) - type: - - "null" - - string - name: - description: The name of the assignee - type: - - "null" - - string - email: - description: The email of the assignee - type: - - "null" - - string - source: - description: Source details of the conversation. - type: - - "null" - - object - properties: - type: - description: The type of the source - type: - - "null" - - string - id: - description: The ID of the source - type: - - "null" - - string - redacted: - description: Indicates if the source is redacted - type: - - "null" - - boolean - delivered_as: - description: The delivery status of the source - type: - - "null" - - string - subject: - description: The subject of the source - type: - - "null" - - string - body: - description: The body/content of the source - type: - - "null" - - string - author: - description: Author of the source. - type: - - "null" - - object - properties: - id: - description: The ID of the source author - type: - - "null" - - string - type: - description: The type of the source author (e.g., admin, - customer) - type: - - "null" - - string - name: - description: The name of the source author - type: - - "null" - - string - email: - description: The email of the source author - type: - - "null" - - string - attachments: - description: Attachments related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - additionalProperties: true - properties: {} - url: - description: The URL of the source - type: - - "null" - - string - contacts: - description: List of contacts involved in the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - type: - description: The type of the contact - type: - - "null" - - string - id: - description: The ID of the contact - type: - - "null" - - string - teammates: - description: List of teammates involved in the conversation. - type: - - "null" - - object - properties: - admins: - description: Admin teammates involved in the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - id: - description: The ID of the teammate admin - type: - - "null" - - string - type: - description: The type of the teammate (admin) - type: - - "null" - - string - type: - description: The type of teammates - type: - - "null" - - string - first_contact_reply: - description: Timestamp indicating when the first contact replied. - type: - - "null" - - object - properties: - type: - description: The type of the first contact reply - type: - - "null" - - string - url: - description: The URL of the first contact reply - type: - - "null" - - string - created_at: - description: The timestamp of the first contact's reply - type: - - "null" - - integer - custom_attributes: - description: Custom attributes associated with the conversation - type: - - "null" - - object - priority: - description: The priority level of the conversation - type: - - "null" - - string - conversation_message: - description: The main message content of the conversation. - type: - - "null" - - object - properties: - attachments: - description: Attachments in the conversation message - anyOf: - - type: array - items: - type: object - properties: - type: - type: - - "null" - - string - name: - type: - - "null" - - string - url: - type: - - "null" - - string - content_type: - type: - - "null" - - string - filesize: - type: - - "null" - - integer - height: - type: - - "null" - - integer - width: - type: - - "null" - - integer - - type: "null" - author: - description: The author of the conversation message. - type: - - "null" - - object - properties: - id: - description: The ID of the author of the message - type: - - "null" - - string - type: - description: The type of the author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the author of the message - type: - - "null" - - string - email: - description: The email of the author of the message - type: - - "null" - - string - body: - description: The body/content of the conversation message - type: - - "null" - - string - delivered_as: - description: The delivery status of the message - type: - - "null" - - string - id: - description: The ID of the conversation message - type: - - "null" - - string - subject: - description: The subject of the conversation message - type: - - "null" - - string - type: - description: The type of the conversation message - type: - - "null" - - string - url: - description: The URL of the conversation message - type: - - "null" - - string - conversation_rating: - description: Ratings given to the conversation by the customer and - teammate. - type: - - "null" - - object - properties: - created_at: - description: The timestamp when the rating was created - type: - - "null" - - integer - customer: - description: Rating given by the customer. - type: - - "null" - - object - properties: - id: - description: The ID of the customer who provided the rating - type: - - "null" - - string - type: - description: The type of the customer providing the rating - type: - - "null" - - string - rating: - description: The rating given to the conversation - type: - - "null" - - integer - remark: - description: Any remarks provided with the rating - type: - - "null" - - string - teammate: - description: Rating given by the teammate. - type: - - "null" - - object - properties: - id: - description: The ID of the teammate being rated - type: - - "null" - - integer - type: - description: The type of the teammate being rated - type: - - "null" - - string - created_at: - description: The timestamp when the conversation was created - type: - - "null" - - integer - customer_first_reply: - description: Timestamp indicating when the customer first replied. - type: - - "null" - - object - properties: - created_at: - description: The timestamp of the customer's first reply - type: - - "null" - - integer - type: - description: The type of the first customer reply - type: - - "null" - - string - url: - description: The URL of the first customer reply - type: - - "null" - - string - customers: - description: List of customers involved in the conversation - anyOf: - - type: array - items: - type: - - "null" - - object - properties: - id: - type: - - "null" - - string - type: - type: - - "null" - - string - - type: "null" - id: - description: The unique ID of the conversation - type: - - "null" - - string - open: - description: Indicates if the conversation is open or closed - type: - - "null" - - boolean - read: - description: Indicates if the conversation has been read - type: - - "null" - - boolean - sent_at: - description: The timestamp when the conversation was sent - type: - - "null" - - integer - snoozed_until: - description: Timestamp until the conversation is snoozed - type: - - "null" - - integer - sla_applied: - description: Service Level Agreement details applied to the conversation. - type: - - "null" - - object - properties: - sla_name: - description: The name of the SLA applied - type: - - "null" - - string - sla_status: - description: The status of the SLA applied - type: - - "null" - - string - state: - description: The state of the conversation (e.g., new, in progress) - type: - - "null" - - string - statistics: - description: Statistics related to the conversation. - type: - - "null" - - object - properties: - type: - description: The type of conversation statistics - type: - - "null" - - string - time_to_assignment: - description: Time taken for assignment - type: - - "null" - - integer - time_to_admin_reply: - description: Time taken to reply by admin - type: - - "null" - - integer - time_to_first_close: - description: Time taken to first close the conversation - type: - - "null" - - integer - time_to_last_close: - description: Time taken to last close the conversation - type: - - "null" - - integer - median_time_to_reply: - description: The median time taken to reply to the conversation - type: - - "null" - - integer - first_contact_reply_at: - description: Timestamp of the first contact reply - type: - - "null" - - integer - first_assignment_at: - description: Timestamp of the first assignment - type: - - "null" - - integer - first_admin_reply_at: - description: Timestamp of the first admin reply - type: - - "null" - - integer - first_close_at: - description: Timestamp of the first conversation close - type: - - "null" - - integer - last_assignment_at: - description: Timestamp of the last assignment - type: - - "null" - - integer - last_assignment_admin_reply_at: - description: Timestamp of the last assignment admin reply - type: - - "null" - - integer - last_contact_reply_at: - description: Timestamp of the last contact reply - type: - - "null" - - integer - last_admin_reply_at: - description: Timestamp of the last admin reply - type: - - "null" - - integer - last_close_at: - description: Timestamp of the last conversation close - type: - - "null" - - integer - last_closed_by_id: - description: The ID of the last user who closed the conversation - type: - - "null" - - integer - count_reopens: - description: The total count of conversation reopens - type: - - "null" - - integer - count_assignments: - description: The total count of assignments for the conversation - type: - - "null" - - integer - count_conversation_parts: - description: The total count of conversation parts - type: - - "null" - - integer - tags: - description: Tags applied to the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - applied_at: - description: Timestamp when the tag was applied - type: - - "null" - - integer - applied_by: - description: User who applied the tag. - type: - - "null" - - object - properties: - id: - description: The ID of the user who applied the tag - type: - - "null" - - string - type: - description: The type of the user who applied the tag - type: - - "null" - - string - id: - description: The ID of the tag - type: - - "null" - - string - name: - description: The name of the tag - type: - - "null" - - string - type: - description: The type of the tag - type: - - "null" - - string - type: - description: The type of the conversation - type: - - "null" - - string - updated_at: - description: The timestamp when the conversation was last updated - type: - - "null" - - integer - user: - description: The user related to the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the user associated with the conversation - type: - - "null" - - string - type: - description: The type of the user - type: - - "null" - - string - waiting_since: - description: Timestamp since waiting for a response - type: - - "null" - - integer - admin_assignee_id: - description: The ID of the administrator assigned to the conversation - type: - - "null" - - integer - title: - description: The title of the conversation - type: - - "null" - - string - team_assignee_id: - description: The ID of the team assigned to the conversation - type: - - "null" - - integer - redacted: - description: Indicates if the conversation is redacted - type: - - "null" - - boolean - topics: - description: Topics associated with the conversation. - type: - - "null" - - object - properties: - type: - description: The type of topics - type: - - "null" - - string - topics: - description: List of topics related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type of the topic - type: - - "null" - - string - id: - description: The ID of the topic - type: - - "null" - - integer - name: - description: The name of the topic - type: - - "null" - - string - total_count: - description: The total count of topics - type: - - "null" - - integer - parent_key: "id" - partition_field: "id" - transformations: - - type: AddFields - fields: - - path: - - "conversation_id" - value: "'{{ stream_slice.id }}'" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assigned_to: - description: The user or team member who is assigned to handle this conversation - part. - oneOf: - - type: object - properties: - type: - type: - - "null" - - string - id: - type: - - "null" - - string - - type: string - - type: "null" - attachments: - description: Represents the attachments associated with the conversation - part. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type or category of the attachment. - type: - - "null" - - string - name: - description: The filename or name of the attachment. - type: - - "null" - - string - url: - description: The URL or location where the attachment can be accessed. - type: - - "null" - - string - content_type: - description: The MIME type of the attachment content. - type: - - "null" - - string - filesize: - description: The size of the attachment file in bytes. - type: - - "null" - - integer - height: - description: The height dimension of the attachment in pixels. - type: - - "null" - - integer - width: - description: The width dimension of the attachment in pixels. - type: - - "null" - - integer - author: - description: Represents the author of the conversation part. - type: - - "null" - - object - properties: - id: - description: The unique identifier of the conversation author. - type: - - "null" - - string - type: - description: The type of author, such as customer or agent. - type: - - "null" - - string - name: - description: The name of the conversation author. - type: - - "null" - - string - email: - description: The email address of the conversation author. - type: - - "null" - - string - body: - description: The main content or message body of the conversation part. - type: - - "null" - - string - conversation_id: - description: The unique identifier of the conversation. - type: - - "null" - - string - conversation_created_at: - description: The date and time when the conversation was created. - type: - - "null" - - integer - conversation_updated_at: - description: The date and time when the conversation was last updated. - type: - - "null" - - integer - conversation_total_parts: - description: The total number of parts in the conversation. - type: - - "null" - - integer - created_at: - description: The date and time when the conversation part was created. - type: - - "null" - - integer - external_id: - description: An external identifier associated with the conversation part. - type: - - "null" - - string - id: - description: The unique identifier of the conversation part. - type: - - "null" - - string - notified_at: - description: The date and time when the conversation part was last notified. - type: - - "null" - - integer - part_type: - description: The type or category of the conversation part. - type: - - "null" - - string - type: - description: The type of conversation part, such as message or note. - type: - - "null" - - string - updated_at: - description: The date and time when the conversation part was last updated. - type: - - "null" - - integer - redacted: - description: Indicates if the conversation part has been redacted or censored. - type: - - "null" - - boolean - company_segments: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "NoPagination" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - parent_complete_fetch: true - parent_stream_configs: - - type: ParentStreamConfig - stream: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400) }}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - description: " 400 - existing scroll_param, need to wait at least - 60 sec to continue and retry 500 - server-side error, should retry - after 60 sec. " - response_filters: - - http_codes: - - 400 - action: RETRY - failure_type: transient_error - error_message: "A scroll (export) job is already in progress for - this Intercom account, causing the request to fail. Only one - active scroll per Intercom account is allowed; ensure no overlap - by limiting active connections or scheduling jobs appropriately." - - http_codes: - - 500 - action: RETRY - failure_type: transient_error - backoff_strategies: - - type: ConstantBackoffStrategy - backoff_time_in_seconds: 60 - - type: DefaultErrorHandler - description: "404 - scroll_param is expired or not found while requesting, - ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('scroll_param') }}" - stop_condition: "{{ not response.get('data') }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - page_token_option: - type: RequestOption - field_name: scroll_param - inject_into: request_parameter - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: The type of the company - type: - - "null" - - string - company_id: - description: The unique identifier of the company - type: - - "null" - - string - id: - description: The ID of the company - type: - - "null" - - string - app_id: - description: The ID of the application associated with the company - type: - - "null" - - string - name: - description: The name of the company - type: - - "null" - - string - created_at: - description: The date and time when the company was created - type: - - "null" - - integer - updated_at: - description: The date and time when the company was last updated - type: - - "null" - - integer - monthly_spend: - description: The monthly spend of the company - type: - - "null" - - number - multipleOf: 0.00000001 - session_count: - description: The number of sessions related to the company - type: - - "null" - - integer - user_count: - description: The number of users associated with the company - type: - - "null" - - integer - size: - description: The size of the company - type: - - "null" - - integer - tags: - description: Tags associated with the company - type: object - properties: - type: - description: The type of tags associated with the company - type: string - tags: - description: List of tags - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the tag - type: string - name: - description: The name of the tag - type: string - id: - description: The ID of the tag - oneOf: - - type: - - "null" - - string - - type: - - "null" - - integer - segments: - description: Segments associated with the company - type: object - properties: - type: - description: The type of segments associated with the company - type: string - segments: - description: List of segments - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the segment - type: string - id: - description: The ID of the segment - type: string - plan: - description: Details of the company's subscription plan - type: - - "null" - - object - properties: - id: - description: The ID of the subscription plan - type: - - "null" - - string - name: - description: The name of the subscription plan - type: - - "null" - - string - type: - description: The type of the subscription plan - type: - - "null" - - string - custom_attributes: - description: Custom attributes specific to the company - type: - - "null" - - object - additionalProperties: true - industry: - description: The industry in which the company operates - type: - - "null" - - string - remote_created_at: - description: The remote date and time when the company was created - type: - - "null" - - integer - website: - description: The website of the company - type: - - "null" - - string - parent_key: "id" - partition_field: "id" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The timestamp when the company segment was created. - type: - - "null" - - integer - count: - description: The count of company segments returned in the response. - type: - - "null" - - integer - id: - description: The unique identifier associated with the company segment. - type: - - "null" - - string - name: - description: The name of the company segment. - type: - - "null" - - string - type: - description: The category or type of the company segment. - type: - - "null" - - string - person_type: - description: The type of person associated with the company segment. - type: - - "null" - - string - updated_at: - description: The timestamp when the company segment was last updated. - type: - - "null" - - integer - stream_incremental_search: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') - }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ - next_page_token.get('next_page_token').get('page') }}, 'starting_after': - '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - contacts: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') - }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ - next_page_token.get('next_page_token').get('page') }}, 'starting_after': - '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: Type of contact. - type: - - "null" - - string - id: - description: The unique identifier of the contact. - type: - - "null" - - string - workspace_id: - description: The unique identifier of the workspace associated with the - contact. - type: - - "null" - - string - external_id: - description: External identifier for the contact. - type: - - "null" - - string - role: - description: Role or position of the contact. - type: - - "null" - - string - email: - description: The email address of the contact. - type: - - "null" - - string - phone: - description: The phone number of the contact. - type: - - "null" - - string - name: - description: The name of the contact. - type: - - "null" - - string - avatar: - description: URL pointing to the contact's avatar image. - type: - - "null" - - string - owner_id: - description: The unique identifier of the contact's owner. - type: - - "null" - - integer - social_profiles: - description: Social profiles associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of social profile connection. - type: - - "null" - - string - data: - description: Array of social profile data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of social profile. - type: - - "null" - - string - name: - description: Name of the social profile. - type: - - "null" - - string - url: - description: URL of the social profile. - type: - - "null" - - string - has_hard_bounced: - description: Flag indicating if the contact has hard bounced. - type: - - "null" - - boolean - marked_email_as_spam: - description: Flag indicating if the contact's email was marked as spam. - type: - - "null" - - boolean - unsubscribed_from_emails: - description: Flag indicating if the contact unsubscribed from emails. - type: - - "null" - - boolean - unsubscribed_from_sms: - description: Flag indicating if the contact unsubscribed from SMS. - type: - - "null" - - boolean - created_at: - description: The date and time when the contact was created. - type: - - "null" - - integer - updated_at: - description: The date and time when the contact was last updated. - type: - - "null" - - integer - signed_up_at: - description: The date and time when the contact signed up. - type: - - "null" - - integer - sms_consent: - description: Consent status for SMS communication. - type: - - "null" - - boolean - last_seen_at: - description: The date and time when the contact was last seen overall. - type: - - "null" - - integer - last_replied_at: - description: The date and time when the contact last replied. - type: - - "null" - - integer - last_contacted_at: - description: The date and time when the contact was last contacted. - type: - - "null" - - integer - last_email_opened_at: - description: The date and time when the contact last opened an email. - type: - - "null" - - integer - last_email_clicked_at: - description: The date and time when the contact last clicked an email. - type: - - "null" - - integer - language_override: - description: Language override set for the contact. - type: - - "null" - - string - browser: - description: The browser used by the contact. - type: - - "null" - - string - browser_version: - description: The version of the browser used by the contact. - type: - - "null" - - string - browser_language: - description: The language preference set in the contact's browser. - type: - - "null" - - string - os: - description: Operating system of the contact's device. - type: - - "null" - - string - location: - description: Location details of the contact. - type: - - "null" - - object - properties: - type: - description: Type of location. - type: - - "null" - - string - country: - description: Country of the contact's location. - type: - - "null" - - string - region: - description: Region of the contact's location. - type: - - "null" - - string - city: - description: City of the contact's location. - type: - - "null" - - string - continent_code: - description: Continent code of the contact's location. - type: - - "null" - - string - country_code: - description: Country code of the contact's location. - type: - - "null" - - string - android_app_name: - description: The name of the Android app associated with the contact. - type: - - "null" - - string - android_app_version: - description: The version of the Android app associated with the contact. - type: - - "null" - - string - android_device: - description: The device used by the contact for Android. - type: - - "null" - - string - android_os_version: - description: The operating system version of the Android device. - type: - - "null" - - string - android_sdk_version: - description: The SDK version of the Android device. - type: - - "null" - - string - android_last_seen_at: - description: The date and time when the contact was last seen on Android. - type: - - "null" - - string - format: date-time - ios_app_name: - description: The name of the iOS app associated with the contact. - type: - - "null" - - string - ios_app_version: - description: The version of the iOS app associated with the contact. - type: - - "null" - - string - ios_device: - description: The device used by the contact for iOS. - type: - - "null" - - string - ios_os_version: - description: The operating system version of the iOS device. - type: - - "null" - - string - ios_sdk_version: - description: The SDK version of the iOS device. - type: - - "null" - - string - ios_last_seen_at: - description: The date and time when the contact was last seen on iOS. - type: - - "null" - - integer - custom_attributes: - description: Custom attributes defined for the contact. - type: - - "null" - - object - additionalProperties: true - properties: {} - tags: - description: Tags associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the tags. - type: - - "null" - - string - data: - description: Array of tag data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of tag. - type: - - "null" - - string - id: - description: The unique identifier of the tag. - type: - - "null" - - string - url: - description: URL of the tag. - type: - - "null" - - string - url: - description: URL to access more tag information. - type: - - "null" - - string - total_count: - description: Total count of tags associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more tags to load. - type: - - "null" - - boolean - notes: - description: Notes associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the notes. - type: - - "null" - - string - data: - description: Array of note data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of note. - type: - - "null" - - string - id: - description: The unique identifier of the note. - type: - - "null" - - string - url: - description: URL of the note. - type: - - "null" - - string - url: - description: URL to access more note information. - type: - - "null" - - string - total_count: - description: Total count of notes associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more notes to load. - type: - - "null" - - boolean - companies: - description: Companies associated with the contact. - type: - - "null" - - object - properties: - type: - description: Type of connection with the companies. - type: - - "null" - - string - data: - description: Array of company data associated with the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of company. - type: - - "null" - - string - id: - description: The unique identifier of the company. - type: - - "null" - - string - url: - description: URL of the company. - type: - - "null" - - string - url: - description: URL to access more company information. - type: - - "null" - - string - total_count: - description: Total count of companies associated with the contact. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more companies to load. - type: - - "null" - - boolean - opted_out_subscription_types: - description: Subscription types the contact opted out from. - type: - - "null" - - object - properties: - type: - description: Type of connection with the subscription types. - type: - - "null" - - string - data: - description: Array of subscription type data opted out from by the - contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of subscription. - type: - - "null" - - string - id: - description: The unique identifier of the subscription type. - type: - - "null" - - string - url: - description: URL of the subscription type. - type: - - "null" - - string - url: - description: URL to access more subscription type information. - type: - - "null" - - string - total_count: - description: Total count of subscription types the contact opted out - from. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more subscription types - to load. - type: - - "null" - - boolean - opted_in_subscription_types: - description: Subscription types the contact opted into. - type: - - "null" - - object - properties: - type: - description: Type of connection with the subscription types. - type: - - "null" - - string - data: - description: Array of subscription type data opted into by the contact. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: Type of subscription. - type: - - "null" - - string - id: - description: The unique identifier of the subscription type. - type: - - "null" - - string - url: - description: URL of the subscription type. - type: - - "null" - - string - url: - description: URL to access more subscription type information. - type: - - "null" - - string - total_count: - description: Total count of subscription types the contact opted into. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more subscription types - to load. - type: - - "null" - - boolean - utm_content: - description: Content data from UTM parameters. - type: - - "null" - - string - utm_campaign: - description: Campaign data from UTM parameters. - type: - - "null" - - string - utm_source: - description: Source data from UTM parameters. - type: - - "null" - - string - referrer: - description: Referrer information related to the contact. - type: - - "null" - - string - utm_term: - description: Term data from UTM parameters. - type: - - "null" - - string - utm_medium: - description: Medium data from UTM parameters. - type: - - "null" - - string - conversations: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400)}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "2.9" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') - }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ - next_page_token.get('next_page_token').get('page') }}, 'starting_after': - '{{ next_page_token.get('next_page_token').get('starting_after') }}' }" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assignee: - description: The assigned user responsible for the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the assignee - type: - - "null" - - string - type: - description: The type of the assignee (e.g., admin, agent) - type: - - "null" - - string - name: - description: The name of the assignee - type: - - "null" - - string - email: - description: The email of the assignee - type: - - "null" - - string - source: - description: Source details of the conversation. - type: - - "null" - - object - properties: - type: - description: The type of the source - type: - - "null" - - string - id: - description: The ID of the source - type: - - "null" - - string - redacted: - description: Indicates if the source is redacted - type: - - "null" - - boolean - delivered_as: - description: The delivery status of the source - type: - - "null" - - string - subject: - description: The subject of the source - type: - - "null" - - string - body: - description: The body/content of the source - type: - - "null" - - string - author: - description: Author of the source. - type: - - "null" - - object - properties: - id: - description: The ID of the source author - type: - - "null" - - string - type: - description: The type of the source author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the source author - type: - - "null" - - string - email: - description: The email of the source author - type: - - "null" - - string - attachments: - description: Attachments related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - additionalProperties: true - properties: {} - url: - description: The URL of the source - type: - - "null" - - string - contacts: - description: List of contacts involved in the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - type: - description: The type of the contact - type: - - "null" - - string - id: - description: The ID of the contact - type: - - "null" - - string - teammates: - description: List of teammates involved in the conversation. - type: - - "null" - - object - properties: - admins: - description: Admin teammates involved in the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - id: - description: The ID of the teammate admin - type: - - "null" - - string - type: - description: The type of the teammate (admin) - type: - - "null" - - string - type: - description: The type of teammates - type: - - "null" - - string - first_contact_reply: - description: Timestamp indicating when the first contact replied. - type: - - "null" - - object - properties: - type: - description: The type of the first contact reply - type: - - "null" - - string - url: - description: The URL of the first contact reply - type: - - "null" - - string - created_at: - description: The timestamp of the first contact's reply - type: - - "null" - - integer - custom_attributes: - description: Custom attributes associated with the conversation - type: - - "null" - - object - priority: - description: The priority level of the conversation - type: - - "null" - - string - conversation_message: - description: The main message content of the conversation. - type: - - "null" - - object - properties: - attachments: - description: Attachments in the conversation message - anyOf: - - type: array - items: - type: object - properties: - type: - type: - - "null" - - string - name: - type: - - "null" - - string - url: - type: - - "null" - - string - content_type: - type: - - "null" - - string - filesize: - type: - - "null" - - integer - height: - type: - - "null" - - integer - width: - type: - - "null" - - integer - - type: "null" - author: - description: The author of the conversation message. - type: - - "null" - - object - properties: - id: - description: The ID of the author of the message - type: - - "null" - - string - type: - description: The type of the author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the author of the message - type: - - "null" - - string - email: - description: The email of the author of the message - type: - - "null" - - string - body: - description: The body/content of the conversation message - type: - - "null" - - string - delivered_as: - description: The delivery status of the message - type: - - "null" - - string - id: - description: The ID of the conversation message - type: - - "null" - - string - subject: - description: The subject of the conversation message - type: - - "null" - - string - type: - description: The type of the conversation message - type: - - "null" - - string - url: - description: The URL of the conversation message - type: - - "null" - - string - conversation_rating: - description: Ratings given to the conversation by the customer and teammate. - type: - - "null" - - object - properties: - created_at: - description: The timestamp when the rating was created - type: - - "null" - - integer - customer: - description: Rating given by the customer. - type: - - "null" - - object - properties: - id: - description: The ID of the customer who provided the rating - type: - - "null" - - string - type: - description: The type of the customer providing the rating - type: - - "null" - - string - rating: - description: The rating given to the conversation - type: - - "null" - - integer - remark: - description: Any remarks provided with the rating - type: - - "null" - - string - teammate: - description: Rating given by the teammate. - type: - - "null" - - object - properties: - id: - description: The ID of the teammate being rated - type: - - "null" - - integer - type: - description: The type of the teammate being rated - type: - - "null" - - string - created_at: - description: The timestamp when the conversation was created - type: - - "null" - - integer - customer_first_reply: - description: Timestamp indicating when the customer first replied. - type: - - "null" - - object - properties: - created_at: - description: The timestamp of the customer's first reply - type: - - "null" - - integer - type: - description: The type of the first customer reply - type: - - "null" - - string - url: - description: The URL of the first customer reply - type: - - "null" - - string - customers: - description: List of customers involved in the conversation - anyOf: - - type: array - items: - type: - - "null" - - object - properties: - id: - type: - - "null" - - string - type: - type: - - "null" - - string - - type: "null" - id: - description: The unique ID of the conversation - type: - - "null" - - string - open: - description: Indicates if the conversation is open or closed - type: - - "null" - - boolean - read: - description: Indicates if the conversation has been read - type: - - "null" - - boolean - sent_at: - description: The timestamp when the conversation was sent - type: - - "null" - - integer - snoozed_until: - description: Timestamp until the conversation is snoozed - type: - - "null" - - integer - sla_applied: - description: Service Level Agreement details applied to the conversation. - type: - - "null" - - object - properties: - sla_name: - description: The name of the SLA applied - type: - - "null" - - string - sla_status: - description: The status of the SLA applied - type: - - "null" - - string - state: - description: The state of the conversation (e.g., new, in progress) - type: - - "null" - - string - statistics: - description: Statistics related to the conversation. - type: - - "null" - - object - properties: - type: - description: The type of conversation statistics - type: - - "null" - - string - time_to_assignment: - description: Time taken for assignment - type: - - "null" - - integer - time_to_admin_reply: - description: Time taken to reply by admin - type: - - "null" - - integer - time_to_first_close: - description: Time taken to first close the conversation - type: - - "null" - - integer - time_to_last_close: - description: Time taken to last close the conversation - type: - - "null" - - integer - median_time_to_reply: - description: The median time taken to reply to the conversation - type: - - "null" - - integer - first_contact_reply_at: - description: Timestamp of the first contact reply - type: - - "null" - - integer - first_assignment_at: - description: Timestamp of the first assignment - type: - - "null" - - integer - first_admin_reply_at: - description: Timestamp of the first admin reply - type: - - "null" - - integer - first_close_at: - description: Timestamp of the first conversation close - type: - - "null" - - integer - last_assignment_at: - description: Timestamp of the last assignment - type: - - "null" - - integer - last_assignment_admin_reply_at: - description: Timestamp of the last assignment admin reply - type: - - "null" - - integer - last_contact_reply_at: - description: Timestamp of the last contact reply - type: - - "null" - - integer - last_admin_reply_at: - description: Timestamp of the last admin reply - type: - - "null" - - integer - last_close_at: - description: Timestamp of the last conversation close - type: - - "null" - - integer - last_closed_by_id: - description: The ID of the last user who closed the conversation - type: - - "null" - - integer - count_reopens: - description: The total count of conversation reopens - type: - - "null" - - integer - count_assignments: - description: The total count of assignments for the conversation - type: - - "null" - - integer - count_conversation_parts: - description: The total count of conversation parts - type: - - "null" - - integer - tags: - description: Tags applied to the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - applied_at: - description: Timestamp when the tag was applied - type: - - "null" - - integer - applied_by: - description: User who applied the tag. - type: - - "null" - - object - properties: - id: - description: The ID of the user who applied the tag - type: - - "null" - - string - type: - description: The type of the user who applied the tag - type: - - "null" - - string - id: - description: The ID of the tag - type: - - "null" - - string - name: - description: The name of the tag - type: - - "null" - - string - type: - description: The type of the tag - type: - - "null" - - string - type: - description: The type of the conversation - type: - - "null" - - string - updated_at: - description: The timestamp when the conversation was last updated - type: - - "null" - - integer - user: - description: The user related to the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the user associated with the conversation - type: - - "null" - - string - type: - description: The type of the user - type: - - "null" - - string - waiting_since: - description: Timestamp since waiting for a response - type: - - "null" - - integer - admin_assignee_id: - description: The ID of the administrator assigned to the conversation - type: - - "null" - - integer - title: - description: The title of the conversation - type: - - "null" - - string - team_assignee_id: - description: The ID of the team assigned to the conversation - type: - - "null" - - integer - redacted: - description: Indicates if the conversation is redacted - type: - - "null" - - boolean - topics: - description: Topics associated with the conversation. - type: - - "null" - - object - properties: - type: - description: The type of topics - type: - - "null" - - string - topics: - description: List of topics related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type of the topic - type: - - "null" - - string - id: - description: The ID of the topic - type: - - "null" - - integer - name: - description: The name of the topic - type: - - "null" - - string - total_count: - description: The total count of topics - type: - - "null" - - integer - activity_logs: - retriever: - description: "The Retriever without passing page size option" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue using - API." - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_token_option: - type: RequestPath - primary_key: id - incremental_sync: - type: DatetimeBasedCursor - cursor_field: created_at - cursor_datetime_formats: - - "%s" - datetime_format: "%s" - lookback_window: "P{{ config.get('lookback_window', 0) }}D" - cursor_granularity: "PT1S" - step: "P{{ config.get('activity_logs_time_step', 30) }}D" - start_datetime: - datetime: "{{ config['start_date'] }}" - datetime_format: "%Y-%m-%dT%H:%M:%SZ" - end_time_option: - field_name: "created_at_before" - inject_into: "request_parameter" - start_time_option: - field_name: "created_at_after" - inject_into: "request_parameter" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - performed_by: - description: The user who performed the activity - type: - - "null" - - object - properties: - id: - description: Unique identifier of the user who performed the activity - type: - - "null" - - string - type: - description: Type of the user who performed the activity (e.g., admin, - user) - type: - - "null" - - string - ip: - description: IP address from where the activity was performed - type: - - "null" - - string - email: - description: Email of the user who performed the activity - type: - - "null" - - string - id: - description: Unique identifier for the activity log entry - type: - - "null" - - string - metadata: - description: Additional data or information related to the activity - type: - - "null" - - object - activity_type: - description: The type or category of the activity - type: - - "null" - - string - activity_description: - description: A description of the activity that took place - type: - - "null" - - string - created_at: - description: The timestamp when the activity occurred - type: - - "null" - - integer -streams: -- retriever: - description: "The Retriever without passing page size option" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "admins/activity_logs" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_token_option: - type: RequestPath - type: SimpleRetriever - primary_key: id - incremental_sync: - type: DatetimeBasedCursor - cursor_field: created_at - cursor_datetime_formats: - - "%s" - datetime_format: "%s" - lookback_window: "P{{ config.get('lookback_window', 0) }}D" - cursor_granularity: "PT1S" - step: "P{{ config.get('activity_logs_time_step', 30) }}D" - start_datetime: - datetime: "{{ config['start_date'] }}" - datetime_format: "%Y-%m-%dT%H:%M:%SZ" - type: MinMaxDatetime - end_time_option: - field_name: "created_at_before" - inject_into: "request_parameter" - type: RequestOption - start_time_option: - field_name: "created_at_after" - inject_into: "request_parameter" - type: RequestOption - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - performed_by: - description: The user who performed the activity - type: - - "null" - - object - properties: - id: - description: Unique identifier of the user who performed the activity - type: - - "null" - - string - type: - description: Type of the user who performed the activity (e.g., admin, - user) - type: - - "null" - - string - ip: - description: IP address from where the activity was performed - type: - - "null" - - string - email: - description: Email of the user who performed the activity - type: - - "null" - - string - id: - description: Unique identifier for the activity log entry - type: - - "null" - - string - metadata: - description: Additional data or information related to the activity - type: - - "null" - - object - activity_type: - description: The type or category of the activity - type: - - "null" - - string - activity_description: - description: A description of the activity that took place - type: + - "null" + - string + description: IP address from where the activity was performed + admins: + type: object + additionalProperties: true + properties: + type: + type: - "null" - string - created_at: - description: The timestamp when the activity occurred - type: - - "null" - - integer - type: DeclarativeStream - name: "activity_logs" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "admins" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference#list-admins" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of unique identifiers for admins - anyOf: + description: Type of the admin (e.g., full-time, part-time) + admin_ids: + description: Array of unique identifiers for admins + anyOf: - type: array items: type: integer - type: "null" - avatar: - description: Admin avatar details - type: + avatar: + type: - "null" - object - properties: - image_url: - description: URL of the admin's avatar image - type: + description: Admin avatar details + properties: + image_url: + type: - "null" - string - away_mode_enabled: - description: Flag indicating if away mode is enabled for the admin - type: + description: URL of the admin's avatar image + away_mode_enabled: + type: - "null" - boolean - away_mode_reassign: - description: Flag indicating if away mode reassignment is enabled for the - admin - type: + description: Flag indicating if away mode is enabled for the admin + away_mode_reassign: + type: - "null" - boolean - email: - description: Email address of the admin - type: + description: Flag indicating if away mode reassignment is enabled for the admin + email: + type: - "null" - string - has_inbox_seat: - description: Flag indicating if the admin has a seat in the inbox - type: + description: Email address of the admin + has_inbox_seat: + type: - "null" - boolean - id: - description: Unique identifier for the admin - type: + description: Flag indicating if the admin has a seat in the inbox + id: + type: - "null" - string - job_title: - description: Job title of the admin - type: + description: Unique identifier for the admin + job_title: + type: - "null" - string - name: - description: Name of the admin - type: + description: Job title of the admin + name: + type: - "null" - string - team_ids: - description: Array of team identifiers the admin belongs to - anyOf: + description: Name of the admin + team_ids: + description: Array of team identifiers the admin belongs to + anyOf: - type: array items: type: integer - type: "null" + team_priority_level: type: - description: Type of the admin (e.g., full-time, part-time) - type: - - "null" - - string - team_priority_level: - description: Detailed team priority level information for the admin - type: - "null" - object - properties: - primary_team_ids: - description: Array of primary team identifiers for the admin - type: + description: Detailed team priority level information for the admin + properties: + primary_team_ids: + type: - "null" - array - items: - type: + description: Array of primary team identifiers for the admin + items: + type: - "null" - integer - secondary_team_ids: - description: Array of secondary team identifiers for the admin - type: + secondary_team_ids: + type: - "null" - array - items: - type: + description: Array of secondary team identifiers for the admin + items: + type: - "null" - integer - type: DeclarativeStream - name: "admins" - primary_key: "id" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "tags" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference#list-tags-for-an-app" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique identifier for the tag. - type: + tags: + type: object + additionalProperties: true + properties: + type: + type: - "null" - string - name: - description: Name of the tag used for identification. - type: + description: Type of the tag indicating its purpose or category. + id: + type: - "null" - string + description: Unique identifier for the tag. + name: + type: + - "null" + - string + description: Name of the tag used for identification. + teams: + type: object + additionalProperties: true + properties: + type: type: - description: Type of the tag indicating its purpose or category. - type: - "null" - string - type: DeclarativeStream - name: "tags" - primary_key: "name" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "teams" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference#list-teams" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - admin_ids: - description: Array of user IDs representing the admins of the team. - anyOf: + description: Type of team (e.g., 'internal', 'external'). + admin_ids: + description: Array of user IDs representing the admins of the team. + anyOf: - type: array items: type: integer - type: "null" - id: - description: Unique identifier for the team. - type: + id: + type: - "null" - string - name: - description: Name of the team. - type: + description: Unique identifier for the team. + name: + type: - "null" - string + description: Name of the team. + segments: + type: object + additionalProperties: true + properties: + type: type: - description: Type of team (e.g., 'internal', 'external'). - type: - "null" - string - type: DeclarativeStream - name: "teams" - primary_key: "name" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400) - }}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "segments" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference#list-segments" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The date and time when the segment was created - type: + description: The type or category of the segment + count: + type: - "null" - integer - count: - description: The number of items in the segment - type: + description: The number of items in the segment + created_at: + type: - "null" - integer - id: - description: Unique identifier for the segment - type: - - "null" - - string - name: - description: The name or title of the segment - type: + description: The date and time when the segment was created + id: + type: - "null" - string + description: Unique identifier for the segment + name: type: - description: The type or category of the segment - type: - "null" - string - person_type: - description: Type of persons included in the segment - type: + description: The name or title of the segment + person_type: + type: - "null" - string - updated_at: - description: The date and time when the segment was last updated - type: + description: Type of persons included in the segment + updated_at: + type: - "null" - integer - type: DeclarativeStream - name: "segments" - primary_key: "id" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400) - }}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - description: " 400 - existing scroll_param, need to wait at least 60 sec - to continue and retry 500 - server-side error, should retry after 60 sec. " - response_filters: - - http_codes: - - 400 - action: RETRY - failure_type: transient_error - error_message: "A scroll (export) job is already in progress for this - Intercom account, causing the request to fail. Only one active scroll - per Intercom account is allowed; ensure no overlap by limiting active - connections or scheduling jobs appropriately." - type: HttpResponseFilter - - http_codes: - - 500 - action: RETRY - failure_type: transient_error - type: HttpResponseFilter - backoff_strategies: - - type: ConstantBackoffStrategy - backoff_time_in_seconds: 60 - - type: DefaultErrorHandler - description: "404 - scroll_param is expired or not found while requesting, - ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - type: HttpResponseFilter - path: "companies/scroll" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('scroll_param') }}" - stop_condition: "{{ not response.get('data') }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestOption - field_name: scroll_param - inject_into: request_parameter - type: SimpleRetriever - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: The type of the company - type: + description: The date and time when the segment was last updated + companies: + type: object + additionalProperties: true + properties: + type: + type: - "null" - string - company_id: - description: The unique identifier of the company - type: + description: The type of the company + app_id: + type: - "null" - string - id: - description: The ID of the company - type: + description: The ID of the application associated with the company + company_id: + type: - "null" - string - app_id: - description: The ID of the application associated with the company - type: + description: The unique identifier of the company + created_at: + type: - "null" - - string - name: - description: The name of the company - type: + - integer + description: The date and time when the company was created + custom_attributes: + type: - "null" - - string - created_at: - description: The date and time when the company was created - type: + - object + description: Custom attributes specific to the company + additionalProperties: true + id: + type: - "null" - - integer - updated_at: - description: The date and time when the company was last updated - type: + - string + description: The ID of the company + industry: + type: - "null" - - integer - monthly_spend: - description: The monthly spend of the company - type: + - string + description: The industry in which the company operates + monthly_spend: + type: - "null" - number - multipleOf: 0.00000001 - session_count: - description: The number of sessions related to the company - type: + description: The monthly spend of the company + multipleOf: 1.e-8 + name: + type: - "null" - - integer - user_count: - description: The number of users associated with the company - type: + - string + description: The name of the company + plan: + type: - "null" - - integer - size: - description: The size of the company + - object + description: Details of the company's subscription plan + properties: type: - - "null" - - integer - tags: - description: Tags associated with the company - type: object - properties: - type: - description: The type of tags associated with the company - type: string - tags: - description: List of tags - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the tag - type: string - name: - description: The name of the tag - type: string - id: - description: The ID of the tag - oneOf: - - type: - - "null" - - string - - type: - - "null" - - integer - segments: - description: Segments associated with the company - type: object - properties: type: - description: The type of segments associated with the company - type: string - segments: - description: List of segments - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the segment - type: string - id: - description: The ID of the segment - type: string - plan: - description: Details of the company's subscription plan - type: - - "null" - - object - properties: - id: - description: The ID of the subscription plan - type: - "null" - string - name: - description: The name of the subscription plan - type: + description: The type of the subscription plan + id: + type: - "null" - string + description: The ID of the subscription plan + name: type: - description: The type of the subscription plan - type: - "null" - string - custom_attributes: - description: Custom attributes specific to the company - type: + description: The name of the subscription plan + remote_created_at: + type: - "null" - - object - additionalProperties: true - industry: - description: The industry in which the company operates + - integer + description: The remote date and time when the company was created + segments: + type: object + description: Segments associated with the company + properties: type: + type: string + description: The type of segments associated with the company + segments: + type: array + description: List of segments + items: + type: + - "null" + - object + properties: + type: + type: string + description: The type of the segment + id: + type: string + description: The ID of the segment + session_count: + type: - "null" - - string - remote_created_at: - description: The remote date and time when the company was created - type: + - integer + description: The number of sessions related to the company + size: + type: - "null" - integer - website: - description: The website of the company + description: The size of the company + tags: + type: object + description: Tags associated with the company + properties: type: + type: string + description: The type of tags associated with the company + tags: + type: array + description: List of tags + items: + type: + - "null" + - object + properties: + type: + type: string + description: The type of the tag + id: + description: The ID of the tag + oneOf: + - type: + - "null" + - string + - type: + - "null" + - integer + name: + type: string + description: The name of the tag + updated_at: + type: - "null" - - string - type: DeclarativeStream - name: "companies" - primary_key: "id" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - request_parameters: - model: "{{ parameters.get('model') }}" - path: "data_attributes" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique ID assigned to the company attribute. - type: + - integer + description: The date and time when the company was last updated + user_count: + type: - "null" - integer - admin_id: - description: The ID of the admin user associated with the company. - type: + description: The number of users associated with the company + website: + type: - "null" - string - api_writable: - description: Indicates whether the field is writable through the API. - type: + description: The website of the company + company_attributes: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: Type of data structure for the company attribute. + description: + type: + - "null" + - string + description: Description or details about the company attribute. + admin_id: + type: + - "null" + - string + description: The ID of the admin user associated with the company. + api_writable: + type: - "null" - boolean - archived: - description: Flag to indicate if the company data is archived. - type: + description: Indicates whether the field is writable through the API. + archived: + type: - "null" - boolean - created_at: - description: Timestamp when the company data was created. - type: + description: Flag to indicate if the company data is archived. + created_at: + type: - "null" - integer - custom: - description: Custom attribute specific to the company. - type: + description: Timestamp when the company data was created. + custom: + type: - "null" - boolean - data_type: - description: Type of data stored in the attribute field. - type: + description: Custom attribute specific to the company. + data_type: + type: - "null" - string - description: - description: Description or details about the company attribute. - type: + description: Type of data stored in the attribute field. + full_name: + type: - "null" - string - full_name: - description: Full name associated with the company. - type: + description: Full name associated with the company. + id: + type: + - "null" + - integer + description: Unique ID assigned to the company attribute. + label: + type: - "null" - string - label: - description: Label or display name for the company attribute. - type: + description: Label or display name for the company attribute. + messenger_writable: + type: + - "null" + - boolean + description: Indicates whether the field is writable through the messenger. + model: + type: - "null" - string - model: - description: Model or schema used for storing the company attribute. - type: + description: Model or schema used for storing the company attribute. + name: + type: + - "null" + - string + description: Name of the company attribute. + options: + description: Available options or values for the company attribute. + anyOf: + - type: array + items: + type: string + - type: "null" + ui_writable: + type: + - "null" + - boolean + description: Indicates whether the field is writable through the UI. + updated_at: + type: + - "null" + - integer + description: Timestamp when the company data was last updated. + contact_attributes: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: The type of contact attribute (e.g., text, number, boolean). + description: + type: - "null" - string - name: - description: Name of the company attribute. - type: + description: Description of the contact attribute for better understanding. + admin_id: + type: - "null" - string - options: - description: Available options or values for the company attribute. - anyOf: - - type: array - items: - type: string - - type: "null" + description: Unique identifier for the admin associated with the contact attribute. + api_writable: type: - description: Type of data structure for the company attribute. - type: - "null" - - string - ui_writable: - description: Indicates whether the field is writable through the UI. - type: + - boolean + description: Indicates whether the attribute is writable via API. + archived: + type: - "null" - boolean - updated_at: - description: Timestamp when the company data was last updated. - type: + description: Flag to signify if the contact attribute is archived. + created_at: + type: - "null" - integer - messenger_writable: - description: Indicates whether the field is writable through the messenger. - type: + description: Timestamp of when the contact attribute was created. + custom: + type: - "null" - boolean - type: DeclarativeStream - name: "company_attributes" - primary_key: "name" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - request_parameters: - model: "{{ parameters.get('model') }}" - path: "data_attributes" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestPath - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference#list-data-attributes" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - id: - description: Unique identifier for the contact attribute. - type: - - "null" - - integer + description: Indicates if the attribute is a custom user-defined field. + data_type: type: - description: The type of contact attribute (e.g., text, number, boolean). - type: - "null" - string - model: - description: Model to which the contact attribute is associated. - type: + description: The data type of the contact attribute value. + full_name: + type: - "null" - string - name: - description: The name of the contact attribute. - type: + description: The full name associated with the contact attribute. + id: + type: - "null" - - string - full_name: - description: The full name associated with the contact attribute. - type: + - integer + description: Unique identifier for the contact attribute. + label: + type: - "null" - string - label: - description: Label representing the attribute in user interfaces. - type: + description: Label representing the attribute in user interfaces. + messenger_writable: + type: - "null" - - string - description: - description: Description of the contact attribute for better understanding. - type: + - boolean + description: Indicates whether the attribute is writable via messenger. + model: + type: - "null" - string - data_type: - description: The data type of the contact attribute value. - type: + description: Model to which the contact attribute is associated. + name: + type: - "null" - string - options: - description: List of available options for the attribute. - type: + description: The name of the contact attribute. + options: + type: - "null" - array - items: - type: + description: List of available options for the attribute. + items: + type: - "null" - string - api_writable: - description: Indicates whether the attribute is writable via API. - type: - - "null" - - boolean - ui_writable: - description: Indicates whether the attribute is writable via user interface. - type: - - "null" - - boolean - custom: - description: Indicates if the attribute is a custom user-defined field. - type: - - "null" - - boolean - archived: - description: Flag to signify if the contact attribute is archived. - type: + ui_writable: + type: - "null" - boolean - admin_id: - description: Unique identifier for the admin associated with the contact - attribute. - type: - - "null" - - string - created_at: - description: Timestamp of when the contact attribute was created. - type: - - "null" - - integer - updated_at: - description: Timestamp of when the contact attribute was last updated. - type: + description: Indicates whether the attribute is writable via user interface. + updated_at: + type: - "null" - integer - messenger_writable: - description: Indicates whether the attribute is writable via messenger. - type: + description: Timestamp of when the contact attribute was last updated. + contacts: + type: object + additionalProperties: true + properties: + type: + type: - "null" - - boolean - type: DeclarativeStream - name: "contact_attributes" - primary_key: "name" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400)}}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} - }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') - }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') - }}' }" - path: "contacts/search" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: Type of contact. - type: + - string + description: Type of contact. + android_app_name: + type: - "null" - string - id: - description: The unique identifier of the contact. - type: + description: The name of the Android app associated with the contact. + android_app_version: + type: - "null" - string - workspace_id: - description: The unique identifier of the workspace associated with the - contact. - type: + description: The version of the Android app associated with the contact. + android_device: + type: - "null" - string - external_id: - description: External identifier for the contact. - type: + description: The device used by the contact for Android. + android_last_seen_at: + type: - "null" - string - role: - description: Role or position of the contact. - type: + description: The date and time when the contact was last seen on Android. + format: date-time + android_os_version: + type: - "null" - string - email: - description: The email address of the contact. - type: + description: The operating system version of the Android device. + android_sdk_version: + type: - "null" - string - phone: - description: The phone number of the contact. - type: + description: The SDK version of the Android device. + avatar: + type: - "null" - string - name: - description: The name of the contact. - type: + description: URL pointing to the contact's avatar image. + browser: + type: - "null" - string - avatar: - description: URL pointing to the contact's avatar image. - type: + description: The browser used by the contact. + browser_language: + type: - "null" - string - owner_id: - description: The unique identifier of the contact's owner. - type: + description: The language preference set in the contact's browser. + browser_version: + type: - "null" - - integer - social_profiles: - description: Social profiles associated with the contact. - type: + - string + description: The version of the browser used by the contact. + companies: + type: - "null" - object - properties: + description: Companies associated with the contact. + properties: + type: type: - description: Type of social profile connection. - type: - "null" - string - data: - description: Array of social profile data associated with the contact. - type: + description: Type of connection with the companies. + data: + type: - "null" - array - items: - type: + description: Array of company data associated with the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of social profile. - type: - "null" - string - name: - description: Name of the social profile. - type: + description: Type of company. + id: + type: - "null" - string - url: - description: URL of the social profile. - type: + description: The unique identifier of the company. + url: + type: - "null" - string - has_hard_bounced: - description: Flag indicating if the contact has hard bounced. - type: - - "null" - - boolean - marked_email_as_spam: - description: Flag indicating if the contact's email was marked as spam. - type: - - "null" - - boolean - unsubscribed_from_emails: - description: Flag indicating if the contact unsubscribed from emails. - type: - - "null" - - boolean - unsubscribed_from_sms: - description: Flag indicating if the contact unsubscribed from SMS. - type: - - "null" - - boolean - created_at: - description: The date and time when the contact was created. - type: + description: URL of the company. + has_more: + type: + - "null" + - boolean + description: Flag indicating if there are more companies to load. + total_count: + type: + - "null" + - integer + description: Total count of companies associated with the contact. + url: + type: + - "null" + - string + description: URL to access more company information. + created_at: + type: - "null" - integer - updated_at: - description: The date and time when the contact was last updated. - type: + description: The date and time when the contact was created. + custom_attributes: + type: - "null" - - integer - signed_up_at: - description: The date and time when the contact signed up. - type: + - object + description: Custom attributes defined for the contact. + additionalProperties: true + properties: {} + email: + type: - "null" - - integer - sms_consent: - description: Consent status for SMS communication. - type: + - string + description: The email address of the contact. + external_id: + type: + - "null" + - string + description: External identifier for the contact. + has_hard_bounced: + type: - "null" - boolean - last_seen_at: - description: The date and time when the contact was last seen overall. - type: + description: Flag indicating if the contact has hard bounced. + id: + type: - "null" - - integer - last_replied_at: - description: The date and time when the contact last replied. - type: + - string + description: The unique identifier of the contact. + ios_app_name: + type: - "null" - - integer - last_contacted_at: - description: The date and time when the contact was last contacted. - type: + - string + description: The name of the iOS app associated with the contact. + ios_app_version: + type: - "null" - - integer - last_email_opened_at: - description: The date and time when the contact last opened an email. - type: + - string + description: The version of the iOS app associated with the contact. + ios_device: + type: - "null" - - integer - last_email_clicked_at: - description: The date and time when the contact last clicked an email. - type: + - string + description: The device used by the contact for iOS. + ios_last_seen_at: + type: - "null" - integer - language_override: - description: Language override set for the contact. - type: + description: The date and time when the contact was last seen on iOS. + ios_os_version: + type: - "null" - string - browser: - description: The browser used by the contact. - type: + description: The operating system version of the iOS device. + ios_sdk_version: + type: - "null" - string - browser_version: - description: The version of the browser used by the contact. - type: + description: The SDK version of the iOS device. + language_override: + type: - "null" - string - browser_language: - description: The language preference set in the contact's browser. - type: + description: Language override set for the contact. + last_contacted_at: + type: - "null" - - string - os: - description: Operating system of the contact's device. - type: + - integer + description: The date and time when the contact was last contacted. + last_email_clicked_at: + type: - "null" - - string - location: - description: Location details of the contact. - type: + - integer + description: The date and time when the contact last clicked an email. + last_email_opened_at: + type: + - "null" + - integer + description: The date and time when the contact last opened an email. + last_replied_at: + type: + - "null" + - integer + description: The date and time when the contact last replied. + last_seen_at: + type: + - "null" + - integer + description: The date and time when the contact was last seen overall. + location: + type: - "null" - object - properties: + description: Location details of the contact. + properties: + type: type: - description: Type of location. - type: - "null" - string - country: - description: Country of the contact's location. - type: + description: Type of location. + city: + type: - "null" - string - region: - description: Region of the contact's location. - type: + description: City of the contact's location. + continent_code: + type: - "null" - string - city: - description: City of the contact's location. - type: + description: Continent code of the contact's location. + country: + type: - "null" - string - continent_code: - description: Continent code of the contact's location. - type: + description: Country of the contact's location. + country_code: + type: - "null" - string - country_code: - description: Country code of the contact's location. - type: + description: Country code of the contact's location. + region: + type: - "null" - string - android_app_name: - description: The name of the Android app associated with the contact. - type: - - "null" - - string - android_app_version: - description: The version of the Android app associated with the contact. - type: - - "null" - - string - android_device: - description: The device used by the contact for Android. - type: - - "null" - - string - android_os_version: - description: The operating system version of the Android device. - type: - - "null" - - string - android_sdk_version: - description: The SDK version of the Android device. - type: - - "null" - - string - android_last_seen_at: - description: The date and time when the contact was last seen on Android. - type: - - "null" - - string - format: date-time - ios_app_name: - description: The name of the iOS app associated with the contact. - type: - - "null" - - string - ios_app_version: - description: The version of the iOS app associated with the contact. - type: - - "null" - - string - ios_device: - description: The device used by the contact for iOS. - type: - - "null" - - string - ios_os_version: - description: The operating system version of the iOS device. - type: + description: Region of the contact's location. + marked_email_as_spam: + type: - "null" - - string - ios_sdk_version: - description: The SDK version of the iOS device. - type: + - boolean + description: Flag indicating if the contact's email was marked as spam. + name: + type: - "null" - string - ios_last_seen_at: - description: The date and time when the contact was last seen on iOS. - type: - - "null" - - integer - custom_attributes: - description: Custom attributes defined for the contact. - type: + description: The name of the contact. + notes: + type: - "null" - object - additionalProperties: true - properties: {} - tags: - description: Tags associated with the contact. + description: Notes associated with the contact. + properties: type: - - "null" - - object - properties: type: - description: Type of connection with the tags. - type: - "null" - string - data: - description: Array of tag data associated with the contact. - type: + description: Type of connection with the notes. + data: + type: - "null" - array - items: - type: + description: Array of note data associated with the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of tag. - type: - "null" - string - id: - description: The unique identifier of the tag. - type: + description: Type of note. + id: + type: - "null" - string - url: - description: URL of the tag. - type: + description: The unique identifier of the note. + url: + type: - "null" - string - url: - description: URL to access more tag information. - type: + description: URL of the note. + has_more: + type: - "null" - - string - total_count: - description: Total count of tags associated with the contact. - type: + - boolean + description: Flag indicating if there are more notes to load. + total_count: + type: - "null" - integer - has_more: - description: Flag indicating if there are more tags to load. - type: + description: Total count of notes associated with the contact. + url: + type: - "null" - - boolean - notes: - description: Notes associated with the contact. - type: + - string + description: URL to access more note information. + opted_in_subscription_types: + type: - "null" - object - properties: + description: Subscription types the contact opted into. + properties: + type: type: - description: Type of connection with the notes. - type: - "null" - string - data: - description: Array of note data associated with the contact. - type: + description: Type of connection with the subscription types. + data: + type: - "null" - array - items: - type: + description: Array of subscription type data opted into by the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of note. - type: - "null" - string - id: - description: The unique identifier of the note. - type: + description: Type of subscription. + id: + type: - "null" - string - url: - description: URL of the note. - type: + description: The unique identifier of the subscription type. + url: + type: - "null" - string - url: - description: URL to access more note information. - type: + description: URL of the subscription type. + has_more: + type: - "null" - - string - total_count: - description: Total count of notes associated with the contact. - type: + - boolean + description: Flag indicating if there are more subscription types to load. + total_count: + type: - "null" - integer - has_more: - description: Flag indicating if there are more notes to load. - type: + description: Total count of subscription types the contact opted into. + url: + type: - "null" - - boolean - companies: - description: Companies associated with the contact. - type: + - string + description: URL to access more subscription type information. + opted_out_subscription_types: + type: - "null" - object - properties: + description: Subscription types the contact opted out from. + properties: + type: type: - description: Type of connection with the companies. - type: - "null" - string - data: - description: Array of company data associated with the contact. - type: + description: Type of connection with the subscription types. + data: + type: - "null" - array - items: - type: + description: Array of subscription type data opted out from by the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of company. - type: - "null" - string - id: - description: The unique identifier of the company. - type: + description: Type of subscription. + id: + type: - "null" - string - url: - description: URL of the company. - type: + description: The unique identifier of the subscription type. + url: + type: - "null" - string - url: - description: URL to access more company information. - type: + description: URL of the subscription type. + has_more: + type: - "null" - - string - total_count: - description: Total count of companies associated with the contact. - type: + - boolean + description: Flag indicating if there are more subscription types to load. + total_count: + type: - "null" - integer - has_more: - description: Flag indicating if there are more companies to load. - type: + description: Total count of subscription types the contact opted out from. + url: + type: - "null" - - boolean - opted_out_subscription_types: - description: Subscription types the contact opted out from. - type: + - string + description: URL to access more subscription type information. + os: + type: + - "null" + - string + description: Operating system of the contact's device. + owner_id: + type: + - "null" + - integer + description: The unique identifier of the contact's owner. + phone: + type: + - "null" + - string + description: The phone number of the contact. + referrer: + type: + - "null" + - string + description: Referrer information related to the contact. + role: + type: + - "null" + - string + description: Role or position of the contact. + signed_up_at: + type: + - "null" + - integer + description: The date and time when the contact signed up. + sms_consent: + type: + - "null" + - boolean + description: Consent status for SMS communication. + social_profiles: + type: - "null" - object - properties: + description: Social profiles associated with the contact. + properties: + type: type: - description: Type of connection with the subscription types. - type: - "null" - string - data: - description: Array of subscription type data opted out from by the contact. - type: + description: Type of social profile connection. + data: + type: - "null" - array - items: - type: + description: Array of social profile data associated with the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of subscription. - type: - "null" - string - id: - description: The unique identifier of the subscription type. - type: + description: Type of social profile. + name: + type: - "null" - string - url: - description: URL of the subscription type. - type: + description: Name of the social profile. + url: + type: - "null" - string - url: - description: URL to access more subscription type information. - type: - - "null" - - string - total_count: - description: Total count of subscription types the contact opted out - from. - type: - - "null" - - integer - has_more: - description: Flag indicating if there are more subscription types to - load. - type: - - "null" - - boolean - opted_in_subscription_types: - description: Subscription types the contact opted into. - type: + description: URL of the social profile. + tags: + type: - "null" - object - properties: + description: Tags associated with the contact. + properties: + type: type: - description: Type of connection with the subscription types. - type: - "null" - string - data: - description: Array of subscription type data opted into by the contact. - type: + description: Type of connection with the tags. + data: + type: - "null" - array - items: - type: + description: Array of tag data associated with the contact. + items: + type: - "null" - object - properties: + properties: + type: type: - description: Type of subscription. - type: - "null" - string - id: - description: The unique identifier of the subscription type. - type: + description: Type of tag. + id: + type: - "null" - string - url: - description: URL of the subscription type. - type: + description: The unique identifier of the tag. + url: + type: - "null" - string - url: - description: URL to access more subscription type information. - type: + description: URL of the tag. + has_more: + type: - "null" - - string - total_count: - description: Total count of subscription types the contact opted into. - type: + - boolean + description: Flag indicating if there are more tags to load. + total_count: + type: - "null" - integer - has_more: - description: Flag indicating if there are more subscription types to - load. - type: + description: Total count of tags associated with the contact. + url: + type: - "null" - - boolean - utm_content: - description: Content data from UTM parameters. - type: + - string + description: URL to access more tag information. + unsubscribed_from_emails: + type: + - "null" + - boolean + description: Flag indicating if the contact unsubscribed from emails. + unsubscribed_from_sms: + type: + - "null" + - boolean + description: Flag indicating if the contact unsubscribed from SMS. + updated_at: + type: + - "null" + - integer + description: The date and time when the contact was last updated. + utm_campaign: + type: - "null" - string - utm_campaign: - description: Campaign data from UTM parameters. - type: + description: Campaign data from UTM parameters. + utm_content: + type: - "null" - string - utm_source: - description: Source data from UTM parameters. - type: + description: Content data from UTM parameters. + utm_medium: + type: - "null" - string - referrer: - description: Referrer information related to the contact. - type: + description: Medium data from UTM parameters. + utm_source: + type: - "null" - string - utm_term: - description: Term data from UTM parameters. - type: + description: Source data from UTM parameters. + utm_term: + type: - "null" - string - utm_medium: - description: Medium data from UTM parameters. - type: + description: Term data from UTM parameters. + workspace_id: + type: - "null" - string - type: DeclarativeStream - name: "contacts" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400) if stream_state else stream_slice.get('prior_state', - {}).get('updated_at', 0) ) - (config.get('lookback_window', 0) * 86400)}}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "2.9" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} - }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') - }}, 'starting_after': '{{ next_page_token.get('next_page_token').get('starting_after') - }}' }" - path: "conversations/search" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assignee: - description: The assigned user responsible for the conversation. - type: + description: The unique identifier of the workspace associated with the contact. + conversations: + type: object + additionalProperties: true + properties: + type: + type: - "null" - - object - properties: - id: - description: The ID of the assignee - type: - - "null" - - string - type: - description: The type of the assignee (e.g., admin, agent) - type: - - "null" - - string - name: - description: The name of the assignee - type: - - "null" - - string - email: - description: The email of the assignee - type: - - "null" - - string - source: - description: Source details of the conversation. - type: + - string + description: The type of the conversation + admin_assignee_id: + type: + - "null" + - integer + description: The ID of the administrator assigned to the conversation + assignee: + type: - "null" - object - properties: + description: The assigned user responsible for the conversation. + properties: + type: type: - description: The type of the source - type: - - "null" - - string - id: - description: The ID of the source - type: - - "null" - - string - redacted: - description: Indicates if the source is redacted - type: - - "null" - - boolean - delivered_as: - description: The delivery status of the source - type: - - "null" - - string - subject: - description: The subject of the source - type: - - "null" - - string - body: - description: The body/content of the source - type: - "null" - string - author: - description: Author of the source. - type: - - "null" - - object - properties: - id: - description: The ID of the source author - type: - - "null" - - string - type: - description: The type of the source author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the source author - type: - - "null" - - string - email: - description: The email of the source author - type: - - "null" - - string - attachments: - description: Attachments related to the conversation. - type: + description: The type of the assignee (e.g., admin, agent) + email: + type: - "null" - - array - items: - type: - - "null" - - object - additionalProperties: true - properties: {} - url: - description: The URL of the source - type: + - string + description: The email of the assignee + id: + type: - "null" - string - contacts: - description: List of contacts involved in the conversation. - type: + description: The ID of the assignee + name: + type: + - "null" + - string + description: The name of the assignee + contacts: + type: - "null" - object - items: - type: + description: List of contacts involved in the conversation. + items: + type: - "null" - object - properties: + properties: + type: type: - description: The type of the contact - type: - "null" - string - id: - description: The ID of the contact - type: + description: The type of the contact + id: + type: - "null" - string - teammates: - description: List of teammates involved in the conversation. - type: + description: The ID of the contact + conversation_message: + type: - "null" - object - properties: - admins: - description: Admin teammates involved in the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - id: - description: The ID of the teammate admin - type: - - "null" - - string - type: - description: The type of the teammate (admin) - type: - - "null" - - string - type: - description: The type of teammates - type: - - "null" - - string - first_contact_reply: - description: Timestamp indicating when the first contact replied. + description: The main message content of the conversation. + properties: type: - - "null" - - object - properties: type: - description: The type of the first contact reply - type: - - "null" - - string - url: - description: The URL of the first contact reply - type: - "null" - string - created_at: - description: The timestamp of the first contact's reply - type: - - "null" - - integer - custom_attributes: - description: Custom attributes associated with the conversation - type: - - "null" - - object - priority: - description: The priority level of the conversation - type: - - "null" - - string - conversation_message: - description: The main message content of the conversation. - type: - - "null" - - object - properties: - attachments: - description: Attachments in the conversation message - anyOf: + description: The type of the conversation message + attachments: + description: Attachments in the conversation message + anyOf: - type: array items: type: object properties: type: type: - - "null" - - string - name: - type: - - "null" - - string - url: - type: - - "null" - - string + - "null" + - string content_type: type: - - "null" - - string + - "null" + - string filesize: type: - - "null" - - integer + - "null" + - integer height: type: - - "null" - - integer + - "null" + - integer + name: + type: + - "null" + - string + url: + type: + - "null" + - string width: type: - - "null" - - integer + - "null" + - integer - type: "null" - author: - description: The author of the conversation message. - type: + author: + type: - "null" - object - properties: - id: - description: The ID of the author of the message - type: + description: The author of the conversation message. + properties: + type: + type: - "null" - string + description: The type of the author (e.g., admin, customer) + email: type: - description: The type of the author (e.g., admin, customer) - type: - "null" - string - name: - description: The name of the author of the message - type: + description: The email of the author of the message + id: + type: - "null" - string - email: - description: The email of the author of the message - type: + description: The ID of the author of the message + name: + type: - "null" - string - body: - description: The body/content of the conversation message - type: - - "null" - - string - delivered_as: - description: The delivery status of the message - type: + description: The name of the author of the message + body: + type: - "null" - string - id: - description: The ID of the conversation message - type: + description: The body/content of the conversation message + delivered_as: + type: - "null" - string - subject: - description: The subject of the conversation message - type: + description: The delivery status of the message + id: + type: - "null" - string + description: The ID of the conversation message + subject: type: - description: The type of the conversation message - type: - "null" - string - url: - description: The URL of the conversation message - type: + description: The subject of the conversation message + url: + type: - "null" - string - conversation_rating: - description: Ratings given to the conversation by the customer and teammate. - type: + description: The URL of the conversation message + conversation_rating: + type: - "null" - object - properties: - created_at: - description: The timestamp when the rating was created - type: + description: Ratings given to the conversation by the customer and teammate. + properties: + created_at: + type: - "null" - integer - customer: - description: Rating given by the customer. - type: + description: The timestamp when the rating was created + customer: + type: - "null" - object - properties: - id: - description: The ID of the customer who provided the rating - type: + description: Rating given by the customer. + properties: + type: + type: - "null" - string + description: The type of the customer providing the rating + id: type: - description: The type of the customer providing the rating - type: - "null" - string - rating: - description: The rating given to the conversation - type: + description: The ID of the customer who provided the rating + rating: + type: - "null" - integer - remark: - description: Any remarks provided with the rating - type: + description: The rating given to the conversation + remark: + type: - "null" - string - teammate: - description: Rating given by the teammate. - type: + description: Any remarks provided with the rating + teammate: + type: - "null" - object - properties: - id: - description: The ID of the teammate being rated - type: - - "null" - - integer + description: Rating given by the teammate. + properties: + type: type: - description: The type of the teammate being rated - type: - "null" - string - created_at: - description: The timestamp when the conversation was created - type: + description: The type of the teammate being rated + id: + type: + - "null" + - integer + description: The ID of the teammate being rated + created_at: + type: - "null" - integer - customer_first_reply: - description: Timestamp indicating when the customer first replied. - type: + description: The timestamp when the conversation was created + custom_attributes: + type: - "null" - object - properties: - created_at: - description: The timestamp of the customer's first reply - type: - - "null" - - integer + description: Custom attributes associated with the conversation + customer_first_reply: + type: + - "null" + - object + description: Timestamp indicating when the customer first replied. + properties: + type: type: - description: The type of the first customer reply - type: - "null" - string - url: - description: The URL of the first customer reply - type: + description: The type of the first customer reply + created_at: + type: + - "null" + - integer + description: The timestamp of the customer's first reply + url: + type: - "null" - string - customers: - description: List of customers involved in the conversation - anyOf: + description: The URL of the first customer reply + customers: + description: List of customers involved in the conversation + anyOf: - type: array items: type: - - "null" - - object + - "null" + - object properties: - id: - type: - - "null" - - string type: type: - - "null" - - string + - "null" + - string + id: + type: + - "null" + - string - type: "null" - id: - description: The unique ID of the conversation + first_contact_reply: + type: + - "null" + - object + description: Timestamp indicating when the first contact replied. + properties: type: + type: + - "null" + - string + description: The type of the first contact reply + created_at: + type: + - "null" + - integer + description: The timestamp of the first contact's reply + url: + type: + - "null" + - string + description: The URL of the first contact reply + id: + type: - "null" - string - open: - description: Indicates if the conversation is open or closed - type: + description: The unique ID of the conversation + open: + type: - "null" - boolean - read: - description: Indicates if the conversation has been read - type: + description: Indicates if the conversation is open or closed + priority: + type: + - "null" + - string + description: The priority level of the conversation + read: + type: - "null" - boolean - sent_at: - description: The timestamp when the conversation was sent - type: + description: Indicates if the conversation has been read + redacted: + type: + - "null" + - boolean + description: Indicates if the conversation is redacted + sent_at: + type: - "null" - integer - snoozed_until: - description: Timestamp until the conversation is snoozed - type: + description: The timestamp when the conversation was sent + sla_applied: + type: + - "null" + - object + description: Service Level Agreement details applied to the conversation. + properties: + sla_name: + type: + - "null" + - string + description: The name of the SLA applied + sla_status: + type: + - "null" + - string + description: The status of the SLA applied + snoozed_until: + type: - "null" - integer - sla_applied: - description: Service Level Agreement details applied to the conversation. - type: + description: Timestamp until the conversation is snoozed + source: + type: - "null" - object - properties: - sla_name: - description: The name of the SLA applied + description: Source details of the conversation. + properties: + type: + type: + - "null" + - string + description: The type of the source + attachments: + type: + - "null" + - array + description: Attachments related to the conversation. + items: + type: + - "null" + - object + additionalProperties: true + properties: {} + author: + type: + - "null" + - object + description: Author of the source. + properties: type: + type: + - "null" + - string + description: The type of the source author (e.g., admin, customer) + email: + type: + - "null" + - string + description: The email of the source author + id: + type: + - "null" + - string + description: The ID of the source author + name: + type: + - "null" + - string + description: The name of the source author + body: + type: - "null" - string - sla_status: - description: The status of the SLA applied - type: + description: The body/content of the source + delivered_as: + type: - "null" - string - state: - description: The state of the conversation (e.g., new, in progress) - type: + description: The delivery status of the source + id: + type: + - "null" + - string + description: The ID of the source + redacted: + type: + - "null" + - boolean + description: Indicates if the source is redacted + subject: + type: + - "null" + - string + description: The subject of the source + url: + type: + - "null" + - string + description: The URL of the source + state: + type: - "null" - string - statistics: - description: Statistics related to the conversation. - type: + description: The state of the conversation (e.g., new, in progress) + statistics: + type: - "null" - object - properties: + description: Statistics related to the conversation. + properties: + type: type: - description: The type of conversation statistics - type: - "null" - string - time_to_assignment: - description: Time taken for assignment - type: + description: The type of conversation statistics + count_assignments: + type: - "null" - integer - time_to_admin_reply: - description: Time taken to reply by admin - type: + description: The total count of assignments for the conversation + count_conversation_parts: + type: - "null" - integer - time_to_first_close: - description: Time taken to first close the conversation - type: + description: The total count of conversation parts + count_reopens: + type: - "null" - integer - time_to_last_close: - description: Time taken to last close the conversation - type: + description: The total count of conversation reopens + first_admin_reply_at: + type: - "null" - integer - median_time_to_reply: - description: The median time taken to reply to the conversation - type: + description: Timestamp of the first admin reply + first_assignment_at: + type: - "null" - integer - first_contact_reply_at: - description: Timestamp of the first contact reply - type: + description: Timestamp of the first assignment + first_close_at: + type: - "null" - integer - first_assignment_at: - description: Timestamp of the first assignment - type: + description: Timestamp of the first conversation close + first_contact_reply_at: + type: - "null" - integer - first_admin_reply_at: - description: Timestamp of the first admin reply - type: + description: Timestamp of the first contact reply + last_admin_reply_at: + type: - "null" - integer - first_close_at: - description: Timestamp of the first conversation close - type: + description: Timestamp of the last admin reply + last_assignment_admin_reply_at: + type: - "null" - integer - last_assignment_at: - description: Timestamp of the last assignment - type: + description: Timestamp of the last assignment admin reply + last_assignment_at: + type: - "null" - integer - last_assignment_admin_reply_at: - description: Timestamp of the last assignment admin reply - type: + description: Timestamp of the last assignment + last_close_at: + type: - "null" - integer - last_contact_reply_at: - description: Timestamp of the last contact reply - type: + description: Timestamp of the last conversation close + last_closed_by_id: + type: - "null" - integer - last_admin_reply_at: - description: Timestamp of the last admin reply - type: + description: The ID of the last user who closed the conversation + last_contact_reply_at: + type: - "null" - integer - last_close_at: - description: Timestamp of the last conversation close - type: + description: Timestamp of the last contact reply + median_time_to_reply: + type: - "null" - integer - last_closed_by_id: - description: The ID of the last user who closed the conversation - type: + description: The median time taken to reply to the conversation + time_to_admin_reply: + type: - "null" - integer - count_reopens: - description: The total count of conversation reopens - type: + description: Time taken to reply by admin + time_to_assignment: + type: - "null" - integer - count_assignments: - description: The total count of assignments for the conversation - type: + description: Time taken for assignment + time_to_first_close: + type: - "null" - integer - count_conversation_parts: - description: The total count of conversation parts - type: + description: Time taken to first close the conversation + time_to_last_close: + type: - "null" - integer - tags: - description: Tags applied to the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - applied_at: - description: Timestamp when the tag was applied - type: - - "null" - - integer - applied_by: - description: User who applied the tag. - type: - - "null" - - object - properties: - id: - description: The ID of the user who applied the tag - type: - - "null" - - string - type: - description: The type of the user who applied the tag - type: - - "null" - - string - id: - description: The ID of the tag - type: - - "null" - - string - name: - description: The name of the tag - type: - - "null" - - string - type: - description: The type of the tag - type: - - "null" - - string + description: Time taken to last close the conversation + tags: type: - description: The type of the conversation - type: - - "null" - - string - updated_at: - description: The timestamp when the conversation was last updated - type: - - "null" - - integer - user: - description: The user related to the conversation. - type: - "null" - object - properties: - id: - description: The ID of the user associated with the conversation - type: - - "null" - - string - type: - description: The type of the user - type: - - "null" - - string - waiting_since: - description: Timestamp since waiting for a response - type: - - "null" - - integer - admin_assignee_id: - description: The ID of the administrator assigned to the conversation - type: - - "null" - - integer - title: - description: The title of the conversation - type: - - "null" - - string - team_assignee_id: - description: The ID of the team assigned to the conversation - type: - - "null" - - integer - redacted: - description: Indicates if the conversation is redacted + description: Tags applied to the conversation. + items: type: - - "null" - - boolean - topics: - description: Topics associated with the conversation. - type: - - "null" - - object + - "null" + - object properties: type: - description: The type of topics - type: - - "null" - - string - topics: - description: List of topics related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type of the topic - type: - - "null" - - string - id: - description: The ID of the topic - type: - - "null" - - integer - name: - description: The name of the topic - type: - - "null" - - string - total_count: - description: The total count of topics - type: - - "null" - - integer - type: DeclarativeStream - name: "conversations" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - field_path: - - "conversation_parts" - - "conversation_parts" - type: DpathExtractor - record_filter: - condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: DefaultErrorHandler - description: "404 - conversation is not found while requesting, ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - type: HttpResponseFilter - path: "/conversations/{{ stream_slice.id }}" - paginator: - type: "NoPagination" - type: SimpleRetriever - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - parent_stream_configs: - - type: ParentStreamConfig - stream: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search#pagination" - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400)}}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "POST" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "2.9" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription - needed. Please, validate your current Intercom plan to continue - using API." - request_body_json: - query: "{ 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': - '>', 'value': {{ stream_slice.get('prior_state', stream_state.get('prior_state', - {})).get('updated_at') or format_datetime(config['start_date'], '%s') - }} }, { 'field': 'updated_at', 'operator': '=', 'value': {{ stream_slice.get('prior_state', - stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], - '%s') }} }, ], }" - sort: "{'field': 'updated_at', 'order': 'ascending'}" - pagination: "{ 'per_page': {{ parameters.get('page_size') }}, 'page': - {{ next_page_token.get('next_page_token').get('page') }}, 'starting_after': - '{{ next_page_token.get('next_page_token').get('starting_after') }}' - }" - path: "conversations/search" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('pages', {}).get('next') }}" - stop_condition: "{{ 'next' not in response.get('pages', {}) }}" - page_size: 150 - type: SimpleRetriever - description: "https://developers.intercom.com/intercom-api-reference/reference/pagination-sorting-search" - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assignee: - description: The assigned user responsible for the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the assignee - type: - - "null" - - string - type: - description: The type of the assignee (e.g., admin, agent) - type: - - "null" - - string - name: - description: The name of the assignee - type: - - "null" - - string - email: - description: The email of the assignee - type: - - "null" - - string - source: - description: Source details of the conversation. - type: - - "null" - - object - properties: - type: - description: The type of the source - type: - - "null" - - string - id: - description: The ID of the source - type: - - "null" - - string - redacted: - description: Indicates if the source is redacted - type: - - "null" - - boolean - delivered_as: - description: The delivery status of the source - type: - - "null" - - string - subject: - description: The subject of the source - type: - - "null" - - string - body: - description: The body/content of the source - type: - - "null" - - string - author: - description: Author of the source. - type: - - "null" - - object - properties: - id: - description: The ID of the source author - type: - - "null" - - string - type: - description: The type of the source author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the source author - type: - - "null" - - string - email: - description: The email of the source author - type: - - "null" - - string - attachments: - description: Attachments related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - additionalProperties: true - properties: {} - url: - description: The URL of the source - type: - - "null" - - string - contacts: - description: List of contacts involved in the conversation. - type: - - "null" - - object - items: - type: - - "null" - - object - properties: - type: - description: The type of the contact - type: - - "null" - - string - id: - description: The ID of the contact - type: - - "null" - - string - teammates: - description: List of teammates involved in the conversation. - type: - - "null" - - object - properties: - admins: - description: Admin teammates involved in the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - id: - description: The ID of the teammate admin - type: - - "null" - - string - type: - description: The type of the teammate (admin) - type: - - "null" - - string - type: - description: The type of teammates - type: - - "null" - - string - first_contact_reply: - description: Timestamp indicating when the first contact replied. - type: - - "null" - - object - properties: - type: - description: The type of the first contact reply - type: - - "null" - - string - url: - description: The URL of the first contact reply - type: - - "null" - - string - created_at: - description: The timestamp of the first contact's reply - type: - - "null" - - integer - custom_attributes: - description: Custom attributes associated with the conversation - type: - - "null" - - object - priority: - description: The priority level of the conversation - type: + type: - "null" - string - conversation_message: - description: The main message content of the conversation. - type: - - "null" - - object - properties: - attachments: - description: Attachments in the conversation message - anyOf: - - type: array - items: - type: object - properties: - type: - type: - - "null" - - string - name: - type: - - "null" - - string - url: - type: - - "null" - - string - content_type: - type: - - "null" - - string - filesize: - type: - - "null" - - integer - height: - type: - - "null" - - integer - width: - type: - - "null" - - integer - - type: "null" - author: - description: The author of the conversation message. - type: - - "null" - - object - properties: - id: - description: The ID of the author of the message - type: - - "null" - - string - type: - description: The type of the author (e.g., admin, customer) - type: - - "null" - - string - name: - description: The name of the author of the message - type: - - "null" - - string - email: - description: The email of the author of the message - type: - - "null" - - string - body: - description: The body/content of the conversation message - type: - - "null" - - string - delivered_as: - description: The delivery status of the message - type: - - "null" - - string - id: - description: The ID of the conversation message - type: - - "null" - - string - subject: - description: The subject of the conversation message - type: - - "null" - - string - type: - description: The type of the conversation message - type: - - "null" - - string - url: - description: The URL of the conversation message - type: - - "null" - - string - conversation_rating: - description: Ratings given to the conversation by the customer and - teammate. - type: - - "null" - - object - properties: - created_at: - description: The timestamp when the rating was created - type: - - "null" - - integer - customer: - description: Rating given by the customer. - type: - - "null" - - object - properties: - id: - description: The ID of the customer who provided the rating - type: - - "null" - - string - type: - description: The type of the customer providing the rating - type: - - "null" - - string - rating: - description: The rating given to the conversation - type: - - "null" - - integer - remark: - description: Any remarks provided with the rating - type: - - "null" - - string - teammate: - description: Rating given by the teammate. - type: - - "null" - - object - properties: - id: - description: The ID of the teammate being rated - type: - - "null" - - integer - type: - description: The type of the teammate being rated - type: - - "null" - - string - created_at: - description: The timestamp when the conversation was created - type: + description: The type of the tag + applied_at: + type: - "null" - integer - customer_first_reply: - description: Timestamp indicating when the customer first replied. - type: + description: Timestamp when the tag was applied + applied_by: + type: - "null" - object - properties: - created_at: - description: The timestamp of the customer's first reply - type: - - "null" - - integer + description: User who applied the tag. + properties: + type: type: - description: The type of the first customer reply - type: - "null" - string - url: - description: The URL of the first customer reply - type: + description: The type of the user who applied the tag + id: + type: - "null" - string - customers: - description: List of customers involved in the conversation - anyOf: - - type: array - items: - type: - - "null" - - object - properties: - id: - type: - - "null" - - string - type: - type: - - "null" - - string - - type: "null" - id: - description: The unique ID of the conversation - type: + description: The ID of the user who applied the tag + id: + type: - "null" - string - open: - description: Indicates if the conversation is open or closed - type: - - "null" - - boolean - read: - description: Indicates if the conversation has been read - type: - - "null" - - boolean - sent_at: - description: The timestamp when the conversation was sent - type: - - "null" - - integer - snoozed_until: - description: Timestamp until the conversation is snoozed - type: - - "null" - - integer - sla_applied: - description: Service Level Agreement details applied to the conversation. - type: - - "null" - - object - properties: - sla_name: - description: The name of the SLA applied - type: - - "null" - - string - sla_status: - description: The status of the SLA applied - type: - - "null" - - string - state: - description: The state of the conversation (e.g., new, in progress) - type: + description: The ID of the tag + name: + type: - "null" - string - statistics: - description: Statistics related to the conversation. - type: + description: The name of the tag + team_assignee_id: + type: + - "null" + - integer + description: The ID of the team assigned to the conversation + teammates: + type: + - "null" + - object + description: List of teammates involved in the conversation. + properties: + type: + type: + - "null" + - string + description: The type of teammates + admins: + type: + - "null" + - array + description: Admin teammates involved in the conversation. + items: + type: - "null" - object - properties: - type: - description: The type of conversation statistics - type: - - "null" - - string - time_to_assignment: - description: Time taken for assignment - type: - - "null" - - integer - time_to_admin_reply: - description: Time taken to reply by admin - type: - - "null" - - integer - time_to_first_close: - description: Time taken to first close the conversation - type: - - "null" - - integer - time_to_last_close: - description: Time taken to last close the conversation - type: - - "null" - - integer - median_time_to_reply: - description: The median time taken to reply to the conversation - type: - - "null" - - integer - first_contact_reply_at: - description: Timestamp of the first contact reply - type: - - "null" - - integer - first_assignment_at: - description: Timestamp of the first assignment - type: - - "null" - - integer - first_admin_reply_at: - description: Timestamp of the first admin reply - type: - - "null" - - integer - first_close_at: - description: Timestamp of the first conversation close - type: - - "null" - - integer - last_assignment_at: - description: Timestamp of the last assignment - type: - - "null" - - integer - last_assignment_admin_reply_at: - description: Timestamp of the last assignment admin reply - type: - - "null" - - integer - last_contact_reply_at: - description: Timestamp of the last contact reply - type: - - "null" - - integer - last_admin_reply_at: - description: Timestamp of the last admin reply - type: - - "null" - - integer - last_close_at: - description: Timestamp of the last conversation close - type: - - "null" - - integer - last_closed_by_id: - description: The ID of the last user who closed the conversation - type: - - "null" - - integer - count_reopens: - description: The total count of conversation reopens - type: - - "null" - - integer - count_assignments: - description: The total count of assignments for the conversation - type: - - "null" - - integer - count_conversation_parts: - description: The total count of conversation parts - type: - - "null" - - integer - tags: - description: Tags applied to the conversation. + properties: type: - - "null" - - object - items: type: - - "null" - - object - properties: - applied_at: - description: Timestamp when the tag was applied - type: - - "null" - - integer - applied_by: - description: User who applied the tag. - type: - - "null" - - object - properties: - id: - description: The ID of the user who applied the tag - type: - - "null" - - string - type: - description: The type of the user who applied the tag - type: - - "null" - - string - id: - description: The ID of the tag - type: - - "null" - - string - name: - description: The name of the tag - type: - - "null" - - string - type: - description: The type of the tag - type: - - "null" - - string - type: - description: The type of the conversation - type: - - "null" - - string - updated_at: - description: The timestamp when the conversation was last updated - type: - - "null" - - integer - user: - description: The user related to the conversation. - type: - - "null" - - object - properties: - id: - description: The ID of the user associated with the conversation - type: - "null" - string + description: The type of the teammate (admin) + id: type: - description: The type of the user - type: - "null" - string - waiting_since: - description: Timestamp since waiting for a response - type: - - "null" - - integer - admin_assignee_id: - description: The ID of the administrator assigned to the conversation - type: - - "null" - - integer - title: - description: The title of the conversation - type: - - "null" - - string - team_assignee_id: - description: The ID of the team assigned to the conversation - type: - - "null" - - integer - redacted: - description: Indicates if the conversation is redacted - type: - - "null" - - boolean - topics: - description: Topics associated with the conversation. - type: + description: The ID of the teammate admin + title: + type: + - "null" + - string + description: The title of the conversation + topics: + type: + - "null" + - object + description: Topics associated with the conversation. + properties: + type: + type: + - "null" + - string + description: The type of topics + topics: + type: + - "null" + - array + description: List of topics related to the conversation. + items: + type: - "null" - object - properties: + properties: + type: type: - description: The type of topics - type: - "null" - string - topics: - description: List of topics related to the conversation. - type: - - "null" - - array - items: - type: - - "null" - - object - properties: - type: - description: The type of the topic - type: - - "null" - - string - id: - description: The ID of the topic - type: - - "null" - - integer - name: - description: The name of the topic - type: - - "null" - - string - total_count: - description: The total count of topics - type: + description: The type of the topic + id: + type: - "null" - integer - type: DeclarativeStream - name: "conversations" - primary_key: "id" - parent_key: "id" - partition_field: "id" - transformations: - - type: AddFields - fields: - - path: - - "conversation_id" - value: "'{{ stream_slice.id }}'" - type: AddedFieldDefinition - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - assigned_to: - description: The user or team member who is assigned to handle this conversation - part. - oneOf: + description: The ID of the topic + name: + type: + - "null" + - string + description: The name of the topic + total_count: + type: + - "null" + - integer + description: The total count of topics + updated_at: + type: + - "null" + - integer + description: The timestamp when the conversation was last updated + user: + type: + - "null" + - object + description: The user related to the conversation. + properties: + type: + type: + - "null" + - string + description: The type of the user + id: + type: + - "null" + - string + description: The ID of the user associated with the conversation + waiting_since: + type: + - "null" + - integer + description: Timestamp since waiting for a response + conversation_parts: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: The type of conversation part, such as message or note. + assigned_to: + description: >- + The user or team member who is assigned to handle this conversation + part. + oneOf: - type: object properties: type: type: - - "null" - - string + - "null" + - string id: type: - - "null" - - string + - "null" + - string - type: string - type: "null" - attachments: - description: Represents the attachments associated with the conversation - part. - type: + attachments: + type: - "null" - array - items: - type: + description: Represents the attachments associated with the conversation part. + items: + type: - "null" - object - properties: + properties: + type: type: - description: The type or category of the attachment. - type: - "null" - string - name: - description: The filename or name of the attachment. - type: - - "null" - - string - url: - description: The URL or location where the attachment can be accessed. - type: - - "null" - - string - content_type: - description: The MIME type of the attachment content. - type: + description: The type or category of the attachment. + content_type: + type: - "null" - string - filesize: - description: The size of the attachment file in bytes. - type: + description: The MIME type of the attachment content. + filesize: + type: - "null" - integer - height: - description: The height dimension of the attachment in pixels. - type: + description: The size of the attachment file in bytes. + height: + type: - "null" - integer - width: - description: The width dimension of the attachment in pixels. - type: + description: The height dimension of the attachment in pixels. + name: + type: + - "null" + - string + description: The filename or name of the attachment. + url: + type: + - "null" + - string + description: The URL or location where the attachment can be accessed. + width: + type: - "null" - integer - author: - description: Represents the author of the conversation part. - type: + description: The width dimension of the attachment in pixels. + author: + type: - "null" - object - properties: - id: - description: The unique identifier of the conversation author. - type: + description: Represents the author of the conversation part. + properties: + type: + type: - "null" - string + description: The type of author, such as customer or agent. + email: type: - description: The type of author, such as customer or agent. - type: - "null" - string - name: - description: The name of the conversation author. - type: + description: The email address of the conversation author. + id: + type: - "null" - string - email: - description: The email address of the conversation author. - type: + description: The unique identifier of the conversation author. + name: + type: - "null" - string - body: - description: The main content or message body of the conversation part. - type: - - "null" - - string - conversation_id: - description: The unique identifier of the conversation. - type: + description: The name of the conversation author. + body: + type: - "null" - string - conversation_created_at: - description: The date and time when the conversation was created. - type: + description: The main content or message body of the conversation part. + conversation_created_at: + type: - "null" - integer - conversation_updated_at: - description: The date and time when the conversation was last updated. - type: + description: The date and time when the conversation was created. + conversation_id: + type: + - "null" + - string + description: The unique identifier of the conversation. + conversation_total_parts: + type: - "null" - integer - conversation_total_parts: - description: The total number of parts in the conversation. - type: + description: The total number of parts in the conversation. + conversation_updated_at: + type: - "null" - integer - created_at: - description: The date and time when the conversation part was created. - type: + description: The date and time when the conversation was last updated. + created_at: + type: - "null" - integer - external_id: - description: An external identifier associated with the conversation part. - type: + description: The date and time when the conversation part was created. + external_id: + type: - "null" - string - id: - description: The unique identifier of the conversation part. - type: + description: An external identifier associated with the conversation part. + id: + type: - "null" - string - notified_at: - description: The date and time when the conversation part was last notified. - type: + description: The unique identifier of the conversation part. + notified_at: + type: - "null" - integer - part_type: - description: The type or category of the conversation part. - type: + description: The date and time when the conversation part was last notified. + part_type: + type: - "null" - string + description: The type or category of the conversation part. + redacted: type: - description: The type of conversation part, such as message or note. - type: - "null" - - string - updated_at: - description: The date and time when the conversation part was last updated. - type: + - boolean + description: Indicates if the conversation part has been redacted or censored. + updated_at: + type: - "null" - integer - redacted: - description: Indicates if the conversation part has been redacted or censored. - type: + description: The date and time when the conversation part was last updated. + company_segments: + type: object + additionalProperties: true + properties: + type: + type: - "null" - - boolean - type: DeclarativeStream - name: "conversation_parts" - primary_key: "id" -- retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= stream_state.get('prior_state', {}).get('updated_at', - 0) - (config.get('lookback_window', 0) * 86400)}}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CustomErrorHandler - class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter - response_filters: - - type: HttpResponseFilter - error_message_contains: "Active subscription needed" - action: FAIL - failure_type: config_error - error_message: "Failed to perform request. Error: Active subscription needed. - Please, validate your current Intercom plan to continue using API." - path: "/companies/{{ stream_slice.id }}/segments" - paginator: - type: "NoPagination" - type: SimpleRetriever - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor - cursor_field: "updated_at" - parent_complete_fetch: true - parent_stream_configs: - - type: ParentStreamConfig - stream: - retriever: - description: "Base Retriever for Full Refresh streams" - record_selector: - description: "Base records selector for Full Refresh streams" - extractor: - type: DpathExtractor - field_path: - - "{{ parameters.get('data_field', 'data')}}" - record_filter: - condition: "{{ record['updated_at'] >= ( stream_state.get('prior_state', - {}).get('updated_at', 0) - (config.get('lookback_window', 0) * 86400) - if stream_state else stream_slice.get('prior_state', {}).get('updated_at', - 0) ) - (config.get('lookback_window', 0) * 86400) }}" - type: RecordFilter - type: RecordSelector - requester: - description: "Base Requester for Full Refresh streams" - type: HttpRequester - url_base: "https://api.intercom.io/" - http_method: "GET" - authenticator: - type: BearerAuthenticator - api_token: "{{ config['access_token'] }}" - request_headers: - Intercom-Version: "'2.10'" - Accept: "application/json" - error_handler: - type: CompositeErrorHandler - error_handlers: - - type: DefaultErrorHandler - description: " 400 - existing scroll_param, need to wait at least - 60 sec to continue and retry 500 - server-side error, should retry - after 60 sec. " - response_filters: - - http_codes: - - 400 - action: RETRY - failure_type: transient_error - error_message: "A scroll (export) job is already in progress for - this Intercom account, causing the request to fail. Only one active - scroll per Intercom account is allowed; ensure no overlap by limiting - active connections or scheduling jobs appropriately." - type: HttpResponseFilter - - http_codes: - - 500 - action: RETRY - failure_type: transient_error - type: HttpResponseFilter - backoff_strategies: - - type: ConstantBackoffStrategy - backoff_time_in_seconds: 60 - - type: DefaultErrorHandler - description: "404 - scroll_param is expired or not found while requesting, - ignore" - response_filters: - - http_codes: - - 404 - action: IGNORE - type: HttpResponseFilter - path: "companies/scroll" - paginator: - type: "DefaultPaginator" - url_base: "https://api.intercom.io/" - pagination_strategy: - type: "CursorPagination" - cursor_value: "{{ response.get('scroll_param') }}" - stop_condition: "{{ not response.get('data') }}" - page_size: 150 - page_size_option: - inject_into: request_parameter - field_name: per_page - type: RequestOption - page_token_option: - type: RequestOption - field_name: scroll_param - inject_into: request_parameter - type: SimpleRetriever - incremental_sync: - type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor - cursor_field: "updated_at" - description: "https://developers.intercom.com/intercom-api-reference/reference/scroll-over-all-companies" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - type: - description: The type of the company - type: - - "null" - - string - company_id: - description: The unique identifier of the company - type: - - "null" - - string - id: - description: The ID of the company - type: - - "null" - - string - app_id: - description: The ID of the application associated with the company - type: - - "null" - - string - name: - description: The name of the company - type: - - "null" - - string - created_at: - description: The date and time when the company was created - type: - - "null" - - integer - updated_at: - description: The date and time when the company was last updated - type: - - "null" - - integer - monthly_spend: - description: The monthly spend of the company - type: - - "null" - - number - multipleOf: 0.00000001 - session_count: - description: The number of sessions related to the company - type: - - "null" - - integer - user_count: - description: The number of users associated with the company - type: - - "null" - - integer - size: - description: The size of the company - type: - - "null" - - integer - tags: - description: Tags associated with the company - type: object - properties: - type: - description: The type of tags associated with the company - type: string - tags: - description: List of tags - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the tag - type: string - name: - description: The name of the tag - type: string - id: - description: The ID of the tag - oneOf: - - type: - - "null" - - string - - type: - - "null" - - integer - segments: - description: Segments associated with the company - type: object - properties: - type: - description: The type of segments associated with the company - type: string - segments: - description: List of segments - type: array - items: - type: - - "null" - - object - properties: - type: - description: The type of the segment - type: string - id: - description: The ID of the segment - type: string - plan: - description: Details of the company's subscription plan - type: - - "null" - - object - properties: - id: - description: The ID of the subscription plan - type: - - "null" - - string - name: - description: The name of the subscription plan - type: - - "null" - - string - type: - description: The type of the subscription plan - type: - - "null" - - string - custom_attributes: - description: Custom attributes specific to the company - type: - - "null" - - object - additionalProperties: true - industry: - description: The industry in which the company operates - type: - - "null" - - string - remote_created_at: - description: The remote date and time when the company was created - type: - - "null" - - integer - website: - description: The website of the company - type: - - "null" - - string - type: DeclarativeStream - name: "companies" - primary_key: "id" - parent_key: "id" - partition_field: "id" - schema_loader: - type: InlineSchemaLoader - schema: - type: object - properties: - created_at: - description: The timestamp when the company segment was created. - type: + - string + description: The category or type of the company segment. + count: + type: - "null" - integer - count: - description: The count of company segments returned in the response. - type: + description: The count of company segments returned in the response. + created_at: + type: - "null" - integer - id: - description: The unique identifier associated with the company segment. - type: - - "null" - - string - name: - description: The name of the company segment. - type: + description: The timestamp when the company segment was created. + id: + type: - "null" - string + description: The unique identifier associated with the company segment. + name: type: - description: The category or type of the company segment. - type: - "null" - string - person_type: - description: The type of person associated with the company segment. - type: + description: The name of the company segment. + person_type: + type: - "null" - string - updated_at: - description: The timestamp when the company segment was last updated. - type: + description: The type of person associated with the company segment. + updated_at: + type: - "null" - integer - type: DeclarativeStream - name: "company_segments" - primary_key: "id" -check: - stream_names: - - "tags" - type: CheckStream -spec: - type: Spec - documentation_url: https://docs.airbyte.com/integrations/sources/intercom - connection_specification: - $schema: http://json-schema.org/draft-07/schema# - title: Source Intercom Spec - type: object - required: - - start_date - - access_token - additionalProperties: true - properties: - start_date: - type: string - title: Start date - description: UTC date and time in the format 2017-01-25T00:00:00Z. Any data - before this date will not be replicated. - examples: - - '2020-11-16T00:00:00Z' - pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" - format: date-time - access_token: - title: Access token - type: string - description: Access token for making authenticated requests. See the Intercom - docs for more information. - airbyte_secret: true - order: 0 - client_id: - title: Client Id - type: string - description: Client Id for your Intercom application. - airbyte_secret: true - order: 1 - client_secret: - title: Client Secret - type: string - description: Client Secret for your Intercom application. - airbyte_secret: true - order: 2 - activity_logs_time_step: - type: integer - default: 30 - minimum: 1 - maximum: 91 - title: Activity logs stream slice step size (in days) - description: Set lower value in case of failing long running sync of Activity - Logs stream. - examples: - - 30 - - 10 - - 5 - order: 3 - advanced_auth: - auth_flow_type: oauth2.0 - oauth_config_specification: - complete_oauth_output_specification: - type: object - properties: - access_token: - type: string - path_in_connector_config: - - access_token - complete_oauth_server_input_specification: - type: object - properties: - client_id: - type: string - client_secret: - type: string - complete_oauth_server_output_specification: - type: object - properties: - client_id: - type: string - path_in_connector_config: - - client_id - client_secret: - type: string - path_in_connector_config: - - client_secret -type: DeclarativeSource + description: The timestamp when the company segment was last updated. From bc8558661cc7751944e41ab13004712f68115392 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Fri, 13 Dec 2024 02:01:15 +0530 Subject: [PATCH 05/20] add stream hash after testing without custom components --- .../connectors/source-intercom/manifest.yaml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index e6c883055e37..871202afb5e8 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -866,6 +866,69 @@ metadata: hasRecords: true primaryKeysArePresent: true primaryKeysAreUnique: true + admins: + streamHash: 62fdd12c98bec28f09edd3a34cd16bc5c1afedb6 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + tags: + streamHash: 53f9b051b3d5c8747598b848c006c80f3ffc5957 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + teams: + streamHash: d27cc586e29ddf6347d6356ea4970af99b7980c1 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + segments: + streamHash: 96ba554609834b986e20813cedf03a96183196fd + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + companies: + streamHash: 801c62e3a0a4028608efc4bf5f1ad5119b986973 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + company_attributes: + streamHash: e59558fb65b2c762d2b3f6b67e9071db2773cf13 + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: false + contact_attributes: + streamHash: 70d4afa7c3ad63877ab1fd9c185bd58c27ce06bc + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: true + contacts: + streamHash: e796494e6a861bce39d40f66e78e19b9ec633e29 + hasResponse: true + responsesAreSuccessful: true + hasRecords: false + primaryKeysArePresent: true + primaryKeysAreUnique: true + conversations: + streamHash: 5838b59eba7d58cae3fe42eca72062bc9d29e1c4 + hasResponse: true + responsesAreSuccessful: true + hasRecords: false + primaryKeysArePresent: true + primaryKeysAreUnique: true assist: {} schemas: From f657d4d5e83f5ffa8e50414cefad6c5842685a75 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Fri, 13 Dec 2024 02:26:39 +0530 Subject: [PATCH 06/20] test failing streams --- .../connectors/source-intercom/acceptance-test-config.yml | 3 +++ .../connectors/source-intercom/manifest.yaml | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml index 1645a17ccafe..bbcd393ac644 100644 --- a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml @@ -20,6 +20,9 @@ acceptance_tests: - config_path: "secrets/config.json" expect_records: path: "integration_tests/expected_records.jsonl" + empty_streams: + - name: conversation_parts + bypass_reason: Deeply nested response which could not be seeded with sandbox incremental: tests: - config_path: "secrets/config.json" diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index 871202afb5e8..f7d6f5435656 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -929,6 +929,13 @@ metadata: hasRecords: false primaryKeysArePresent: true primaryKeysAreUnique: true + company_segments: + streamHash: 41220115640c54deccc0e5a421991a60aa808d3c + hasResponse: true + responsesAreSuccessful: true + hasRecords: true + primaryKeysArePresent: true + primaryKeysAreUnique: false assist: {} schemas: From e1b4716b3d84c5a4fe3b6c67d1e1c97a6d586cd4 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Fri, 13 Dec 2024 04:09:18 +0530 Subject: [PATCH 07/20] update incremental parent --- .../connectors/source-intercom/components.py | 104 ----------- .../connectors/source-intercom/manifest.yaml | 162 +++++++++--------- 2 files changed, 83 insertions(+), 183 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/components.py b/airbyte-integrations/connectors/source-intercom/components.py index 4d3670c9490d..17dd57269570 100644 --- a/airbyte-integrations/connectors/source-intercom/components.py +++ b/airbyte-integrations/connectors/source-intercom/components.py @@ -133,110 +133,6 @@ def is_greater_than_or_equal(self, first: Record, second: Record) -> bool: return False -@dataclass -class IncrementalSubstreamSlicerCursor(IncrementalSingleSliceCursor): - parent_stream_configs: List[ParentStreamConfig] - parent_complete_fetch: bool = field(default=False) - - def __post_init__(self, parameters: Mapping[str, Any]): - super().__post_init__(parameters) - - if not self.parent_stream_configs: - raise ValueError("IncrementalSubstreamSlicer needs at least 1 parent stream") - - # parent stream parts - self.parent_config: ParentStreamConfig = self.parent_stream_configs[0] - self.parent_stream: Stream = self.parent_config.stream - self.parent_stream_name: str = self.parent_stream.name - self.parent_cursor_field: str = self.parent_stream.cursor_field - self.parent_sync_mode: SyncMode = SyncMode.incremental if self.parent_stream.supports_incremental is True else SyncMode.full_refresh - self.substream_slice_field: str = self.parent_stream_configs[0].partition_field.eval(self.config) - self.parent_field: str = self.parent_stream_configs[0].parent_key.eval(self.config) - self._parent_cursor: Optional[str] = None - - def set_initial_state(self, stream_state: StreamState): - super().set_initial_state(stream_state=stream_state) - if self.parent_stream_name in stream_state and stream_state.get(self.parent_stream_name, {}).get(self.parent_cursor_field): - parent_stream_state = { - self.parent_cursor_field: stream_state[self.parent_stream_name][self.parent_cursor_field], - } - self._state[self.parent_stream_name] = parent_stream_state - if "prior_state" in self._state: - self._state["prior_state"][self.parent_stream_name] = parent_stream_state - - def observe(self, stream_slice: StreamSlice, record: Record) -> None: - """ - Extended the default method to be able to track the parent STATE. - """ - - # save parent cursor value (STATE) from slice - parent_cursor = stream_slice.get(self.parent_stream_name) - if parent_cursor: - self._parent_cursor = parent_cursor.get(self.parent_cursor_field) - - # observe the substream - super().observe(stream_slice, record) - - def close_slice(self, stream_slice: StreamSlice, *args: Any) -> None: - super().close_slice(stream_slice, *args) - - def stream_slices(self) -> Iterable[Mapping[str, Any]]: - parent_state = (self._state or {}).get(self.parent_stream_name, {}) - slices_generator: Iterable[StreamSlice] = self.read_parent_stream(self.parent_sync_mode, self.parent_cursor_field, parent_state) - yield from [slice for slice in slices_generator] if self.parent_complete_fetch else slices_generator - - def track_parent_cursor(self, parent_record: dict) -> None: - """ - Tracks the Parent Stream Cursor, using `parent_cursor_field`. - """ - self._parent_cursor = parent_record.get(self.parent_cursor_field) - if self._parent_cursor: - self._state[self.parent_stream_name] = {self.parent_cursor_field: self._parent_cursor} - - def read_parent_stream( - self, - sync_mode: SyncMode, - cursor_field: Optional[str], - stream_state: Mapping[str, Any], - ) -> Iterable[Mapping[str, Any]]: - - self.parent_stream.state = stream_state - - parent_stream_slices_gen = self.parent_stream.stream_slices( - sync_mode=sync_mode, - cursor_field=cursor_field, - stream_state=stream_state, - ) - - for parent_slice in parent_stream_slices_gen: - parent_records_gen = self.parent_stream.read_records( - sync_mode=sync_mode, - cursor_field=cursor_field, - stream_slice=parent_slice, - stream_state=stream_state, - ) - - for parent_record in parent_records_gen: - # update parent cursor - self.track_parent_cursor(parent_record) - substream_slice_value = parent_record.get(self.parent_field) - if substream_slice_value: - cursor_field = self.cursor_field.eval(self.config) - substream_cursor_value = self._state.get(cursor_field) - parent_cursor_value = self._state.get(self.parent_stream_name, {}).get(self.parent_cursor_field) - yield StreamSlice( - partition={ - self.substream_slice_field: substream_slice_value, - }, - cursor_slice={ - cursor_field: substream_cursor_value, - self.parent_stream_name: { - self.parent_cursor_field: parent_cursor_value, - }, - }, - ) - - @dataclass class IntercomRateLimiter: """ diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index f7d6f5435656..f0568d496826 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -21,20 +21,20 @@ definitions: path: admins/activity_logs http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -82,20 +82,20 @@ definitions: path: admins http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -108,8 +108,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -133,20 +133,20 @@ definitions: path: tags http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -159,8 +159,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -184,20 +184,20 @@ definitions: path: teams http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -210,8 +210,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -235,20 +235,20 @@ definitions: path: segments http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -269,8 +269,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -298,8 +298,8 @@ definitions: path: companies/scroll http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CompositeErrorHandler error_handlers: @@ -352,8 +352,8 @@ definitions: field_name: scroll_param page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -383,20 +383,20 @@ definitions: request_parameters: model: company request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -409,8 +409,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -436,20 +436,20 @@ definitions: request_parameters: model: contact request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -462,8 +462,8 @@ definitions: type: RequestPath page_size_option: type: RequestOption - inject_into: request_parameter field_name: per_page + inject_into: request_parameter pagination_strategy: type: CursorPagination page_size: 150 @@ -485,9 +485,10 @@ definitions: path: contacts/search http_method: POST request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" request_body_json: + sort: "{'field': 'updated_at', 'order': 'ascending'}" query: >- { 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': '>', 'value': {{ stream_slice.get('prior_state', @@ -497,7 +498,6 @@ definitions: stream_slice.get('prior_state', stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} }, ], } - sort: "{'field': 'updated_at', 'order': 'ascending'}" pagination: >- { 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') }}, @@ -508,13 +508,13 @@ definitions: class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -556,9 +556,10 @@ definitions: path: conversations/search http_method: POST request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" request_body_json: + sort: "{'field': 'updated_at', 'order': 'ascending'}" query: >- { 'operator': 'OR', 'value': [ { 'field': 'updated_at', 'operator': '>', 'value': {{ stream_slice.get('prior_state', @@ -568,7 +569,6 @@ definitions: stream_slice.get('prior_state', stream_state.get('prior_state', {})).get('updated_at') or format_datetime(config['start_date'], '%s') }} }, ], } - sort: "{'field': 'updated_at', 'order': 'ascending'}" pagination: >- { 'per_page': {{ parameters.get('page_size') }}, 'page': {{ next_page_token.get('next_page_token').get('page') }}, @@ -579,13 +579,13 @@ definitions: class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -627,17 +627,17 @@ definitions: path: /conversations/{{ stream_slice.id }} http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CompositeErrorHandler error_handlers: - type: DefaultErrorHandler response_filters: - type: HttpResponseFilter + action: IGNORE http_codes: - 404 - action: IGNORE record_selector: type: RecordSelector extractor: @@ -659,9 +659,10 @@ definitions: partition_field: id stream: $ref: "#/definitions/streams/conversations" + incremental_dependency: true incremental_sync: type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor cursor_field: updated_at transformations: - type: AddFields @@ -685,20 +686,20 @@ definitions: path: /companies/{{ stream_slice.id }}/segments http_method: GET request_headers: - Intercom-Version: "2.11" Accept: application/json + Intercom-Version: "2.11" error_handler: type: CustomErrorHandler class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter response_filters: - type: HttpResponseFilter - error_message_contains: Active subscription needed action: FAIL failure_type: config_error error_message: >- Failed to perform request. Error: Active subscription needed. Please, validate your current Intercom plan to continue using API. + error_message_contains: Active subscription needed record_selector: type: RecordSelector extractor: @@ -719,9 +720,10 @@ definitions: partition_field: id stream: $ref: "#/definitions/streams/companies" + incremental_dependency: true incremental_sync: type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor cursor_field: updated_at schema_loader: type: InlineSchemaLoader @@ -763,55 +765,55 @@ spec: Access token for making authenticated requests. See the Intercom docs for more information. + order: 0 title: Access token airbyte_secret: true - order: 0 client_id: type: string description: Client Id for your Intercom application. + order: 1 title: Client Id airbyte_secret: true - order: 1 client_secret: type: string description: Client Secret for your Intercom application. + order: 2 title: Client Secret airbyte_secret: true - order: 2 activity_logs_time_step: type: integer description: >- Set lower value in case of failing long running sync of Activity Logs stream. + order: 3 + title: Activity logs stream slice step size (in days) default: 30 - minimum: 1 maximum: 91 - title: Activity logs stream slice step size (in days) + minimum: 1 examples: - 30 - 10 - 5 - order: 3 lookback_window: type: integer description: The number of days to shift the state value backward for record sync + order: 4 title: Lookback window - examples: - - 60 default: 0 minimum: 0 - order: 4 + examples: + - 60 start_date: type: string description: >- UTC date and time in the format 2017-01-25T00:00:00Z. Any data before this date will not be replicated. + order: 5 title: Start date + format: date-time + pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ examples: - "2020-11-16T00:00:00Z" - pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ - format: date-time - order: 5 additionalProperties: true metadata: @@ -860,82 +862,84 @@ metadata: - incrementalSync testedStreams: activity_logs: + hasRecords: true streamHash: dae54ab01efc8a7c580121de6902d67a82a87775 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true admins: + hasRecords: true streamHash: 62fdd12c98bec28f09edd3a34cd16bc5c1afedb6 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true tags: + hasRecords: true streamHash: 53f9b051b3d5c8747598b848c006c80f3ffc5957 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true teams: + hasRecords: true streamHash: d27cc586e29ddf6347d6356ea4970af99b7980c1 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true segments: + hasRecords: true streamHash: 96ba554609834b986e20813cedf03a96183196fd hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true companies: + hasRecords: true streamHash: 801c62e3a0a4028608efc4bf5f1ad5119b986973 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true company_attributes: + hasRecords: true streamHash: e59558fb65b2c762d2b3f6b67e9071db2773cf13 hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: false + primaryKeysArePresent: true + responsesAreSuccessful: true contact_attributes: + hasRecords: true streamHash: 70d4afa7c3ad63877ab1fd9c185bd58c27ce06bc hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true contacts: + hasRecords: false streamHash: e796494e6a861bce39d40f66e78e19b9ec633e29 hasResponse: true - responsesAreSuccessful: true - hasRecords: false - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true conversations: + hasRecords: false streamHash: 5838b59eba7d58cae3fe42eca72062bc9d29e1c4 hasResponse: true - responsesAreSuccessful: true - hasRecords: false - primaryKeysArePresent: true primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + conversation_parts: + streamHash: 67469544cde547846d7636a110f775313d6e04fc company_segments: + hasRecords: true streamHash: 41220115640c54deccc0e5a421991a60aa808d3c hasResponse: true - responsesAreSuccessful: true - hasRecords: true - primaryKeysArePresent: true primaryKeysAreUnique: false + primaryKeysArePresent: true + responsesAreSuccessful: true assist: {} schemas: From 9b9daf97d825f4411949198e30a295694aac997c Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Fri, 13 Dec 2024 04:37:12 +0530 Subject: [PATCH 08/20] update test scenarios --- .../integration_tests/abnormal_state.json | 23 ++++++------------- .../integration_tests/expected_records.jsonl | 3 --- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json index e874bc451c67..9799a92860d8 100755 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json @@ -6,7 +6,7 @@ "name": "segments" }, "stream_state": { - "updated_at": 7626086649 + "updated_at": 9626086649 } } }, @@ -17,7 +17,7 @@ "name": "companies" }, "stream_state": { - "updated_at": 7626086649 + "updated_at": 9626086649 } } }, @@ -28,10 +28,7 @@ "name": "company_segments" }, "stream_state": { - "updated_at": 7626086649, - "companies": { - "updated_at": 7626086649 - } + "updated_at": 9626086649 } } }, @@ -42,10 +39,7 @@ "name": "conversations" }, "stream_state": { - "updated_at": 7626086649, - "conversations": { - "updated_at": 7626086649 - } + "updated_at": 9626086649 } } }, @@ -56,10 +50,7 @@ "name": "conversation_parts" }, "stream_state": { - "updated_at": 7626086649, - "conversations": { - "updated_at": 7626086649 - } + "updated_at": 9626086649 } } }, @@ -70,7 +61,7 @@ "name": "contacts" }, "stream_state": { - "updated_at": 7626086649 + "updated_at": 9626086649 } } }, @@ -81,7 +72,7 @@ "name": "activity_logs" }, "stream_state": { - "created_at": 7626086649 + "created_at": 9626086649 } } } diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl index d06ce90f22b7..26538cf32231 100644 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl @@ -28,9 +28,6 @@ {"stream": "conversations", "data": {"type": "conversation", "id": "1", "created_at": 1607553243, "updated_at": 1626346673, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "701718739", "delivered_as": "customer_initiated", "subject": "", "body": "

hey there

", "author": {"type": "lead", "id": "5fd150d50697b6d0bbc4a2c2", "name": null, "email": ""}, "attachments": [], "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d"}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "5fd150d50697b6d0bbc4a2c2"}]}, "first_contact_reply": {"created_at": 1607553243, "type": "conversation", "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d"}, "open": true, "state": "open", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": 4317957, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": 4317954, "first_contact_reply_at": 1607553243, "first_assignment_at": null, "first_admin_reply_at": 1625654131, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": 1607553246, "last_admin_reply_at": 1625656000, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 7}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "assignee": null}, "emitted_at": 1707747714058} {"stream": "conversations", "data": {"type": "conversation", "id": "60", "created_at": 1676461133, "updated_at": 1676461134, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "51952871", "delivered_as": "automated", "subject": "", "body": "

Test 3

", "author": {"type": "admin", "id": "4423433", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "url": null}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "63ea41a0eddb9b625fb712c9"}]}, "first_contact_reply": null, "open": true, "state": "open", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": null, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": null, "first_contact_reply_at": null, "first_assignment_at": null, "first_admin_reply_at": null, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": null, "last_admin_reply_at": null, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 2}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "assignee": {"type": "admin", "id": "4423433"}}, "emitted_at": 1707747714064} {"stream": "conversations", "data": {"type": "conversation", "id": "61", "created_at": 1676461196, "updated_at": 1676461197, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "51952963", "delivered_as": "automated", "subject": "", "body": "

Test 4

", "author": {"type": "admin", "id": "4423433", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "url": null}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "63ea41a1b0e17c53248c7956"}]}, "first_contact_reply": null, "open": true, "state": "open", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": null, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": null, "first_contact_reply_at": null, "first_assignment_at": null, "first_admin_reply_at": null, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": null, "last_admin_reply_at": null, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 2}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "assignee": {"type": "admin", "id": "4423433"}}, "emitted_at": 1707747714069} -{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288120839", "part_type": "comment", "body": "

is this showing up

", "created_at": 1607553246, "updated_at": 1607553246, "notified_at": 1607553246, "assigned_to": null, "author": {"id": "5fd150d50697b6d0bbc4a2c2", "type": "user", "name": null, "email": ""}, "attachments": [], "external_id": null, "conversation_id": "1"}, "emitted_at": 1707747716219} -{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288121348", "part_type": "comment", "body": "

Airbyte [DEV] will reply as soon as they can.

", "created_at": 1607553249, "updated_at": 1607553249, "notified_at": 1607553249, "assigned_to": null, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "conversation_id": "1"}, "emitted_at": 1707747716222} -{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288121392", "part_type": "comment", "body": "

Give the team a way to reach you:

", "created_at": 1607553250, "updated_at": 1607553250, "notified_at": 1607553250, "assigned_to": null, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "conversation_id": "1"}, "emitted_at": 1707747716225} {"stream": "company_segments", "data": {"type": "segment", "id": "63ea1a19d248071b8d297b39", "name": "Companies less then 100 people", "created_at": 1676286489, "updated_at": 1676461957, "person_type": "user"}, "emitted_at": 1707747722461} {"stream": "company_segments", "data": {"type": "segment", "id": "63eb62f228758099dbc7fabe", "name": "Companies not IT", "created_at": 1676370674, "updated_at": 1676461960, "person_type": "user"}, "emitted_at": 1707747722463} {"stream": "company_segments", "data": {"type": "segment", "id": "63eb63c3046264426ef4bfd6", "name": "Companies tag not 3", "created_at": 1676370883, "updated_at": 1676461915, "person_type": "user"}, "emitted_at": 1707747722465} From 7714da331950bb06463602756a12bebc00700554 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Sun, 15 Dec 2024 12:01:11 +0530 Subject: [PATCH 09/20] change incremental dependency --- airbyte-integrations/connectors/source-intercom/manifest.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index f0568d496826..1127143dfe43 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -659,7 +659,6 @@ definitions: partition_field: id stream: $ref: "#/definitions/streams/conversations" - incremental_dependency: true incremental_sync: type: CustomIncrementalSync class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor @@ -720,7 +719,6 @@ definitions: partition_field: id stream: $ref: "#/definitions/streams/companies" - incremental_dependency: true incremental_sync: type: CustomIncrementalSync class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor From d83859d128176f25bef7748e648d2b372d1f653b Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Mon, 16 Dec 2024 19:44:00 +0530 Subject: [PATCH 10/20] revert back custom components --- .../connectors/source-intercom/components.py | 104 ++++++++++++++++++ .../connectors/source-intercom/manifest.yaml | 6 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/components.py b/airbyte-integrations/connectors/source-intercom/components.py index 17dd57269570..4d3670c9490d 100644 --- a/airbyte-integrations/connectors/source-intercom/components.py +++ b/airbyte-integrations/connectors/source-intercom/components.py @@ -133,6 +133,110 @@ def is_greater_than_or_equal(self, first: Record, second: Record) -> bool: return False +@dataclass +class IncrementalSubstreamSlicerCursor(IncrementalSingleSliceCursor): + parent_stream_configs: List[ParentStreamConfig] + parent_complete_fetch: bool = field(default=False) + + def __post_init__(self, parameters: Mapping[str, Any]): + super().__post_init__(parameters) + + if not self.parent_stream_configs: + raise ValueError("IncrementalSubstreamSlicer needs at least 1 parent stream") + + # parent stream parts + self.parent_config: ParentStreamConfig = self.parent_stream_configs[0] + self.parent_stream: Stream = self.parent_config.stream + self.parent_stream_name: str = self.parent_stream.name + self.parent_cursor_field: str = self.parent_stream.cursor_field + self.parent_sync_mode: SyncMode = SyncMode.incremental if self.parent_stream.supports_incremental is True else SyncMode.full_refresh + self.substream_slice_field: str = self.parent_stream_configs[0].partition_field.eval(self.config) + self.parent_field: str = self.parent_stream_configs[0].parent_key.eval(self.config) + self._parent_cursor: Optional[str] = None + + def set_initial_state(self, stream_state: StreamState): + super().set_initial_state(stream_state=stream_state) + if self.parent_stream_name in stream_state and stream_state.get(self.parent_stream_name, {}).get(self.parent_cursor_field): + parent_stream_state = { + self.parent_cursor_field: stream_state[self.parent_stream_name][self.parent_cursor_field], + } + self._state[self.parent_stream_name] = parent_stream_state + if "prior_state" in self._state: + self._state["prior_state"][self.parent_stream_name] = parent_stream_state + + def observe(self, stream_slice: StreamSlice, record: Record) -> None: + """ + Extended the default method to be able to track the parent STATE. + """ + + # save parent cursor value (STATE) from slice + parent_cursor = stream_slice.get(self.parent_stream_name) + if parent_cursor: + self._parent_cursor = parent_cursor.get(self.parent_cursor_field) + + # observe the substream + super().observe(stream_slice, record) + + def close_slice(self, stream_slice: StreamSlice, *args: Any) -> None: + super().close_slice(stream_slice, *args) + + def stream_slices(self) -> Iterable[Mapping[str, Any]]: + parent_state = (self._state or {}).get(self.parent_stream_name, {}) + slices_generator: Iterable[StreamSlice] = self.read_parent_stream(self.parent_sync_mode, self.parent_cursor_field, parent_state) + yield from [slice for slice in slices_generator] if self.parent_complete_fetch else slices_generator + + def track_parent_cursor(self, parent_record: dict) -> None: + """ + Tracks the Parent Stream Cursor, using `parent_cursor_field`. + """ + self._parent_cursor = parent_record.get(self.parent_cursor_field) + if self._parent_cursor: + self._state[self.parent_stream_name] = {self.parent_cursor_field: self._parent_cursor} + + def read_parent_stream( + self, + sync_mode: SyncMode, + cursor_field: Optional[str], + stream_state: Mapping[str, Any], + ) -> Iterable[Mapping[str, Any]]: + + self.parent_stream.state = stream_state + + parent_stream_slices_gen = self.parent_stream.stream_slices( + sync_mode=sync_mode, + cursor_field=cursor_field, + stream_state=stream_state, + ) + + for parent_slice in parent_stream_slices_gen: + parent_records_gen = self.parent_stream.read_records( + sync_mode=sync_mode, + cursor_field=cursor_field, + stream_slice=parent_slice, + stream_state=stream_state, + ) + + for parent_record in parent_records_gen: + # update parent cursor + self.track_parent_cursor(parent_record) + substream_slice_value = parent_record.get(self.parent_field) + if substream_slice_value: + cursor_field = self.cursor_field.eval(self.config) + substream_cursor_value = self._state.get(cursor_field) + parent_cursor_value = self._state.get(self.parent_stream_name, {}).get(self.parent_cursor_field) + yield StreamSlice( + partition={ + self.substream_slice_field: substream_slice_value, + }, + cursor_slice={ + cursor_field: substream_cursor_value, + self.parent_stream_name: { + self.parent_cursor_field: parent_cursor_value, + }, + }, + ) + + @dataclass class IntercomRateLimiter: """ diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index 1127143dfe43..08ab46cafdef 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -661,7 +661,8 @@ definitions: $ref: "#/definitions/streams/conversations" incremental_sync: type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + class_name: >- + source_declarative_manifest.components.IncrementalSubstreamSlicerCursor cursor_field: updated_at transformations: - type: AddFields @@ -721,7 +722,8 @@ definitions: $ref: "#/definitions/streams/companies" incremental_sync: type: CustomIncrementalSync - class_name: source_declarative_manifest.components.IncrementalSingleSliceCursor + class_name: >- + source_declarative_manifest.components.IncrementalSubstreamSlicerCursor cursor_field: updated_at schema_loader: type: InlineSchemaLoader From cbc9a6229104653bb42d0f8f8853b0cbc79e8f10 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Mon, 16 Dec 2024 20:47:39 +0530 Subject: [PATCH 11/20] update incremental sync --- .../connectors/source-intercom/manifest.yaml | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index 08ab46cafdef..87b11e536025 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -660,10 +660,20 @@ definitions: stream: $ref: "#/definitions/streams/conversations" incremental_sync: - type: CustomIncrementalSync - class_name: >- - source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + type: DatetimeBasedCursor cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config[\"start_date\"] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" transformations: - type: AddFields fields: @@ -721,10 +731,20 @@ definitions: stream: $ref: "#/definitions/streams/companies" incremental_sync: - type: CustomIncrementalSync - class_name: >- - source_declarative_manifest.components.IncrementalSubstreamSlicerCursor + type: DatetimeBasedCursor cursor_field: updated_at + cursor_datetime_formats: + - "%s" + - "%ms" + datetime_format: "%s" + start_datetime: + type: MinMaxDatetime + datetime: "{{ config[\"start_date\"] }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" + end_datetime: + type: MinMaxDatetime + datetime: "{{ now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}" + datetime_format: "%Y-%m-%dT%H:%M:%SZ" schema_loader: type: InlineSchemaLoader schema: @@ -855,11 +875,8 @@ metadata: conversations: - errorHandler - incrementalSync - conversation_parts: - - incrementalSync company_segments: - errorHandler - - incrementalSync testedStreams: activity_logs: hasRecords: true From d85b7941934dcd16362cc60263c853b185f1e190 Mon Sep 17 00:00:00 2001 From: ChristoGrab Date: Mon, 16 Dec 2024 15:25:25 -0800 Subject: [PATCH 12/20] feat: re-implement unit tests --- .../source-intercom/unit_tests/conftest.py | 3 + .../source-intercom/unit_tests/poetry.lock | 1992 +++++++++++++++++ .../source-intercom/unit_tests/pyproject.toml | 16 + .../unit_tests/test_components.py | 100 + 4 files changed, 2111 insertions(+) create mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/conftest.py create mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock create mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/pyproject.toml create mode 100644 airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/conftest.py b/airbyte-integrations/connectors/source-intercom/unit_tests/conftest.py new file mode 100644 index 000000000000..d3826f66680c --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/conftest.py @@ -0,0 +1,3 @@ +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. + +pytest_plugins = ["airbyte_cdk.test.utils.manifest_only_fixtures"] diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock b/airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock new file mode 100644 index 000000000000..847fa693b143 --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock @@ -0,0 +1,1992 @@ +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "airbyte-cdk" +version = "6.10.0" +description = "A framework for writing Airbyte Connectors." +optional = false +python-versions = "<3.13,>=3.10" +files = [ + {file = "airbyte_cdk-6.10.0-py3-none-any.whl", hash = "sha256:0f953711332dae67f294751044bc4abfcd988c40a176a32e2d02d2a679377acf"}, + {file = "airbyte_cdk-6.10.0.tar.gz", hash = "sha256:90aeb0a87e89e9fc43f27ebccabb64ac96966ce2f398805c93a52cd4580a4641"}, +] + +[package.dependencies] +airbyte-protocol-models-dataclasses = ">=0.14,<0.15" +backoff = "*" +cachetools = "*" +cryptography = ">=42.0.5,<44.0.0" +dpath = ">=2.1.6,<3.0.0" +dunamai = ">=1.22.0,<2.0.0" +genson = "1.3.0" +isodate = ">=0.6.1,<0.7.0" +Jinja2 = ">=3.1.2,<3.2.0" +jsonref = ">=0.2,<0.3" +jsonschema = ">=4.17.3,<4.18.0" +langchain_core = "0.1.42" +nltk = "3.9.1" +numpy = "<2" +orjson = ">=3.10.7,<4.0.0" +pandas = "2.2.2" +pendulum = "<3.0.0" +psutil = "6.1.0" +pydantic = ">=2.7,<3.0" +pyjwt = ">=2.8.0,<3.0.0" +pyrate-limiter = ">=3.1.0,<3.2.0" +python-dateutil = "*" +python-ulid = ">=3.0.0,<4.0.0" +pytz = "2024.1" +PyYAML = ">=6.0.1,<7.0.0" +rapidfuzz = ">=3.10.1,<4.0.0" +requests = "*" +requests_cache = "*" +serpyco-rs = ">=1.10.2,<2.0.0" +wcmatch = "10.0" +xmltodict = ">=0.13.0,<0.14.0" + +[package.extras] +file-based = ["avro (>=1.11.2,<1.12.0)", "fastavro (>=1.8.0,<1.9.0)", "markdown", "pdf2image (==1.16.3)", "pdfminer.six (==20221105)", "pyarrow (>=15.0.0,<15.1.0)", "pytesseract (==0.3.10)", "python-calamine (==0.2.3)", "python-snappy (==0.7.3)", "unstructured.pytesseract (>=0.3.12)", "unstructured[docx,pptx] (==0.10.27)"] +sql = ["sqlalchemy (>=2.0,!=2.0.36,<3.0)"] +vector-db-based = ["cohere (==4.21)", "langchain (==0.1.16)", "openai[embeddings] (==0.27.9)", "tiktoken (==0.8.0)"] + +[[package]] +name = "airbyte-protocol-models-dataclasses" +version = "0.14.1" +description = "Declares the Airbyte Protocol using Python Dataclasses. Dataclasses in Python have less performance overhead compared to Pydantic models, making them a more efficient choice for scenarios where speed and memory usage are critical" +optional = false +python-versions = ">=3.8" +files = [ + {file = "airbyte_protocol_models_dataclasses-0.14.1-py3-none-any.whl", hash = "sha256:dfe10b32ee09e6ba9b4f17bd309e841b61cbd61ec8f80b1937ff104efd6209a9"}, + {file = "airbyte_protocol_models_dataclasses-0.14.1.tar.gz", hash = "sha256:f62a46556b82ea0d55de144983141639e8049d836dd4e0a9d7234c5b2e103c08"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "attributes-doc" +version = "0.4.0" +description = "PEP 224 implementation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "attributes-doc-0.4.0.tar.gz", hash = "sha256:b1576c94a714e9fc2c65c47cf10d0c8e1a5f7c4f5ae7f69006be108d95cbfbfb"}, + {file = "attributes_doc-0.4.0-py2.py3-none-any.whl", hash = "sha256:4c3007d9e58f3a6cb4b9c614c4d4ce2d92161581f28e594ddd8241cc3a113bdd"}, +] + +[[package]] +name = "attrs" +version = "24.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +files = [ + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "bracex" +version = "2.5.post1" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6"}, + {file = "bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6"}, +] + +[[package]] +name = "cachetools" +version = "5.5.0" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, +] + +[[package]] +name = "cattrs" +version = "24.1.2" +description = "Composable complex class support for attrs and dataclasses." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cattrs-24.1.2-py3-none-any.whl", hash = "sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0"}, + {file = "cattrs-24.1.2.tar.gz", hash = "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"}, +] + +[package.dependencies] +attrs = ">=23.1.0" +exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.4.0)"] +cbor2 = ["cbor2 (>=5.4.6)"] +msgpack = ["msgpack (>=1.0.5)"] +msgspec = ["msgspec (>=0.18.5)"] +orjson = ["orjson (>=3.9.2)"] +pyyaml = ["pyyaml (>=6.0)"] +tomlkit = ["tomlkit (>=0.11.8)"] +ujson = ["ujson (>=5.7.0)"] + +[[package]] +name = "certifi" +version = "2024.12.14" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "dpath" +version = "2.2.0" +description = "Filesystem-like pathing and searching for dictionaries" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576"}, + {file = "dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e"}, +] + +[[package]] +name = "dunamai" +version = "1.23.0" +description = "Dynamic version generation" +optional = false +python-versions = ">=3.5" +files = [ + {file = "dunamai-1.23.0-py3-none-any.whl", hash = "sha256:a0906d876e92441793c6a423e16a4802752e723e9c9a5aabdc5535df02dbe041"}, + {file = "dunamai-1.23.0.tar.gz", hash = "sha256:a163746de7ea5acb6dacdab3a6ad621ebc612ed1e528aaa8beedb8887fccd2c4"}, +] + +[package.dependencies] +packaging = ">=20.9" + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "genson" +version = "1.3.0" +description = "GenSON is a powerful, user-friendly JSON Schema generator." +optional = false +python-versions = "*" +files = [ + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = false +python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonref" +version = "0.2" +description = "An implementation of JSON Reference for Python" +optional = false +python-versions = "*" +files = [ + {file = "jsonref-0.2-py3-none-any.whl", hash = "sha256:b1e82fa0b62e2c2796a13e5401fe51790b248f6d9bf9d7212a3e31a3501b291f"}, + {file = "jsonref-0.2.tar.gz", hash = "sha256:f3c45b121cf6257eafabdc3a8008763aed1cd7da06dbabc59a9e4d2a5e4e6697"}, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "langchain-core" +version = "0.1.42" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.1.42-py3-none-any.whl", hash = "sha256:c5653ffa08a44f740295c157a24c0def4a753333f6a2c41f76bf431cd00be8b5"}, + {file = "langchain_core-0.1.42.tar.gz", hash = "sha256:40751bf60ea5d8e2b2efe65290db434717ee3834870c002e40e2811f09d814e6"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.0,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langsmith" +version = "0.1.147" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.147-py3-none-any.whl", hash = "sha256:7166fc23b965ccf839d64945a78e9f1157757add228b086141eb03a60d699a15"}, + {file = "langsmith-0.1.147.tar.gz", hash = "sha256:2e933220318a4e73034657103b3b1a3a6109cc5db3566a7e8e03be8d6d7def7a"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] +requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" + +[package.extras] +langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "nltk" +version = "3.9.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "orjson" +version = "3.10.12" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, + {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, + {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, + {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, + {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, + {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, + {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, + {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, + {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, + {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, + {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, + {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, + {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, + {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, + {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, + {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, + {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, + {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, + {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, + {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, + {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, + {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, + {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, + {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, + {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, + {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, + {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, + {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, + {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, + {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, + {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.10.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.27.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyjwt" +version = "2.10.1" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyrate-limiter" +version = "3.1.1" +description = "Python Rate-Limiter using Leaky-Bucket Algorithm" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "pyrate_limiter-3.1.1-py3-none-any.whl", hash = "sha256:c51906f1d51d56dc992ff6c26e8300e32151bc6cfa3e6559792e31971dfd4e2b"}, + {file = "pyrate_limiter-3.1.1.tar.gz", hash = "sha256:2f57eda712687e6eccddf6afe8f8a15b409b97ed675fe64a626058f12863b7b7"}, +] + +[package.extras] +all = ["filelock (>=3.0)", "redis (>=5.0.0,<6.0.0)"] +docs = ["furo (>=2022.3.4,<2023.0.0)", "myst-parser (>=0.17)", "sphinx (>=4.3.0,<5.0.0)", "sphinx-autodoc-typehints (>=1.17,<2.0)", "sphinx-copybutton (>=0.5)", "sphinxcontrib-apidoc (>=0.3,<0.4)"] + +[[package]] +name = "pyrsistent" +version = "0.20.0" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, + {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, + {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, + {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, + {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, + {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, + {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, +] + +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-ulid" +version = "3.0.0" +description = "Universally unique lexicographically sortable identifier" +optional = false +python-versions = ">=3.9" +files = [ + {file = "python_ulid-3.0.0-py3-none-any.whl", hash = "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31"}, + {file = "python_ulid-3.0.0.tar.gz", hash = "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f"}, +] + +[package.extras] +pydantic = ["pydantic (>=2.0)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "rapidfuzz" +version = "3.10.1" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f17d9f21bf2f2f785d74f7b0d407805468b4c173fa3e52c86ec94436b338e74a"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b31f358a70efc143909fb3d75ac6cd3c139cd41339aa8f2a3a0ead8315731f2b"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4f43f2204b56a61448ec2dd061e26fd344c404da99fb19f3458200c5874ba2"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d81bf186a453a2757472133b24915768abc7c3964194406ed93e170e16c21cb"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3611c8f45379a12063d70075c75134f2a8bd2e4e9b8a7995112ddae95ca1c982"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c3b537b97ac30da4b73930fa8a4fe2f79c6d1c10ad535c5c09726612cd6bed9"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231ef1ec9cf7b59809ce3301006500b9d564ddb324635f4ea8f16b3e2a1780da"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed4f3adc1294834955b7e74edd3c6bd1aad5831c007f2d91ea839e76461a5879"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b6015da2e707bf632a71772a2dbf0703cff6525732c005ad24987fe86e8ec32"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b35a118d61d6f008e8e3fb3a77674d10806a8972c7b8be433d6598df4d60b01"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bc308d79a7e877226f36bdf4e149e3ed398d8277c140be5c1fd892ec41739e6d"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f017dbfecc172e2d0c37cf9e3d519179d71a7f16094b57430dffc496a098aa17"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win32.whl", hash = "sha256:36c0e1483e21f918d0f2f26799fe5ac91c7b0c34220b73007301c4f831a9c4c7"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:10746c1d4c8cd8881c28a87fd7ba0c9c102346dfe7ff1b0d021cdf093e9adbff"}, + {file = "rapidfuzz-3.10.1-cp310-cp310-win_arm64.whl", hash = "sha256:dfa64b89dcb906835e275187569e51aa9d546a444489e97aaf2cc84011565fbe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:92958ae075c87fef393f835ed02d4fe8d5ee2059a0934c6c447ea3417dfbf0e8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba7521e072c53e33c384e78615d0718e645cab3c366ecd3cc8cb732befd94967"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d02cbd75d283c287471b5b3738b3e05c9096150f93f2d2dfa10b3d700f2db9"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efa1582a397da038e2f2576c9cd49b842f56fde37d84a6b0200ffebc08d82350"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12912acee1f506f974f58de9fdc2e62eea5667377a7e9156de53241c05fdba8"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666d5d8b17becc3f53447bcb2b6b33ce6c2df78792495d1fa82b2924cd48701a"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26f71582c0d62445067ee338ddad99b655a8f4e4ed517a90dcbfbb7d19310474"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8a2ef08b27167bcff230ffbfeedd4c4fa6353563d6aaa015d725dd3632fc3de7"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:365e4fc1a2b95082c890f5e98489b894e6bf8c338c6ac89bb6523c2ca6e9f086"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1996feb7a61609fa842e6b5e0c549983222ffdedaf29644cc67e479902846dfe"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:cf654702f144beaa093103841a2ea6910d617d0bb3fccb1d1fd63c54dde2cd49"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec108bf25de674781d0a9a935030ba090c78d49def3d60f8724f3fc1e8e75024"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win32.whl", hash = "sha256:031f8b367e5d92f7a1e27f7322012f3c321c3110137b43cc3bf678505583ef48"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:f98f36c6a1bb9a6c8bbec99ad87c8c0e364f34761739b5ea9adf7b48129ae8cf"}, + {file = "rapidfuzz-3.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:f1da2028cb4e41be55ee797a82d6c1cf589442504244249dfeb32efc608edee7"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1340b56340896bede246f612b6ecf685f661a56aabef3d2512481bfe23ac5835"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2316515169b7b5a453f0ce3adbc46c42aa332cae9f2edb668e24d1fc92b2f2bb"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e06fe6a12241ec1b72c0566c6b28cda714d61965d86569595ad24793d1ab259"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d99c1cd9443b19164ec185a7d752f4b4db19c066c136f028991a480720472e23"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1d9aa156ed52d3446388ba4c2f335e312191d1ca9d1f5762ee983cf23e4ecf6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54bcf4efaaee8e015822be0c2c28214815f4f6b4f70d8362cfecbd58a71188ac"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0c955e32afdbfdf6e9ee663d24afb25210152d98c26d22d399712d29a9b976b"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191633722203f5b7717efcb73a14f76f3b124877d0608c070b827c5226d0b972"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:195baad28057ec9609e40385991004e470af9ef87401e24ebe72c064431524ab"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0fff4a6b87c07366662b62ae994ffbeadc472e72f725923f94b72a3db49f4671"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ffed25f9fdc0b287f30a98467493d1e1ce5b583f6317f70ec0263b3c97dbba6"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d02cf8e5af89a9ac8f53c438ddff6d773f62c25c6619b29db96f4aae248177c0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win32.whl", hash = "sha256:f3bb81d4fe6a5d20650f8c0afcc8f6e1941f6fecdb434f11b874c42467baded0"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:aaf83e9170cb1338922ae42d320699dccbbdca8ffed07faeb0b9257822c26e24"}, + {file = "rapidfuzz-3.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:c5da802a0d085ad81b0f62828fb55557996c497b2d0b551bbdfeafd6d447892f"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc22d69a1c9cccd560a5c434c0371b2df0f47c309c635a01a913e03bbf183710"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38b0dac2c8e057562b8f0d8ae5b663d2d6a28c5ab624de5b73cef9abb6129a24"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fde3bbb14e92ce8fcb5c2edfff72e474d0080cadda1c97785bf4822f037a309"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9141fb0592e55f98fe9ac0f3ce883199b9c13e262e0bf40c5b18cdf926109d16"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:237bec5dd1bfc9b40bbd786cd27949ef0c0eb5fab5eb491904c6b5df59d39d3c"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18123168cba156ab5794ea6de66db50f21bb3c66ae748d03316e71b27d907b95"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b75fe506c8e02769cc47f5ab21ce3e09b6211d3edaa8f8f27331cb6988779be"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da82aa4b46973aaf9e03bb4c3d6977004648c8638febfc0f9d237e865761270"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c34c022d5ad564f1a5a57a4a89793bd70d7bad428150fb8ff2760b223407cdcf"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e96c84d6c2a0ca94e15acb5399118fff669f4306beb98a6d8ec6f5dccab4412"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e8e154b84a311263e1aca86818c962e1fa9eefdd643d1d5d197fcd2738f88cb9"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:335fee93188f8cd585552bb8057228ce0111bd227fa81bfd40b7df6b75def8ab"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win32.whl", hash = "sha256:6729b856166a9e95c278410f73683957ea6100c8a9d0a8dbe434c49663689255"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e06d99ad1ad97cb2ef7f51ec6b1fedd74a3a700e4949353871cf331d07b382a"}, + {file = "rapidfuzz-3.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:8d1b7082104d596a3eb012e0549b2634ed15015b569f48879701e9d8db959dbb"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:779027d3307e1a2b1dc0c03c34df87a470a368a1a0840a9d2908baf2d4067956"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:440b5608ab12650d0390128d6858bc839ae77ffe5edf0b33a1551f2fa9860651"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cac41a411e07a6f3dc80dfbd33f6be70ea0abd72e99c59310819d09f07d945"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:958473c9f0bca250590200fd520b75be0dbdbc4a7327dc87a55b6d7dc8d68552"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ef60dfa73749ef91cb6073be1a3e135f4846ec809cc115f3cbfc6fe283a5584"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fbac18f2c19fc983838a60611e67e3262e36859994c26f2ee85bb268de2355"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a0d519ff39db887cd73f4e297922786d548f5c05d6b51f4e6754f452a7f4296"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bebb7bc6aeb91cc57e4881b222484c26759ca865794187217c9dcea6c33adae6"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe07f8b9c3bb5c5ad1d2c66884253e03800f4189a60eb6acd6119ebaf3eb9894"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bfa48a4a2d45a41457f0840c48e579db157a927f4e97acf6e20df8fc521c79de"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cf44d01bfe8ee605b7eaeecbc2b9ca64fc55765f17b304b40ed8995f69d7716"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e6bbca9246d9eedaa1c84e04a7f555493ba324d52ae4d9f3d9ddd1b740dcd87"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win32.whl", hash = "sha256:567f88180f2c1423b4fe3f3ad6e6310fc97b85bdba574801548597287fc07028"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6b2cd7c29d6ecdf0b780deb587198f13213ac01c430ada6913452fd0c40190fc"}, + {file = "rapidfuzz-3.10.1-cp39-cp39-win_arm64.whl", hash = "sha256:9f912d459e46607ce276128f52bea21ebc3e9a5ccf4cccfef30dd5bddcf47be8"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac4452f182243cfab30ba4668ef2de101effaedc30f9faabb06a095a8c90fd16"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:565c2bd4f7d23c32834652b27b51dd711814ab614b4e12add8476be4e20d1cf5"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d9747149321607be4ccd6f9f366730078bed806178ec3eeb31d05545e9e8f"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:616290fb9a8fa87e48cb0326d26f98d4e29f17c3b762c2d586f2b35c1fd2034b"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073a5b107e17ebd264198b78614c0206fa438cce749692af5bc5f8f484883f50"}, + {file = "rapidfuzz-3.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39c4983e2e2ccb9732f3ac7d81617088822f4a12291d416b09b8a1eadebb3e29"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ac7adee6bcf0c6fee495d877edad1540a7e0f5fc208da03ccb64734b43522d7a"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:425f4ac80b22153d391ee3f94bc854668a0c6c129f05cf2eaf5ee74474ddb69e"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65a2fa13e8a219f9b5dcb9e74abe3ced5838a7327e629f426d333dfc8c5a6e66"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75561f3df9a906aaa23787e9992b228b1ab69007932dc42070f747103e177ba8"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd062490537e97ca125bc6c7f2b7331c2b73d21dc304615afe61ad1691e15d5"}, + {file = "rapidfuzz-3.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfcc8feccf63245a22dfdd16e222f1a39771a44b870beb748117a0e09cbb4a62"}, + {file = "rapidfuzz-3.10.1.tar.gz", hash = "sha256:5a15546d847a915b3f42dc79ef9b0c78b998b4e2c53b252e7166284066585979"}, +] + +[package.extras] +all = ["numpy"] + +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-cache" +version = "1.2.1" +description = "A persistent cache for python requests" +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests_cache-1.2.1-py3-none-any.whl", hash = "sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603"}, + {file = "requests_cache-1.2.1.tar.gz", hash = "sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"}, +] + +[package.dependencies] +attrs = ">=21.2" +cattrs = ">=22.2" +platformdirs = ">=2.5" +requests = ">=2.22" +url-normalize = ">=1.4" +urllib3 = ">=1.25.5" + +[package.extras] +all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] +bson = ["bson (>=0.5)"] +docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] +dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] +json = ["ujson (>=5.4)"] +mongodb = ["pymongo (>=3)"] +redis = ["redis (>=3)"] +security = ["itsdangerous (>=2.0)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "serpyco-rs" +version = "1.11.0" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "serpyco_rs-1.11.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4b2bd933539bd8c84315e2fb5ae52ef7a58ace5a6dfe3f8b73f74dc71216779e"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:627f957889ff73c4d2269fc7b6bba93212381befe03633e7cb5495de66ba9a33"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0933620abc01434023e0e3e22255b7e4ab9b427b5a9a5ee00834656d792377a"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9ce46683d92e34abb20304817fc5ac6cb141a06fc7468dedb1d8865a8a9682f6"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bda437d86e8859bf91c189c1f4650899822f6d6d7b02b48f5729da904eb7bb7d"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a72bfbd282af17ebe76d122639013e802c09902543fdbbd828fb2159ec9755e"}, + {file = "serpyco_rs-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d4808df5384e3e8581e31a90ba7a1fa501c0837b1f174284bb8a4555b6864ea"}, + {file = "serpyco_rs-1.11.0-cp310-none-win_amd64.whl", hash = "sha256:c7b60aef4c16d68efb0d6241f05d0a434d873d98449cbb4366b0d385f0a7172b"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d47ee577cf4d69b53917615cb031ad8708eb2f59fe78194b1968c13130fc2f7"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6090d9a1487237cdd4e9362a823eede23249602019b917e7bd57846179286e79"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7192eb3df576386fefd595ea31ae25c62522841ffec7e7aeb37a80b55bdc3213"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b52ef8affb7e71b9b98a7d5216d6a7ad03b04e990acb147cd9211c8b931c5487"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3480e09e473560c60e74aaa789e6b4d079637371aae0a98235440111464bbba7"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c92e36b0ab6fe866601c2331f7e99c809a126d21963c03d8a5c29331526deed"}, + {file = "serpyco_rs-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84f497361952d4566bc1f77e9e15a84a2614f593cc671fbf0a0fa80046f9c3d7"}, + {file = "serpyco_rs-1.11.0-cp311-none-win_amd64.whl", hash = "sha256:37fc1cf192bef9784fbf1f4e03cec21750b9e704bef55cc0442f71a715eee920"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3ea93d485f03dc8b0cfb0d477f0ad2e86e78f0461b53010656ab5b4db1b41fb0"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7772410d15694b03f9c5500a2c47d62eed76e191bea4087ad042250346b1a38e"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42118463c1679846cffd2f06f47744c9b9eb33c5d0448afd88ea19e1a81a8ddd"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:79481a455b76cc56021dc55bb6d5bdda1b2b32bcb6a1ee711b597140d112e9b1"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8fd79051f9af9591fc03cf7d3033ff180416301f6a4fd3d1e3d92ebd2d68697"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c8f9aeed734a3b51f7349d04ec9063516ffa4e10b632d75e9b1309e4930e4"}, + {file = "serpyco_rs-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15609158b0d9591ffa118302cd9d0039970cb3faf91dce32975f7d276e7411d5"}, + {file = "serpyco_rs-1.11.0-cp312-none-win_amd64.whl", hash = "sha256:00081eae77fbf4c5d88371c5586317ab02ccb293a330b460869a283edf2b7b69"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3028893366a1985adcedb13fa8f6f98c087c185efc427f94c2ccdafa40f45832"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c18bf511316f3abf648a68ee62ef88617bec57d3fcde69466b4361102715ae5"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7dde9ef09cdfaf7c62378186b9e29f54ec76114be4c347be6a06dd559c5681e"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:18500ebc5e75285841e35585a238629a990b709e14f68933233640d15ca17d5f"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47c23132d4e03982703a7630aa09877b41e499722142f76b6153f6619b612f3"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f8e6ba499f6a0825bee0d8f8764569d367af871b563fc6512c171474e8e5383"}, + {file = "serpyco_rs-1.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15438a076047c34cff6601a977df54948e8d39d1a86f89d05c48bc60f4c12a61"}, + {file = "serpyco_rs-1.11.0-cp313-none-win_amd64.whl", hash = "sha256:84ee2c109415bd81904fc9abb9aec86a5dd13166808c21142cf23ec639f683bd"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5c97c16c865261577fac4effeccc7ef5e0a1e8e35e7a3ee6c90c77c3a4cd7ff9"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47825e70f86fd6ef7c4a835dea3d6e8eef4fee354ed7b39ced99f31aba74a86e"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24d220220365110edba2f778f41ab3cf396883da0f26e1361a3ada9bd0227f73"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3a46f334af5a9d77acc6e1e58f355ae497900a2798929371f0545e274f6e6166"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d72b748acce4b4e3c7c9724e1eb33d033a1c26b08a698b393e0288060e0901"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2b8b6f205e8cc038d4d30dd0e70eece7bbecc816eb2f3787c330dc2218e232d"}, + {file = "serpyco_rs-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:038d748bfff31f150f0c3edab2766b8843edb952cb1bd3bf547886beb0912dae"}, + {file = "serpyco_rs-1.11.0-cp39-none-win_amd64.whl", hash = "sha256:0fee1c89ec2cb013dc232e4ebef88e2844357ce8631063b56639dbfb83762f20"}, + {file = "serpyco_rs-1.11.0.tar.gz", hash = "sha256:70a844615ffb229e6e89c204b3ab7404aacaf2838911814c7d847969b8da2e3a"}, +] + +[package.dependencies] +attributes-doc = "*" +typing-extensions = "*" + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "tenacity" +version = "8.5.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + +[[package]] +name = "url-normalize" +version = "1.4.3" +description = "URL normalization for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, + {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcmatch" +version = "10.0" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a"}, + {file = "wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10,<3.13" +content-hash = "5e8366b535518df8f014fbbecff6bfaf17a0fdf43bd99b1405d4896f6a9cfd00" diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/pyproject.toml b/airbyte-integrations/connectors/source-intercom/unit_tests/pyproject.toml new file mode 100644 index 000000000000..8363acb21e57 --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" +[tool.poetry] +name = "source-intercom-tests" +version = "0.0.0" +description = "Unit tests for source-intercom" +authors = ["Airbyte "] +[tool.poetry.dependencies] +python = "^3.10,<3.13" +airbyte-cdk = "6.10.0" +pytest = "^8" +[tool.pytest.ini_options] +filterwarnings = [ + "ignore:This class is experimental*" +] diff --git a/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py b/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py new file mode 100644 index 000000000000..a2a8db7650e5 --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py @@ -0,0 +1,100 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +from unittest.mock import MagicMock, Mock, patch + +import pytest +import requests +from airbyte_cdk.sources.declarative.partition_routers.substream_partition_router import ParentStreamConfig +from airbyte_cdk.sources.streams import Stream + + +def test_slicer(components_module): + date_time_dict = {"updated_at": 1662459010} + IncrementalSingleSliceCursor = components_module.IncrementalSingleSliceCursor + slicer = IncrementalSingleSliceCursor(config={}, parameters={}, cursor_field="updated_at") + slicer.observe(date_time_dict, date_time_dict) + slicer.close_slice(date_time_dict) + assert slicer.get_stream_state() == date_time_dict + assert slicer.get_request_headers() == {} + assert slicer.get_request_body_data() == {} + assert slicer.get_request_body_json() == {} + + +@pytest.mark.parametrize( + "last_record, expected, records", + [ + ( + {"first_stream_cursor": 1662459010}, + { + "first_stream_cursor": 1662459010, + "prior_state": {"first_stream_cursor": 1662459010, "parent_stream_name": {"parent_cursor_field": 1662459010}}, + "parent_stream_name": {"parent_cursor_field": 1662459010}, + }, + [{"first_stream_cursor": 1662459010}], + ) + ], +) +def test_sub_slicer(components_module, last_record, expected, records): + parent_stream = Mock(spec=Stream) + parent_stream.name = "parent_stream_name" + parent_stream.cursor_field = "parent_cursor_field" + parent_stream.state = {"parent_stream_name": {"parent_cursor_field": 1662459010}} + parent_stream.stream_slices.return_value = [{"a slice": "value"}] + parent_stream.read_records = MagicMock(return_value=records) + + parent_config = ParentStreamConfig( + stream=parent_stream, + parent_key="first_stream_cursor", + partition_field="first_stream_id", + parameters={}, + config={}, + ) + + IncrementalSubstreamSlicerCursor = components_module.IncrementalSubstreamSlicerCursor + + slicer = IncrementalSubstreamSlicerCursor( + config={}, parameters={}, cursor_field="first_stream_cursor", parent_stream_configs=[parent_config], parent_complete_fetch=True + ) + slicer.set_initial_state(expected) + stream_slice = next(slicer.stream_slices()) if records else {} + slicer.observe(stream_slice, last_record) + slicer.close_slice(stream_slice) + assert slicer.get_stream_state() == expected + + +@pytest.mark.parametrize( + "rate_limit_header, backoff_time", + [ + ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 167}, 0.01), + ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 100}, 0.01), + ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 83}, 1.5), + ({"X-RateLimit-Limit": 167, "X-RateLimit-Remaining": 16}, 8.0), + ({}, 1.0), + ], +) +def test_rate_limiter(components_module, rate_limit_header, backoff_time): + + IntercomRateLimiter = components_module.IntercomRateLimiter + def check_backoff_time(t): + """A replacer for original `IntercomRateLimiter.backoff_time`""" + assert backoff_time == t, f"Expected {backoff_time}, got {t}" + + class Requester: + @IntercomRateLimiter.balance_rate_limit() + def interpret_response_status(self, response: requests.Response): + """A stub for the decorator function being tested""" + + with patch.object(IntercomRateLimiter, "backoff_time") as backoff_time_mock: + # Call `check_backoff_time` instead of original `IntercomRateLimiter.backoff_time` method + backoff_time_mock.side_effect = check_backoff_time + + requester = Requester() + + # Prepare requester object with headers + response = requests.models.Response() + response.headers = rate_limit_header + + # Call a decorated method + requester.interpret_response_status(response) From d896f60a0cd52e559367df865c9e1a305df2d5fc Mon Sep 17 00:00:00 2001 From: ChristoGrab Date: Mon, 16 Dec 2024 16:13:33 -0800 Subject: [PATCH 13/20] chore: version bump --- airbyte-integrations/connectors/source-intercom/manifest.yaml | 2 +- airbyte-integrations/connectors/source-intercom/metadata.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index 87b11e536025..e1703c6b8337 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -1,4 +1,4 @@ -version: 5.7.0 +version: 6.10.0 type: DeclarativeSource diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index e7b32d56c3c2..6b2957cb4af6 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -6,7 +6,7 @@ data: hosts: - api.intercom.io connectorBuildOptions: - baseImage: docker.io/airbyte/source-declarative-manifest:5.14.0@sha256:accdf6c1bbcabd45b40f836692e4f3b1a1e1f0b28267973802ee212cd9c2c16a + baseImage: docker.io/airbyte/source-declarative-manifest:6.10.0@sha256:58722e84dbd06bb2af9250e37d24d1c448e247fc3a84d75ee4407d52771b6f03 connectorSubtype: api connectorType: source definitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a From 205ba72d9be3678e57487504ca78a8cd07b7d15b Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Tue, 17 Dec 2024 08:47:34 +0530 Subject: [PATCH 14/20] update abnormal state values --- .../integration_tests/abnormal_state.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json index 9799a92860d8..477d722433d6 100755 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json @@ -6,7 +6,7 @@ "name": "segments" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -17,7 +17,7 @@ "name": "companies" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -28,7 +28,7 @@ "name": "company_segments" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -39,7 +39,7 @@ "name": "conversations" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -50,7 +50,7 @@ "name": "conversation_parts" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -61,7 +61,7 @@ "name": "contacts" }, "stream_state": { - "updated_at": 9626086649 + "updated_at": 7626086649 } } }, @@ -72,7 +72,7 @@ "name": "activity_logs" }, "stream_state": { - "created_at": 9626086649 + "created_at": 7626086649 } } } From fa00fd6214b825fd67ea094b71abd09acfb0c076 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Tue, 17 Dec 2024 20:20:40 +0530 Subject: [PATCH 15/20] revert base image version bump due to failure --- airbyte-integrations/connectors/source-intercom/manifest.yaml | 2 +- airbyte-integrations/connectors/source-intercom/metadata.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-integrations/connectors/source-intercom/manifest.yaml b/airbyte-integrations/connectors/source-intercom/manifest.yaml index e1703c6b8337..87b11e536025 100644 --- a/airbyte-integrations/connectors/source-intercom/manifest.yaml +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -1,4 +1,4 @@ -version: 6.10.0 +version: 5.7.0 type: DeclarativeSource diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 6b2957cb4af6..e7b32d56c3c2 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -6,7 +6,7 @@ data: hosts: - api.intercom.io connectorBuildOptions: - baseImage: docker.io/airbyte/source-declarative-manifest:6.10.0@sha256:58722e84dbd06bb2af9250e37d24d1c448e247fc3a84d75ee4407d52771b6f03 + baseImage: docker.io/airbyte/source-declarative-manifest:5.14.0@sha256:accdf6c1bbcabd45b40f836692e4f3b1a1e1f0b28267973802ee212cd9c2c16a connectorSubtype: api connectorType: source definitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a From 53d47337041c62c1fcd74212101f7df3444b90e4 Mon Sep 17 00:00:00 2001 From: ChristoGrab Date: Tue, 17 Dec 2024 12:06:21 -0800 Subject: [PATCH 16/20] chore: disable unit tests and comment --- airbyte-integrations/connectors/source-intercom/metadata.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index e7b32d56c3c2..998813ad80e7 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -44,7 +44,9 @@ data: testConnections: - name: intercom_config_dev_null id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 - - suite: unitTests + # We should enable unit tests once the connector has been updated to CDK version >= 6.10.0 + # Until then, the test suites won't be able to run successfully in CI as the fixtures are not present in earlier versions + # - suite: unitTests - suite: integrationTests testSecrets: - name: SECRET_SOURCE-INTERCOM_APIKEY__CREDS From c7dc09f0a2e60595dc162a6693b227e1113f02d5 Mon Sep 17 00:00:00 2001 From: Octavia Squidington III Date: Tue, 17 Dec 2024 20:13:03 +0000 Subject: [PATCH 17/20] chore: auto-fix lint and format issues --- airbyte-integrations/connectors/source-intercom/metadata.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 998813ad80e7..91f8e661963a 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -45,7 +45,7 @@ data: - name: intercom_config_dev_null id: 09ebd6bb-2756-4cd3-8ad5-7120088cc553 # We should enable unit tests once the connector has been updated to CDK version >= 6.10.0 - # Until then, the test suites won't be able to run successfully in CI as the fixtures are not present in earlier versions + # Until then, the test suites won't be able to run successfully in CI as the fixtures are not present in earlier versions # - suite: unitTests - suite: integrationTests testSecrets: From 7577a5cd4071ca8552e945e40ae8e2f16df00267 Mon Sep 17 00:00:00 2001 From: Christo Grabowski <108154848+ChristoGrab@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:31:16 -0500 Subject: [PATCH 18/20] Update airbyte-integrations/connectors/source-intercom/metadata.yaml --- airbyte-integrations/connectors/source-intercom/metadata.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 91f8e661963a..fc7172b9071e 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -10,7 +10,7 @@ data: connectorSubtype: api connectorType: source definitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a - dockerImageTag: 0.9.0 + dockerImageTag: 0.9.0-rc.1 dockerRepository: airbyte/source-intercom documentationUrl: https://docs.airbyte.com/integrations/sources/intercom githubIssueLabel: source-intercom From 87849a99d903b48d81d5e0d5a20b9dc63720a407 Mon Sep 17 00:00:00 2001 From: Christo Grabowski <108154848+ChristoGrab@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:31:29 -0500 Subject: [PATCH 19/20] Update airbyte-integrations/connectors/source-intercom/metadata.yaml --- airbyte-integrations/connectors/source-intercom/metadata.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index fc7172b9071e..46d6ae0c8d19 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -18,6 +18,9 @@ data: license: MIT maxSecondsBetweenMessages: 60 name: Intercom + releases: + rolloutConfiguration: + enableProgressiveRollout: true remoteRegistries: pypi: enabled: false From 3cc1013758ce3baba8eb48cd4f7edba075d97a11 Mon Sep 17 00:00:00 2001 From: ChristoGrab Date: Tue, 17 Dec 2024 14:21:46 -0800 Subject: [PATCH 20/20] chore: update changelog --- docs/integrations/sources/intercom.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/sources/intercom.md b/docs/integrations/sources/intercom.md index 970ebe43e603..301f8f5cc8e9 100644 --- a/docs/integrations/sources/intercom.md +++ b/docs/integrations/sources/intercom.md @@ -96,7 +96,7 @@ The Intercom connector should not run into Intercom API limitations under normal | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| 0.9.0 | 2024-12-13 | [47240](https://github.com/airbytehq/airbyte/pull/47240) | Migrate to manifest-only format | +| 0.9.0-rc.1 | 2024-12-17 | [47240](https://github.com/airbytehq/airbyte/pull/47240) | Migrate to manifest-only format | | 0.8.3 | 2024-12-12 | [48979](https://github.com/airbytehq/airbyte/pull/48979) | Update dependencies | | 0.8.2 | 2024-10-29 | [47919](https://github.com/airbytehq/airbyte/pull/47919) | Update dependencies | | 0.8.1 | 2024-10-28 | [47537](https://github.com/airbytehq/airbyte/pull/47537) | Update dependencies |