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..bbcd393ac644 100644 --- a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml @@ -5,7 +5,7 @@ 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" @@ -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/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/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json index e874bc451c67..477d722433d6 100755 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/abnormal_state.json @@ -28,10 +28,7 @@ "name": "company_segments" }, "stream_state": { - "updated_at": 7626086649, - "companies": { - "updated_at": 7626086649 - } + "updated_at": 7626086649 } } }, @@ -42,10 +39,7 @@ "name": "conversations" }, "stream_state": { - "updated_at": 7626086649, - "conversations": { - "updated_at": 7626086649 - } + "updated_at": 7626086649 } } }, @@ -56,10 +50,7 @@ "name": "conversation_parts" }, "stream_state": { - "updated_at": 7626086649, - "conversations": { - "updated_at": 7626086649 - } + "updated_at": 7626086649 } } }, 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} 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..87b11e536025 --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/manifest.yaml @@ -0,0 +1,2966 @@ +version: 5.7.0 + +type: DeclarativeSource + +check: + type: CheckStream + stream_names: + - tags + +definitions: + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + type: DpathExtractor + field_path: + - admins + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + type: DpathExtractor + field_path: + - teams + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + 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 + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + 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 + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + field_name: per_page + inject_into: request_parameter + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + type: DpathExtractor + field_path: + - data + paginator: + type: DefaultPaginator + page_token_option: + type: RequestPath + page_size_option: + type: RequestOption + field_name: per_page + inject_into: request_parameter + 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: + 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', + 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') }} }, ], } + 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 + 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: + 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: + 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', + 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') }} }, ], } + 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 + 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: + 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CompositeErrorHandler + error_handlers: + - type: DefaultErrorHandler + response_filters: + - type: HttpResponseFilter + action: IGNORE + http_codes: + - 404 + 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: 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: + - 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: + Accept: application/json + Intercom-Version: "2.11" + error_handler: + type: CustomErrorHandler + class_name: source_declarative_manifest.components.ErrorHandlerWithRateLimiter + response_filters: + - type: HttpResponseFilter + 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: + 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: 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: + $ref: "#/schemas/company_segments" + base_requester: + type: HttpRequester + url_base: https://api.intercom.io/ + authenticator: + type: BearerAuthenticator + 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. + order: 0 + title: Access token + airbyte_secret: true + client_id: + type: string + description: Client Id for your Intercom application. + order: 1 + title: Client Id + airbyte_secret: true + client_secret: + type: string + description: Client Secret for your Intercom application. + order: 2 + title: Client Secret + airbyte_secret: true + 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 + maximum: 91 + minimum: 1 + examples: + - 30 + - 10 + - 5 + lookback_window: + type: integer + description: The number of days to shift the state value backward for record sync + order: 4 + title: Lookback window + default: 0 + minimum: 0 + 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" + 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 + company_segments: + - errorHandler + testedStreams: + activity_logs: + hasRecords: true + streamHash: dae54ab01efc8a7c580121de6902d67a82a87775 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + admins: + hasRecords: true + streamHash: 62fdd12c98bec28f09edd3a34cd16bc5c1afedb6 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + tags: + hasRecords: true + streamHash: 53f9b051b3d5c8747598b848c006c80f3ffc5957 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + teams: + hasRecords: true + streamHash: d27cc586e29ddf6347d6356ea4970af99b7980c1 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + segments: + hasRecords: true + streamHash: 96ba554609834b986e20813cedf03a96183196fd + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + companies: + hasRecords: true + streamHash: 801c62e3a0a4028608efc4bf5f1ad5119b986973 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + company_attributes: + hasRecords: true + streamHash: e59558fb65b2c762d2b3f6b67e9071db2773cf13 + hasResponse: true + primaryKeysAreUnique: false + primaryKeysArePresent: true + responsesAreSuccessful: true + contact_attributes: + hasRecords: true + streamHash: 70d4afa7c3ad63877ab1fd9c185bd58c27ce06bc + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + contacts: + hasRecords: false + streamHash: e796494e6a861bce39d40f66e78e19b9ec633e29 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + conversations: + hasRecords: false + streamHash: 5838b59eba7d58cae3fe42eca72062bc9d29e1c4 + hasResponse: true + primaryKeysAreUnique: true + primaryKeysArePresent: true + responsesAreSuccessful: true + conversation_parts: + streamHash: 67469544cde547846d7636a110f775313d6e04fc + company_segments: + hasRecords: true + streamHash: 41220115640c54deccc0e5a421991a60aa808d3c + hasResponse: true + primaryKeysAreUnique: false + primaryKeysArePresent: true + responsesAreSuccessful: 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: + type: + type: + - "null" + - string + description: Type of the user who performed the activity (e.g., admin, user) + email: + type: + - "null" + - string + description: Email of the user who performed the activity + id: + type: + - "null" + - string + description: Unique identifier of the user who performed the activity + ip: + type: + - "null" + - string + description: IP address from where the activity was performed + admins: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + 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: + type: + - "null" + - object + description: Admin avatar details + properties: + image_url: + type: + - "null" + - string + description: URL of the admin's avatar image + away_mode_enabled: + type: + - "null" + - boolean + description: Flag indicating if away mode is enabled for the admin + away_mode_reassign: + type: + - "null" + - boolean + description: Flag indicating if away mode reassignment is enabled for the admin + email: + type: + - "null" + - string + description: Email address of the admin + has_inbox_seat: + type: + - "null" + - boolean + description: Flag indicating if the admin has a seat in the inbox + id: + type: + - "null" + - string + description: Unique identifier for the admin + job_title: + type: + - "null" + - string + description: Job title of the admin + name: + type: + - "null" + - string + 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: + - "null" + - object + description: Detailed team priority level information for the admin + properties: + primary_team_ids: + type: + - "null" + - array + description: Array of primary team identifiers for the admin + items: + type: + - "null" + - integer + secondary_team_ids: + type: + - "null" + - array + description: Array of secondary team identifiers for the admin + items: + type: + - "null" + - integer + tags: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + 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: + - "null" + - string + 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: + type: + - "null" + - string + description: Unique identifier for the team. + name: + type: + - "null" + - string + description: Name of the team. + segments: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: The type or category of the segment + count: + type: + - "null" + - integer + description: The number of items in the segment + created_at: + type: + - "null" + - integer + description: The date and time when the segment was created + id: + type: + - "null" + - string + description: Unique identifier for the segment + name: + type: + - "null" + - string + description: The name or title of the segment + person_type: + type: + - "null" + - string + description: Type of persons included in the segment + updated_at: + type: + - "null" + - integer + description: The date and time when the segment was last updated + companies: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: The type of the company + app_id: + type: + - "null" + - string + description: The ID of the application associated with the company + company_id: + type: + - "null" + - string + description: The unique identifier of the company + created_at: + type: + - "null" + - integer + description: The date and time when the company was created + custom_attributes: + type: + - "null" + - object + description: Custom attributes specific to the company + additionalProperties: true + id: + type: + - "null" + - string + description: The ID of the company + industry: + type: + - "null" + - string + description: The industry in which the company operates + monthly_spend: + type: + - "null" + - number + description: The monthly spend of the company + multipleOf: 1.e-8 + name: + type: + - "null" + - string + description: The name of the company + plan: + type: + - "null" + - object + description: Details of the company's subscription plan + properties: + type: + type: + - "null" + - string + description: The type of the subscription plan + id: + type: + - "null" + - string + description: The ID of the subscription plan + name: + type: + - "null" + - string + description: The name of the subscription plan + remote_created_at: + type: + - "null" + - 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" + - integer + description: The number of sessions related to the company + size: + type: + - "null" + - integer + 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" + - integer + description: The date and time when the company was last updated + user_count: + type: + - "null" + - integer + description: The number of users associated with the company + website: + type: + - "null" + - string + 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 + description: Indicates whether the field is writable through the API. + archived: + type: + - "null" + - boolean + description: Flag to indicate if the company data is archived. + created_at: + type: + - "null" + - integer + description: Timestamp when the company data was created. + custom: + type: + - "null" + - boolean + description: Custom attribute specific to the company. + data_type: + type: + - "null" + - string + description: Type of data stored in the attribute field. + full_name: + type: + - "null" + - string + description: Full name associated with the company. + id: + type: + - "null" + - integer + description: Unique ID assigned to the company attribute. + label: + type: + - "null" + - string + 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 + 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 + description: Description of the contact attribute for better understanding. + admin_id: + type: + - "null" + - string + description: Unique identifier for the admin associated with the contact attribute. + api_writable: + type: + - "null" + - boolean + description: Indicates whether the attribute is writable via API. + archived: + type: + - "null" + - boolean + description: Flag to signify if the contact attribute is archived. + created_at: + type: + - "null" + - integer + description: Timestamp of when the contact attribute was created. + custom: + type: + - "null" + - boolean + description: Indicates if the attribute is a custom user-defined field. + data_type: + type: + - "null" + - string + description: The data type of the contact attribute value. + full_name: + type: + - "null" + - string + description: The full name associated with the contact attribute. + id: + type: + - "null" + - integer + description: Unique identifier for the contact attribute. + label: + type: + - "null" + - string + description: Label representing the attribute in user interfaces. + messenger_writable: + type: + - "null" + - boolean + description: Indicates whether the attribute is writable via messenger. + model: + type: + - "null" + - string + description: Model to which the contact attribute is associated. + name: + type: + - "null" + - string + description: The name of the contact attribute. + options: + type: + - "null" + - array + description: List of available options for the attribute. + items: + type: + - "null" + - string + ui_writable: + type: + - "null" + - boolean + description: Indicates whether the attribute is writable via user interface. + updated_at: + type: + - "null" + - integer + description: Timestamp of when the contact attribute was last updated. + contacts: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: Type of contact. + android_app_name: + type: + - "null" + - string + description: The name of the Android app associated with the contact. + android_app_version: + type: + - "null" + - string + description: The version of the Android app associated with the contact. + android_device: + type: + - "null" + - string + description: The device used by the contact for Android. + android_last_seen_at: + type: + - "null" + - string + description: The date and time when the contact was last seen on Android. + format: date-time + android_os_version: + type: + - "null" + - string + description: The operating system version of the Android device. + android_sdk_version: + type: + - "null" + - string + description: The SDK version of the Android device. + avatar: + type: + - "null" + - string + description: URL pointing to the contact's avatar image. + browser: + type: + - "null" + - string + description: The browser used by the contact. + browser_language: + type: + - "null" + - string + description: The language preference set in the contact's browser. + browser_version: + type: + - "null" + - string + description: The version of the browser used by the contact. + companies: + type: + - "null" + - object + description: Companies associated with the contact. + properties: + type: + type: + - "null" + - string + description: Type of connection with the companies. + data: + type: + - "null" + - array + description: Array of company data associated with the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of company. + id: + type: + - "null" + - string + description: The unique identifier of the company. + url: + type: + - "null" + - string + 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 + description: The date and time when the contact was created. + custom_attributes: + type: + - "null" + - object + description: Custom attributes defined for the contact. + additionalProperties: true + properties: {} + email: + type: + - "null" + - 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 + description: Flag indicating if the contact has hard bounced. + id: + type: + - "null" + - string + description: The unique identifier of the contact. + ios_app_name: + type: + - "null" + - string + description: The name of the iOS app associated with the contact. + ios_app_version: + type: + - "null" + - string + description: The version of the iOS app associated with the contact. + ios_device: + type: + - "null" + - string + description: The device used by the contact for iOS. + ios_last_seen_at: + type: + - "null" + - integer + description: The date and time when the contact was last seen on iOS. + ios_os_version: + type: + - "null" + - string + description: The operating system version of the iOS device. + ios_sdk_version: + type: + - "null" + - string + description: The SDK version of the iOS device. + language_override: + type: + - "null" + - string + description: Language override set for the contact. + last_contacted_at: + type: + - "null" + - integer + description: The date and time when the contact was last contacted. + last_email_clicked_at: + type: + - "null" + - 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 + description: Location details of the contact. + properties: + type: + type: + - "null" + - string + description: Type of location. + city: + type: + - "null" + - string + description: City of the contact's location. + continent_code: + type: + - "null" + - string + description: Continent code of the contact's location. + country: + type: + - "null" + - string + description: Country of the contact's location. + country_code: + type: + - "null" + - string + description: Country code of the contact's location. + region: + type: + - "null" + - string + description: Region of the contact's location. + marked_email_as_spam: + type: + - "null" + - boolean + description: Flag indicating if the contact's email was marked as spam. + name: + type: + - "null" + - string + description: The name of the contact. + notes: + type: + - "null" + - object + description: Notes associated with the contact. + properties: + type: + type: + - "null" + - string + description: Type of connection with the notes. + data: + type: + - "null" + - array + description: Array of note data associated with the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of note. + id: + type: + - "null" + - string + description: The unique identifier of the note. + url: + type: + - "null" + - string + description: URL of the note. + has_more: + type: + - "null" + - boolean + description: Flag indicating if there are more notes to load. + total_count: + type: + - "null" + - integer + description: Total count of notes associated with the contact. + url: + type: + - "null" + - string + description: URL to access more note information. + opted_in_subscription_types: + type: + - "null" + - object + description: Subscription types the contact opted into. + properties: + type: + type: + - "null" + - string + description: Type of connection with the subscription types. + data: + type: + - "null" + - array + description: Array of subscription type data opted into by the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of subscription. + id: + type: + - "null" + - string + description: The unique identifier of the subscription type. + url: + type: + - "null" + - string + description: URL of the subscription type. + has_more: + type: + - "null" + - boolean + description: Flag indicating if there are more subscription types to load. + total_count: + type: + - "null" + - integer + description: Total count of subscription types the contact opted into. + url: + type: + - "null" + - string + description: URL to access more subscription type information. + opted_out_subscription_types: + type: + - "null" + - object + description: Subscription types the contact opted out from. + properties: + type: + type: + - "null" + - string + description: Type of connection with the subscription types. + data: + type: + - "null" + - array + description: Array of subscription type data opted out from by the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of subscription. + id: + type: + - "null" + - string + description: The unique identifier of the subscription type. + url: + type: + - "null" + - string + description: URL of the subscription type. + has_more: + type: + - "null" + - boolean + description: Flag indicating if there are more subscription types to load. + total_count: + type: + - "null" + - integer + description: Total count of subscription types the contact opted out from. + url: + type: + - "null" + - 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 + description: Social profiles associated with the contact. + properties: + type: + type: + - "null" + - string + description: Type of social profile connection. + data: + type: + - "null" + - array + description: Array of social profile data associated with the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of social profile. + name: + type: + - "null" + - string + description: Name of the social profile. + url: + type: + - "null" + - string + description: URL of the social profile. + tags: + type: + - "null" + - object + description: Tags associated with the contact. + properties: + type: + type: + - "null" + - string + description: Type of connection with the tags. + data: + type: + - "null" + - array + description: Array of tag data associated with the contact. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: Type of tag. + id: + type: + - "null" + - string + description: The unique identifier of the tag. + url: + type: + - "null" + - string + description: URL of the tag. + has_more: + type: + - "null" + - boolean + description: Flag indicating if there are more tags to load. + total_count: + type: + - "null" + - integer + description: Total count of tags associated with the contact. + url: + type: + - "null" + - 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 + description: Campaign data from UTM parameters. + utm_content: + type: + - "null" + - string + description: Content data from UTM parameters. + utm_medium: + type: + - "null" + - string + description: Medium data from UTM parameters. + utm_source: + type: + - "null" + - string + description: Source data from UTM parameters. + utm_term: + type: + - "null" + - string + description: Term data from UTM parameters. + workspace_id: + type: + - "null" + - string + description: The unique identifier of the workspace associated with the contact. + conversations: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - 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 + description: The assigned user responsible for the conversation. + properties: + type: + type: + - "null" + - string + description: The type of the assignee (e.g., admin, agent) + email: + type: + - "null" + - string + description: The email of the assignee + id: + type: + - "null" + - string + description: The ID of the assignee + name: + type: + - "null" + - string + description: The name of the assignee + contacts: + type: + - "null" + - object + description: List of contacts involved in the conversation. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: The type of the contact + id: + type: + - "null" + - string + description: The ID of the contact + conversation_message: + type: + - "null" + - object + description: The main message content of the conversation. + properties: + type: + type: + - "null" + - string + 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 + content_type: + type: + - "null" + - string + filesize: + type: + - "null" + - integer + height: + type: + - "null" + - integer + name: + type: + - "null" + - string + url: + type: + - "null" + - string + width: + type: + - "null" + - integer + - type: "null" + author: + type: + - "null" + - object + description: The author of the conversation message. + properties: + type: + type: + - "null" + - string + description: The type of the author (e.g., admin, customer) + email: + type: + - "null" + - string + description: The email of the author of the message + id: + type: + - "null" + - string + description: The ID of the author of the message + name: + type: + - "null" + - string + description: The name of the author of the message + body: + type: + - "null" + - string + description: The body/content of the conversation message + delivered_as: + type: + - "null" + - string + description: The delivery status of the message + id: + type: + - "null" + - string + description: The ID of the conversation message + subject: + type: + - "null" + - string + description: The subject of the conversation message + url: + type: + - "null" + - string + description: The URL of the conversation message + conversation_rating: + type: + - "null" + - object + description: Ratings given to the conversation by the customer and teammate. + properties: + created_at: + type: + - "null" + - integer + description: The timestamp when the rating was created + customer: + type: + - "null" + - object + description: Rating given by the customer. + properties: + type: + type: + - "null" + - string + description: The type of the customer providing the rating + id: + type: + - "null" + - string + description: The ID of the customer who provided the rating + rating: + type: + - "null" + - integer + description: The rating given to the conversation + remark: + type: + - "null" + - string + description: Any remarks provided with the rating + teammate: + type: + - "null" + - object + description: Rating given by the teammate. + properties: + type: + type: + - "null" + - string + 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 + description: The timestamp when the conversation was created + custom_attributes: + type: + - "null" + - object + description: Custom attributes associated with the conversation + customer_first_reply: + type: + - "null" + - object + description: Timestamp indicating when the customer first replied. + properties: + type: + type: + - "null" + - string + 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 + description: The URL of the first customer reply + customers: + description: List of customers involved in the conversation + anyOf: + - type: array + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + id: + type: + - "null" + - string + - type: "null" + 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 + description: The unique ID of the conversation + open: + type: + - "null" + - boolean + description: Indicates if the conversation is open or closed + priority: + type: + - "null" + - string + description: The priority level of the conversation + read: + type: + - "null" + - boolean + description: Indicates if the conversation has been read + redacted: + type: + - "null" + - boolean + description: Indicates if the conversation is redacted + sent_at: + type: + - "null" + - integer + 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 + description: Timestamp until the conversation is snoozed + source: + type: + - "null" + - object + 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 + description: The body/content of the source + delivered_as: + type: + - "null" + - string + 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 + description: The state of the conversation (e.g., new, in progress) + statistics: + type: + - "null" + - object + description: Statistics related to the conversation. + properties: + type: + type: + - "null" + - string + description: The type of conversation statistics + count_assignments: + type: + - "null" + - integer + description: The total count of assignments for the conversation + count_conversation_parts: + type: + - "null" + - integer + description: The total count of conversation parts + count_reopens: + type: + - "null" + - integer + description: The total count of conversation reopens + first_admin_reply_at: + type: + - "null" + - integer + description: Timestamp of the first admin reply + first_assignment_at: + type: + - "null" + - integer + description: Timestamp of the first assignment + first_close_at: + type: + - "null" + - integer + description: Timestamp of the first conversation close + first_contact_reply_at: + type: + - "null" + - integer + description: Timestamp of the first contact reply + last_admin_reply_at: + type: + - "null" + - integer + description: Timestamp of the last admin reply + last_assignment_admin_reply_at: + type: + - "null" + - integer + description: Timestamp of the last assignment admin reply + last_assignment_at: + type: + - "null" + - integer + description: Timestamp of the last assignment + last_close_at: + type: + - "null" + - integer + description: Timestamp of the last conversation close + last_closed_by_id: + type: + - "null" + - integer + description: The ID of the last user who closed the conversation + last_contact_reply_at: + type: + - "null" + - integer + description: Timestamp of the last contact reply + median_time_to_reply: + type: + - "null" + - integer + description: The median time taken to reply to the conversation + time_to_admin_reply: + type: + - "null" + - integer + description: Time taken to reply by admin + time_to_assignment: + type: + - "null" + - integer + description: Time taken for assignment + time_to_first_close: + type: + - "null" + - integer + description: Time taken to first close the conversation + time_to_last_close: + type: + - "null" + - integer + description: Time taken to last close the conversation + tags: + type: + - "null" + - object + description: Tags applied to the conversation. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: The type of the tag + applied_at: + type: + - "null" + - integer + description: Timestamp when the tag was applied + applied_by: + type: + - "null" + - object + description: User who applied the tag. + properties: + type: + type: + - "null" + - string + description: The type of the user who applied the tag + id: + type: + - "null" + - string + description: The ID of the user who applied the tag + id: + type: + - "null" + - string + description: The ID of the tag + name: + type: + - "null" + - string + 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: + type: + - "null" + - string + description: The type of the teammate (admin) + id: + type: + - "null" + - string + 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: + type: + type: + - "null" + - string + description: The type of the topic + id: + type: + - "null" + - integer + 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 + id: + type: + - "null" + - string + - type: string + - type: "null" + attachments: + type: + - "null" + - array + description: Represents the attachments associated with the conversation part. + items: + type: + - "null" + - object + properties: + type: + type: + - "null" + - string + description: The type or category of the attachment. + content_type: + type: + - "null" + - string + description: The MIME type of the attachment content. + filesize: + type: + - "null" + - integer + description: The size of the attachment file in bytes. + height: + type: + - "null" + - integer + 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 + description: The width dimension of the attachment in pixels. + author: + type: + - "null" + - object + 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: + - "null" + - string + description: The email address of the conversation author. + id: + type: + - "null" + - string + description: The unique identifier of the conversation author. + name: + type: + - "null" + - string + description: The name of the conversation author. + body: + type: + - "null" + - string + description: The main content or message body of the conversation part. + conversation_created_at: + type: + - "null" + - integer + 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 + description: The total number of parts in the conversation. + conversation_updated_at: + type: + - "null" + - integer + description: The date and time when the conversation was last updated. + created_at: + type: + - "null" + - integer + description: The date and time when the conversation part was created. + external_id: + type: + - "null" + - string + description: An external identifier associated with the conversation part. + id: + type: + - "null" + - string + description: The unique identifier of the conversation part. + notified_at: + type: + - "null" + - integer + 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: + - "null" + - boolean + description: Indicates if the conversation part has been redacted or censored. + updated_at: + type: + - "null" + - integer + description: The date and time when the conversation part was last updated. + company_segments: + type: object + additionalProperties: true + properties: + type: + type: + - "null" + - string + description: The category or type of the company segment. + count: + type: + - "null" + - integer + description: The count of company segments returned in the response. + created_at: + type: + - "null" + - integer + description: The timestamp when the company segment was created. + id: + type: + - "null" + - string + description: The unique identifier associated with the company segment. + name: + type: + - "null" + - string + description: The name of the company segment. + person_type: + type: + - "null" + - string + description: The type of person associated with the company segment. + updated_at: + type: + - "null" + - integer + description: The timestamp when the company segment was last updated. diff --git a/airbyte-integrations/connectors/source-intercom/metadata.yaml b/airbyte-integrations/connectors/source-intercom/metadata.yaml index 2c41b0e6f0d8..46d6ae0c8d19 100644 --- a/airbyte-integrations/connectors/source-intercom/metadata.yaml +++ b/airbyte-integrations/connectors/source-intercom/metadata.yaml @@ -6,11 +6,11 @@ data: hosts: - 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.3 + dockerImageTag: 0.9.0-rc.1 dockerRepository: airbyte/source-intercom documentationUrl: https://docs.airbyte.com/integrations/sources/intercom githubIssueLabel: source-intercom @@ -18,9 +18,12 @@ data: license: MIT maxSecondsBetweenMessages: 60 name: Intercom + releases: + rolloutConfiguration: + enableProgressiveRollout: true remoteRegistries: pypi: - enabled: true + enabled: false packageName: airbyte-source-intercom registryOverrides: cloud: @@ -37,14 +40,16 @@ data: - companies supportLevel: certified tags: - - language:python - cdk:low-code + - language:manifest-only connectorTestSuitesOptions: - suite: liveTests 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 diff --git a/airbyte-integrations/connectors/source-intercom/pyproject.toml b/airbyte-integrations/connectors/source-intercom/pyproject.toml deleted file mode 100644 index 3d1c62bdfe63..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.3" -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/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/poetry.lock b/airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock similarity index 73% rename from airbyte-integrations/connectors/source-intercom/poetry.lock rename to airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock index d8fc8ce7ae9e..847fa693b143 100644 --- a/airbyte-integrations/connectors/source-intercom/poetry.lock +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/poetry.lock @@ -1,61 +1,65 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "airbyte-cdk" -version = "4.6.2" +version = "6.10.0" description = "A framework for writing Airbyte Connectors." optional = false -python-versions = "<4.0,>=3.10" +python-versions = "<3.13,>=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"}, + {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-pdv2 = ">=0.12.2,<0.13.0" +airbyte-protocol-models-dataclasses = ">=0.14,<0.15" backoff = "*" cachetools = "*" -cryptography = ">=42.0.5,<43.0.0" -Deprecated = ">=1.2,<1.3" +cryptography = ">=42.0.5,<44.0.0" dpath = ">=2.1.6,<3.0.0" -genson = "1.2.2" +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 = ">=3.2.0,<3.3.0" +jsonschema = ">=4.17.3,<4.18.0" langchain_core = "0.1.42" -nltk = "3.8.1" +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 = "*" -wcmatch = "8.4" +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", "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)"] +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-pdv2" -version = "0.12.2" -description = "Declares the Airbyte Protocol." +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_pdv2-0.12.2-py3-none-any.whl", hash = "sha256:8b3f9d0388928547cdf2e9134c0d589e4bcaa6f63bf71a21299f6824bfb7ad0e"}, - {file = "airbyte_protocol_models_pdv2-0.12.2.tar.gz", hash = "sha256:130c9ab289f3f53749ce63ff1abbfb67a44b7e5bd2794865315a2976138b672b"}, + {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.dependencies] -pydantic = ">=2.7.2,<3.0.0" - [[package]] name = "annotated-types" version = "0.7.0" @@ -89,21 +93,32 @@ doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", 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.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {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", "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"] @@ -169,13 +184,13 @@ ujson = ["ujson (>=5.7.0)"] [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" 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"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -398,43 +413,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.8" +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-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"}, + {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] @@ -447,26 +457,9 @@ 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 = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "deprecated" -version = "1.2.15" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, - {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] - [[package]] name = "dpath" version = "2.2.0" @@ -478,6 +471,20 @@ files = [ {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" @@ -494,12 +501,13 @@ test = ["pytest (>=6)"] [[package]] name = "genson" -version = "1.2.2" +version = "1.3.0" 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"}, + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] [[package]] @@ -663,24 +671,22 @@ files = [ [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.17.3" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, + {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" -setuptools = "*" -six = ">=1.11.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 = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] +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" @@ -718,7 +724,10 @@ files = [ [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\""} +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" @@ -797,13 +806,13 @@ files = [ [[package]] name = "nltk" -version = "3.8.1" +version = "3.9.1" description = "Natural Language Toolkit" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, - {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, + {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, + {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, ] [package.dependencies] @@ -820,6 +829,51 @@ 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" @@ -915,6 +969,79 @@ files = [ {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" @@ -980,6 +1107,36 @@ files = [ 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" @@ -1218,23 +1375,6 @@ 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" @@ -1249,6 +1389,20 @@ files = [ [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" @@ -1333,6 +1487,106 @@ files = [ {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" @@ -1487,23 +1741,6 @@ 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" @@ -1519,24 +1756,58 @@ files = [ requests = ">=2.0.1,<3.0.0" [[package]] -name = "setuptools" -version = "75.6.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +name = "serpyco-rs" +version = "1.11.0" +description = "" optional = false python-versions = ">=3.9" files = [ - {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, - {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, + {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.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.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 (>=5.5)", "packaging (>=24.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.12,<1.14)", "pytest-mypy"] +[package.dependencies] +attributes-doc = "*" +typing-extensions = "*" [[package]] name = "six" @@ -1648,6 +1919,17 @@ files = [ {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" @@ -1681,93 +1963,30 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcmatch" -version = "8.4" +version = "10.0" description = "Wildcard/glob file name matcher." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wcmatch-8.4-py3-none-any.whl", hash = "sha256:dc7351e5a7f8bbf4c6828d51ad20c1770113f5f3fd3dfe2a03cfde2a63f03f98"}, - {file = "wcmatch-8.4.tar.gz", hash = "sha256:ba4fc5558f8946bf1ffc7034b05b814d825d694112499c86035e0e4d398b6a67"}, + {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 = "wrapt" -version = "1.17.0" -description = "Module for decorators, wrappers and monkey patching." +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=3.8" +python-versions = ">=3.4" files = [ - {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, - {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, - {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, - {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, - {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, - {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, - {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, - {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, - {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, - {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, - {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, - {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, - {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, - {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, - {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, - {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, - {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, - {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, - {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, - {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, - {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, - {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, - {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, + {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.12" -content-hash = "e75fecfda21bb185122d6218ee0e5cc1318b240bef1db615ed5052597e23ba11" +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 index cb3ca58063dd..a2a8db7650e5 100644 --- a/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py +++ b/airbyte-integrations/connectors/source-intercom/unit_tests/test_components.py @@ -8,11 +8,11 @@ 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(): +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) @@ -36,7 +36,7 @@ def test_slicer(): ) ], ) -def test_sub_slicer(last_record, expected, records): +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" @@ -52,6 +52,8 @@ def test_sub_slicer(last_record, expected, records): config={}, ) + IncrementalSubstreamSlicerCursor = components_module.IncrementalSubstreamSlicerCursor + slicer = IncrementalSubstreamSlicerCursor( config={}, parameters={}, cursor_field="first_stream_cursor", parent_stream_configs=[parent_config], parent_complete_fetch=True ) @@ -72,7 +74,9 @@ def test_sub_slicer(last_record, expected, records): ({}, 1.0), ], ) -def test_rate_limiter(rate_limit_header, backoff_time): +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}" 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 6f69d1797bf6..301f8f5cc8e9 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-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 |