diff --git a/airbyte-integrations/connectors/source-youtube-analytics/README.md b/airbyte-integrations/connectors/source-youtube-analytics/README.md index 77adf3cd2e725..3544d27b1283b 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/README.md +++ b/airbyte-integrations/connectors/source-youtube-analytics/README.md @@ -1,89 +1,63 @@ -# Youtube-Analytics source connector +# Youtube analytics source connector +This directory contains the manifest-only connector for `source-youtube-analytics`. +This _manifest-only_ connector is not a Python package on its own, as it runs inside of the base `source-declarative-manifest` image. -This is the repository for the Youtube-Analytics source connector, written in Python. -For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.com/integrations/sources/youtube-analytics). +For information about how to configure and use this connector within Airbyte, see [the connector's full documentation](https://docs.airbyte.com/integrations/sources/youtube-analytics). ## Local development -### Prerequisites -* Python (~=3.9) -* Poetry (~=1.7) - installation instructions [here](https://python-poetry.org/docs/#installation) +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! +If you prefer to develop locally, you can follow the instructions below. -### Installing the connector -From this connector directory, run: -```bash -poetry install --with dev -``` - - -### Create credentials -**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.com/integrations/sources/youtube-analytics) -to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_youtube_analytics/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-youtube-analytics spec -poetry run source-youtube-analytics check --config secrets/config.json -poetry run source-youtube-analytics discover --config secrets/config.json -poetry run source-youtube-analytics read --config secrets/config.json --catalog sample_files/configured_catalog.json -``` +### Building the docker image -### Running unit tests -To run unit tests locally, from the connector directory run: -``` -poetry run pytest unit_tests -``` +You can build any manifest-only connector with `airbyte-ci`: -### Building the docker image 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: + ```bash airbyte-ci connectors --name=source-youtube-analytics build ``` An image will be available on your host with the tag `airbyte/source-youtube-analytics:dev`. +### Creating credentials + +**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.com/integrations/sources/youtube-analytics) +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-youtube-analytics:dev spec docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-youtube-analytics:dev check --config /secrets/config.json docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-youtube-analytics:dev discover --config /secrets/config.json docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-youtube-analytics:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json ``` -### Running our 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): -```bash -airbyte-ci connectors --name=source-youtube-analytics test -``` +### Running the CI test suite -### 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. +You can run our full test suite locally using [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md): -### Dependency Management -All of your dependencies should be managed via Poetry. -To add a new dependency, run: ```bash -poetry add +airbyte-ci connectors --name=source-youtube-analytics test ``` -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-youtube-analytics 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)): + +If you want to contribute changes to `source-youtube-analytics`, 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-youtube-analytics 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` - - bump the `version` value in `pyproject.toml` -3. Make sure the `metadata.yaml` content is up to date. 4. Make sure the connector documentation and its changelog is up to date (`docs/integrations/sources/youtube-analytics.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. diff --git a/airbyte-integrations/connectors/source-youtube-analytics/acceptance-test-config.yml b/airbyte-integrations/connectors/source-youtube-analytics/acceptance-test-config.yml index e521392e533db..d2a32ec7853eb 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-youtube-analytics/acceptance-test-config.yml @@ -3,7 +3,7 @@ connector_image: airbyte/source-youtube-analytics:dev tests: spec: - - spec_path: "source_youtube_analytics/spec.json" + - spec_path: "manifest.yaml" connection: - config_path: "secrets/config.json" status: "succeed" diff --git a/airbyte-integrations/connectors/source-youtube-analytics/components.py b/airbyte-integrations/connectors/source-youtube-analytics/components.py new file mode 100644 index 0000000000000..9da0fca0ce0df --- /dev/null +++ b/airbyte-integrations/connectors/source-youtube-analytics/components.py @@ -0,0 +1,148 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +from dataclasses import dataclass +from typing import Any, Mapping, Optional, Union + +import requests + +from airbyte_cdk.sources.declarative.requesters.error_handlers import DefaultErrorHandler +from airbyte_cdk.sources.declarative.requesters.http_requester import HttpRequester +from airbyte_cdk.sources.declarative.requesters.request_options.interpolated_request_options_provider import ( + InterpolatedRequestOptionsProvider, + RequestInput, +) +from airbyte_cdk.sources.streams.http.error_handlers import ErrorResolution, ResponseAction + + +@dataclass +class CreationRequester(HttpRequester): + request_body_json: Optional[RequestInput] = None + + def __post_init__(self, parameters: Mapping[str, Any]) -> None: + self.request_options_provider = InterpolatedRequestOptionsProvider( + request_body_json=self.request_body_json, + config=self.config, + parameters=parameters or {}, + ) + super().__post_init__(parameters) + + def send_request(self, **kwargs): + request, jobs_response = self._http_client.send_request( + http_method="GET", + url=self._join_url(self.get_url_base(), "jobs"), + request_kwargs={"stream": self.stream_response}, + ) + jobs_list = jobs_response.json().get("jobs", []) + stream_name = self.name.split(" - ")[-1] + if stream_name in [job["reportTypeId"] for job in jobs_list]: + return jobs_response + else: + return super().send_request(**kwargs) + + +@dataclass +class PollingRequester(HttpRequester): + def send_request(self, **kwargs): + jobs_response = super().send_request(**kwargs) + jobs_list = jobs_response.json().get("jobs", []) + job_resource = [job for job in jobs_list if job["reportTypeId"] == self.name][0] + job_id = job_resource["id"] + + request, reports_response = self._http_client.send_request( + http_method=self.get_method().value, + url=self._join_url(self.get_url_base(), f"jobs/{job_id}/reports"), + request_kwargs={"stream": self.stream_response}, + params={"startTimeAtOrAfter": self.start_time} if self.start_time else {}, + ) + return reports_response + + +@dataclass +class YoutubeAnalyticsErrorHandler(DefaultErrorHandler): + def daily_quota_exceeded(self, response: requests.Response): + """Response example: + { + "error": { + "code": 429, + "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per minute' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127'.", + "status": "RESOURCE_EXHAUSTED", + "details": [ + { + "reason": "RATE_LIMIT_EXCEEDED", + "metadata": { + "consumer": "projects/863188056127", + "quota_limit": "FreeQuotaRequestsPerMinutePerProject", + "quota_limit_value": "60", + "quota_metric": "youtubereporting.googleapis.com/free_quota_requests", + "service": "youtubereporting.googleapis.com", + } + }, + ] + } + } + + :param response: + :return: + """ + details = response.json().get("error", {}).get("details", []) + for detail in details: + if detail.get("reason") == "RATE_LIMIT_EXCEEDED": + if detail.get("metadata", {}).get("quota_limit") == "FreeQuotaRequestsPerDayPerProject": + return True, f"Exceeded daily quota: {detail.get('metadata', {}).get('quota_limit_value')} reqs/day" + break + return False, "" + + def should_retry(self, response: requests.Response): + """ + Override to set different conditions for backoff based on the response from the server. + + By default, back off on the following HTTP response statuses: + - 500s to handle transient server errors + - 429 (Too Many Requests) indicating rate limiting: + Different behavior in case of 'RATE_LIMIT_EXCEEDED': + + Requests Per Minute: + "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per minute' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127'." + "quota_limit": "FreeQuotaRequestsPerMinutePerProject", + "quota_limit_value": "60", + + --> use increased retry_factor (30 seconds) + + Requests Per Day: + "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per day' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127" + "quota_limit": "FreeQuotaRequestsPerDayPerProject + "quota_limit_value": "20000", + + --> just throw an error, next scan is reasonable to start only in 1 day. + """ + if 500 <= response.status_code < 600: + return True, "" + + if response.status_code == 429 and not self.daily_quota_exceeded(response): + return True, "" + + return False, "" + + def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]]) -> ErrorResolution: + """ + Interprets responses and exceptions, providing custom error resolutions for specific exceptions. + """ + if_retry, error_message = self.should_retry(response_or_exception) + if if_retry: + return ErrorResolution( + response_action=ResponseAction.RETRY, + error_message=error_message, + ) + return super().interpret_response(response_or_exception) + + def backoff_time( + self, + response_or_exception: Optional[Union[requests.Response, requests.RequestException]], + attempt_count: int = 0, + ) -> Optional[float]: + """ + Default FreeQuotaRequestsPerMinutePerProject is 60 reqs/min, so reasonable delay is 30 seconds + """ + return 30 diff --git a/airbyte-integrations/connectors/source-youtube-analytics/main.py b/airbyte-integrations/connectors/source-youtube-analytics/main.py deleted file mode 100644 index 959f6b2714542..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/main.py +++ /dev/null @@ -1,9 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -from source_youtube_analytics.run import run - - -if __name__ == "__main__": - run() diff --git a/airbyte-integrations/connectors/source-youtube-analytics/manifest.yaml b/airbyte-integrations/connectors/source-youtube-analytics/manifest.yaml new file mode 100644 index 0000000000000..17a9275058e99 --- /dev/null +++ b/airbyte-integrations/connectors/source-youtube-analytics/manifest.yaml @@ -0,0 +1,1759 @@ +version: 6.13.0 + +type: DeclarativeSource + +check: + type: CheckStream + stream_names: + - channel_annotations_a1 + +definitions: + streams: + channel_annotations_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_annotations_a1 + name: channel_annotations_a1 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - annotation_type + - annotation_id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_annotations_a1" + channel_basic_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_basic_a2 + name: channel_basic_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_basic_a2" + channel_cards_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_cards_a1 + name: channel_cards_a1 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - card_type + - card_id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_cards_a1" + channel_combined_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_combined_a2 + name: channel_combined_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - playback_location_type + - traffic_source_type + - device_type + - operating_system + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_combined_a2" + channel_demographics_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_demographics_a1 + name: channel_demographics_a1 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - age_group + - gender + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_demographics_a1" + channel_device_os_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_device_os_a2 + name: channel_device_os_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - device_type + - operating_system + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_device_os_a2" + channel_end_screens_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_end_screens_a1 + name: channel_end_screens_a1 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - end_screen_element_type + - end_screen_element_id + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_end_screens_a1" + channel_playback_location_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_playback_location_a2 + name: channel_playback_location_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - playback_location_type + - playback_location_detail + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_playback_location_a2" + channel_province_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_province_a2 + name: channel_province_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - province_code + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_province_a2" + channel_sharing_service_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_sharing_service_a1 + name: channel_sharing_service_a1 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - sharing_service + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_sharing_service_a1" + channel_subtitles_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_subtitles_a2 + name: channel_subtitles_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - subtitle_language + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_subtitles_a2" + channel_traffic_source_a2: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: channel_traffic_source_a2 + name: channel_traffic_source_a2 + primary_key: + - date + - channel_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - traffic_source_type + - traffic_source_detail + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/channel_traffic_source_a2" + playlist_basic_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_basic_a1 + name: playlist_basic_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_basic_a1" + playlist_combined_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_combined_a1 + name: playlist_combined_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - playback_location_type + - traffic_source_type + - device_type + - operating_system + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_combined_a1" + playlist_device_os_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_device_os_a1 + name: playlist_device_os_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - device_type + - operating_system + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_device_os_a1" + playlist_playback_location_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_playback_location_a1 + name: playlist_playback_location_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - playback_location_type + - playback_location_detail + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_playback_location_a1" + playlist_province_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_province_a1 + name: playlist_province_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - province_code + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_province_a1" + playlist_traffic_source_a1: + type: DeclarativeStream + retriever: + $ref: "#/definitions/base_retriever" + creation_requester: + $ref: "#/definitions/base_retriever/creation_requester" + request_body_json: + name: Airbyte reporting job + reportTypeId: playlist_traffic_source_a1 + name: playlist_traffic_source_a1 + primary_key: + - date + - channel_id + - playlist_id + - video_id + - live_or_on_demand + - subscribed_status + - country_code + - traffic_source_type + - traffic_source_detail + schema_loader: + type: InlineSchemaLoader + schema: + $ref: "#/schemas/playlist_traffic_source_a1" + base_retriever: + type: AsyncRetriever + creation_requester: + type: CustomRequester + class_name: source_declarative_manifest.components.CreationRequester + $ref: "#/definitions/base_requester" + path: jobs + http_method: POST + polling_requester: + type: CustomRequester + class_name: source_declarative_manifest.components.PollingRequester + $ref: "#/definitions/base_requester" + path: jobs + http_method: GET + status_extractor: + type: DpathExtractor + field_path: + - status + status_mapping: + failed: + - failed + running: + - pending + timeout: + - timeout + completed: + - ready + urls_extractor: + type: DpathExtractor + field_path: + - downloadUrl + download_requester: + $ref: "#/definitions/base_requester" + path: "{{stream_slice.extra_fields['downloadUrl']}}" + http_method: GET + decoder: + type: GzipJsonDecoder + record_selector: + type: RecordSelector + extractor: + type: DpathExtractor + field_path: [] + base_requester: + type: HttpRequester + url_base: https://youtubereporting.googleapis.com/v1/ + authenticator: + type: OAuthAuthenticator + client_id: '{{ config[''credentials'']["client_id"] }}' + grant_type: refresh_token + client_secret: '{{ config[''credentials'']["client_secret"] }}' + refresh_token: '{{ config[''credentials'']["refresh_token"] }}' + refresh_request_body: {} + token_refresh_endpoint: https://oauth2.googleapis.com/token + error_handlers: + type: CustomErrorHandler + class_name: "source_declarative_manifest.components.YoutubeAnalyticsErrorHandler" + +streams: + - $ref: "#/definitions/streams/channel_annotations_a1" + - $ref: "#/definitions/streams/channel_basic_a2" + - $ref: "#/definitions/streams/channel_cards_a1" + - $ref: "#/definitions/streams/channel_combined_a2" + - $ref: "#/definitions/streams/channel_demographics_a1" + - $ref: "#/definitions/streams/channel_device_os_a2" + - $ref: "#/definitions/streams/channel_end_screens_a1" + - $ref: "#/definitions/streams/channel_playback_location_a2" + - $ref: "#/definitions/streams/channel_province_a2" + - $ref: "#/definitions/streams/channel_sharing_service_a1" + - $ref: "#/definitions/streams/channel_subtitles_a2" + - $ref: "#/definitions/streams/channel_traffic_source_a2" + - $ref: "#/definitions/streams/playlist_basic_a1" + - $ref: "#/definitions/streams/playlist_combined_a1" + - $ref: "#/definitions/streams/playlist_device_os_a1" + - $ref: "#/definitions/streams/playlist_playback_location_a1" + - $ref: "#/definitions/streams/playlist_province_a1" + - $ref: "#/definitions/streams/playlist_traffic_source_a1" + +spec: + type: Spec + documentationUrl: https://docs.airbyte.com/integrations/sources/youtube-analytics + connection_specification: + type: object + $schema: http://json-schema.org/draft-07/schema# + title: YouTube Analytics Spec + required: + - credentials + additionalProperties: true + properties: + credentials: + type: object + title: Authenticate via OAuth 2.0 + required: + - client_id + - client_secret + - refresh_token + additionalProperties: true + properties: + client_id: + type: string + description: The Client ID of your developer application + title: Client ID + airbyte_secret: true + client_secret: + type: string + description: The client secret of your developer application + title: Client Secret + airbyte_secret: true + refresh_token: + type: string + description: A refresh token generated using the above client ID and secret + title: Refresh Token + airbyte_secret: true + advanced_auth: + auth_flow_type: oauth2.0 + oauth_config_specification: + complete_oauth_output_specification: + type: object + additionalProperties: true + properties: + refresh_token: + type: string + path_in_connector_config: + - credentials + - refresh_token + complete_oauth_server_input_specification: + type: object + additionalProperties: true + properties: + client_id: + type: string + client_secret: + type: string + complete_oauth_server_output_specification: + type: object + additionalProperties: true + properties: + client_id: + type: string + path_in_connector_config: + - credentials + - client_id + client_secret: + type: string + path_in_connector_config: + - credentials + - client_secret + +metadata: + autoImportSchema: + channel_annotations_a1: false + channel_basic_a2: false + channel_cards_a1: false + channel_combined_a2: false + channel_demographics_a1: false + channel_device_os_a2: false + channel_end_screens_a1: false + channel_playback_location_a2: false + channel_province_a2: false + channel_sharing_service_a1: false + channel_subtitles_a2: false + channel_traffic_source_a2: false + playlist_basic_a1: false + playlist_combined_a1: false + playlist_device_os_a1: false + playlist_playback_location_a1: false + playlist_province_a1: false + playlist_traffic_source_a1: false + yamlComponents: + global: + - authenticator + testedStreams: {} + assist: {} + +schemas: + channel_annotations_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + annotation_click_through_rate: + type: + - "null" + - string + annotation_clickable_impressions: + type: + - "null" + - string + annotation_clicks: + type: + - "null" + - string + annotation_closable_impressions: + type: + - "null" + - string + annotation_close_rate: + type: + - "null" + - string + annotation_closes: + type: + - "null" + - string + annotation_id: + type: + - "null" + - string + annotation_impressions: + type: + - "null" + - string + annotation_type: + type: + - "null" + - string + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + channel_basic_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + annotation_click_through_rate: + type: + - "null" + - number + annotation_clickable_impressions: + type: + - "null" + - integer + annotation_clicks: + type: + - "null" + - integer + annotation_closable_impressions: + type: + - "null" + - integer + annotation_close_rate: + type: + - "null" + - number + annotation_closes: + type: + - "null" + - integer + annotation_impressions: + type: + - "null" + - integer + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + card_click_rate: + type: + - "null" + - number + card_clicks: + type: + - "null" + - integer + card_impressions: + type: + - "null" + - integer + card_teaser_click_rate: + type: + - "null" + - number + card_teaser_clicks: + type: + - "null" + - integer + card_teaser_impressions: + type: + - "null" + - integer + channel_id: + type: + - "null" + - string + comments: + type: + - "null" + - integer + country_code: + type: + - "null" + - string + date: + type: integer + dislikes: + type: + - "null" + - integer + likes: + type: + - "null" + - integer + live_or_on_demand: + type: + - "null" + - string + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + shares: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + subscribers_gained: + type: + - "null" + - integer + subscribers_lost: + type: + - "null" + - integer + video_id: + type: + - "null" + - string + videos_added_to_playlists: + type: + - "null" + - integer + videos_removed_from_playlists: + type: + - "null" + - integer + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_cards_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + card_click_rate: + type: + - "null" + - string + card_clicks: + type: + - "null" + - string + card_id: + type: + - "null" + - string + card_impressions: + type: + - "null" + - string + card_teaser_click_rate: + type: + - "null" + - string + card_teaser_clicks: + type: + - "null" + - string + card_teaser_impressions: + type: + - "null" + - string + card_type: + type: + - "null" + - string + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + channel_combined_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + device_type: + type: + - "null" + - integer + live_or_on_demand: + type: + - "null" + - string + operating_system: + type: + - "null" + - integer + playback_location_type: + type: + - "null" + - integer + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + traffic_source_type: + type: + - "null" + - integer + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_demographics_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + age_group: + type: + - "null" + - string + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + gender: + type: + - "null" + - string + live_or_on_demand: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views_percentage: + type: + - "null" + - string + channel_device_os_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + device_type: + type: + - "null" + - integer + live_or_on_demand: + type: + - "null" + - string + operating_system: + type: + - "null" + - integer + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_end_screens_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + end_screen_element_click_rate: + type: + - "null" + - string + end_screen_element_clicks: + type: + - "null" + - string + end_screen_element_id: + type: + - "null" + - string + end_screen_element_impressions: + type: + - "null" + - string + end_screen_element_type: + type: + - "null" + - string + live_or_on_demand: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + channel_playback_location_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + playback_location_detail: + type: + - "null" + - string + playback_location_type: + type: + - "null" + - integer + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_province_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + annotation_click_through_rate: + type: + - "null" + - integer + annotation_clickable_impressions: + type: + - "null" + - integer + annotation_clicks: + type: + - "null" + - integer + annotation_closable_impressions: + type: + - "null" + - integer + annotation_close_rate: + type: + - "null" + - integer + annotation_closes: + type: + - "null" + - integer + annotation_impressions: + type: + - "null" + - integer + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + card_click_rate: + type: + - "null" + - integer + card_clicks: + type: + - "null" + - integer + card_impressions: + type: + - "null" + - integer + card_teaser_click_rate: + type: + - "null" + - integer + card_teaser_clicks: + type: + - "null" + - integer + card_teaser_impressions: + type: + - "null" + - integer + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + province_code: + type: + - "null" + - string + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_sharing_service_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + shares: + type: + - "null" + - string + sharing_service: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + channel_subtitles_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + subtitle_language: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + channel_traffic_source_a2: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_percentage: + type: + - "null" + - number + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + red_views: + type: + - "null" + - integer + red_watch_time_minutes: + type: + - "null" + - number + subscribed_status: + type: + - "null" + - string + traffic_source_detail: + type: + - "null" + - string + traffic_source_type: + type: + - "null" + - integer + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + playlist_basic_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - integer + playlist_saves_removed: + type: + - "null" + - integer + playlist_starts: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + playlist_combined_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + device_type: + type: + - "null" + - integer + live_or_on_demand: + type: + - "null" + - string + operating_system: + type: + - "null" + - integer + playback_location_type: + type: + - "null" + - integer + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - integer + playlist_saves_removed: + type: + - "null" + - integer + playlist_starts: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + traffic_source_type: + type: + - "null" + - integer + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + playlist_device_os_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + device_type: + type: + - "null" + - integer + live_or_on_demand: + type: + - "null" + - string + operating_system: + type: + - "null" + - integer + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - integer + playlist_saves_removed: + type: + - "null" + - integer + playlist_starts: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + playlist_playback_location_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + playback_location_detail: + type: + - "null" + - string + playback_location_type: + type: + - "null" + - integer + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - integer + playlist_saves_removed: + type: + - "null" + - integer + playlist_starts: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number + playlist_province_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - string + playlist_saves_removed: + type: + - "null" + - string + playlist_starts: + type: + - "null" + - string + province_code: + type: + - "null" + - string + subscribed_status: + type: + - "null" + - string + video_id: + type: + - "null" + - string + views: + type: + - "null" + - string + watch_time_minutes: + type: + - "null" + - number + playlist_traffic_source_a1: + type: object + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: true + properties: + average_view_duration_seconds: + type: + - "null" + - number + channel_id: + type: + - "null" + - string + country_code: + type: + - "null" + - string + date: + type: integer + live_or_on_demand: + type: + - "null" + - string + playlist_id: + type: + - "null" + - string + playlist_saves_added: + type: + - "null" + - integer + playlist_saves_removed: + type: + - "null" + - integer + playlist_starts: + type: + - "null" + - integer + subscribed_status: + type: + - "null" + - string + traffic_source_detail: + type: + - "null" + - string + traffic_source_type: + type: + - "null" + - integer + video_id: + type: + - "null" + - string + views: + type: + - "null" + - integer + watch_time_minutes: + type: + - "null" + - number diff --git a/airbyte-integrations/connectors/source-youtube-analytics/metadata.yaml b/airbyte-integrations/connectors/source-youtube-analytics/metadata.yaml index 3a70c80e9aa2b..9859299e06bc2 100644 --- a/airbyte-integrations/connectors/source-youtube-analytics/metadata.yaml +++ b/airbyte-integrations/connectors/source-youtube-analytics/metadata.yaml @@ -8,7 +8,7 @@ data: connectorSubtype: api connectorType: source definitionId: afa734e4-3571-11ec-991a-1e0031268139 - dockerImageTag: 0.1.6 + dockerImageTag: 0.2.0 dockerRepository: airbyte/source-youtube-analytics documentationUrl: https://docs.airbyte.com/integrations/sources/youtube-analytics githubIssueLabel: source-youtube-analytics @@ -17,7 +17,7 @@ data: name: YouTube Analytics remoteRegistries: pypi: - enabled: true + enabled: false packageName: airbyte-source-youtube-analytics registryOverrides: cloud: @@ -27,8 +27,8 @@ data: releaseStage: beta supportLevel: community tags: - - language:python - - cdk:python + - cdk:low-code + - language:manifest-only connectorTestSuitesOptions: - suite: acceptanceTests testSecrets: @@ -38,5 +38,5 @@ data: type: GSM alias: airbyte-connector-testing-secret-store connectorBuildOptions: - baseImage: docker.io/airbyte/python-connector-base:1.2.0@sha256:c22a9d97464b69d6ef01898edf3f8612dc11614f05a84984451dde195f337db9 + baseImage: docker.io/airbyte/source-declarative-manifest:6.27.0@sha256:ffc5f087448ef40fd1ef8fe0fc660b16621be7c1e8ecfccd44002136b06c6efb metadataSpecVersion: "1.0" diff --git a/airbyte-integrations/connectors/source-youtube-analytics/poetry.lock b/airbyte-integrations/connectors/source-youtube-analytics/poetry.lock deleted file mode 100644 index a7809966e52b9..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/poetry.lock +++ /dev/null @@ -1,1032 +0,0 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. - -[[package]] -name = "airbyte-cdk" -version = "0.38.0" -description = "A framework for writing Airbyte Connectors." -optional = false -python-versions = ">=3.8" -files = [ - {file = "airbyte-cdk-0.38.0.tar.gz", hash = "sha256:46f054f2f1e8a896a96f9736517bdea1c52ec10ab796b1713122fe04283fb9d0"}, - {file = "airbyte_cdk-0.38.0-py3-none-any.whl", hash = "sha256:8232cad8af0b98e341bf2311990a044bbd82748b6c47dbb3aa0ce6097f0a4ad0"}, -] - -[package.dependencies] -airbyte-protocol-models = "0.3.6" -backoff = "*" -cachetools = "*" -Deprecated = ">=1.2,<2.0" -dpath = ">=2.0.1,<2.1.0" -genson = "1.2.2" -isodate = ">=0.6.1,<0.7.0" -Jinja2 = ">=3.1.2,<3.2.0" -jsonref = ">=0.2,<1.0" -jsonschema = ">=3.2.0,<3.3.0" -pendulum = "*" -pydantic = ">=1.9.2,<1.10.0" -python-dateutil = "*" -PyYAML = ">=5.4,<6.0" -requests = "*" -requests-cache = "*" - -[package.extras] -dev = ["MyPy (>=0.812,<1.0)", "freezegun", "pytest", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests-mock"] -sphinx-docs = ["Sphinx (>=4.2,<5.0)", "sphinx-rtd-theme (>=1.0,<2.0)"] - -[[package]] -name = "airbyte-protocol-models" -version = "0.3.6" -description = "Declares the Airbyte Protocol." -optional = false -python-versions = ">=3.8" -files = [ - {file = "airbyte_protocol_models-0.3.6-py3-none-any.whl", hash = "sha256:ecd86f41ad5ef66adb2b2c93256148c777c726df8d467ae1af1a7ccf2227f6b1"}, - {file = "airbyte_protocol_models-0.3.6.tar.gz", hash = "sha256:de09dca4f21d3583fe5ea53cff1c3133a006c8f820ee5242ebeb7d8485247a41"}, -] - -[package.dependencies] -pydantic = ">=1.9.2,<1.10.0" - -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - -[[package]] -name = "cachetools" -version = "5.3.3" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, -] - -[[package]] -name = "cattrs" -version = "23.2.3" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, - {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, -] - -[package.dependencies] -attrs = ">=23.1.0" -exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} - -[package.extras] -bson = ["pymongo (>=4.4.0)"] -cbor2 = ["cbor2 (>=5.4.6)"] -msgpack = ["msgpack (>=1.0.5)"] -orjson = ["orjson (>=3.9.2)"] -pyyaml = ["pyyaml (>=6.0)"] -tomlkit = ["tomlkit (>=0.11.8)"] -ujson = ["ujson (>=5.7.0)"] - -[[package]] -name = "certifi" -version = "2024.6.2" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - -[[package]] -name = "dpath" -version = "2.0.8" -description = "Filesystem-like pathing and searching for dictionaries" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.0.8-py3-none-any.whl", hash = "sha256:f92f595214dd93a00558d75d4b858beee519f4cffca87f02616ad6cd013f3436"}, - {file = "dpath-2.0.8.tar.gz", hash = "sha256:a3440157ebe80d0a3ad794f1b61c571bef125214800ffdb9afc9424e8250fe9b"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "genson" -version = "1.2.2" -description = "GenSON is a powerful, user-friendly JSON Schema generator." -optional = false -python-versions = "*" -files = [ - {file = "genson-1.2.2.tar.gz", hash = "sha256:8caf69aa10af7aee0e1a1351d1d06801f4696e005f06cedef438635384346a16"}, -] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "isodate" -version = "0.6.1" -description = "An ISO 8601 date/time/duration parser and formatter" -optional = false -python-versions = "*" -files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "jinja2" -version = "3.1.4" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jsonref" -version = "0.3.0" -description = "jsonref is a library for automatic dereferencing of JSON Reference objects for Python." -optional = false -python-versions = ">=3.3,<4.0" -files = [ - {file = "jsonref-0.3.0-py3-none-any.whl", hash = "sha256:9480ad1b500f7e795daeb0ef29f9c55ae3a9ab38fb8d6659b6f4868acb5a5bc8"}, - {file = "jsonref-0.3.0.tar.gz", hash = "sha256:68b330c6815dc0d490dbb3d65ccda265ddde9f7856fd2f3322f971d456ea7549"}, -] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] - -[[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pendulum" -version = "3.0.0" -description = "Python datetimes made easy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, - {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c58227ac260d5b01fc1025176d7b31858c9f62595737f350d22124a9a3ad82d"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60fb6f415fea93a11c52578eaa10594568a6716602be8430b167eb0d730f3332"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b69f6b4dbcb86f2c2fe696ba991e67347bcf87fe601362a1aba6431454b46bde"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:138afa9c373ee450ede206db5a5e9004fd3011b3c6bbe1e57015395cd076a09f"}, - {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:83d9031f39c6da9677164241fd0d37fbfc9dc8ade7043b5d6d62f56e81af8ad2"}, - {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c2308af4033fa534f089595bcd40a95a39988ce4059ccd3dc6acb9ef14ca44a"}, - {file = "pendulum-3.0.0-cp310-none-win_amd64.whl", hash = "sha256:9a59637cdb8462bdf2dbcb9d389518c0263799189d773ad5c11db6b13064fa79"}, - {file = "pendulum-3.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3725245c0352c95d6ca297193192020d1b0c0f83d5ee6bb09964edc2b5a2d508"}, - {file = "pendulum-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c035f03a3e565ed132927e2c1b691de0dbf4eb53b02a5a3c5a97e1a64e17bec"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597e66e63cbd68dd6d58ac46cb7a92363d2088d37ccde2dae4332ef23e95cd00"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99a0f8172e19f3f0c0e4ace0ad1595134d5243cf75985dc2233e8f9e8de263ca"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77d8839e20f54706aed425bec82a83b4aec74db07f26acd039905d1237a5e1d4"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afde30e8146292b059020fbc8b6f8fd4a60ae7c5e6f0afef937bbb24880bdf01"}, - {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:660434a6fcf6303c4efd36713ca9212c753140107ee169a3fc6c49c4711c2a05"}, - {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dee9e5a48c6999dc1106eb7eea3e3a50e98a50651b72c08a87ee2154e544b33e"}, - {file = "pendulum-3.0.0-cp311-none-win_amd64.whl", hash = "sha256:d4cdecde90aec2d67cebe4042fd2a87a4441cc02152ed7ed8fb3ebb110b94ec4"}, - {file = "pendulum-3.0.0-cp311-none-win_arm64.whl", hash = "sha256:773c3bc4ddda2dda9f1b9d51fe06762f9200f3293d75c4660c19b2614b991d83"}, - {file = "pendulum-3.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:409e64e41418c49f973d43a28afe5df1df4f1dd87c41c7c90f1a63f61ae0f1f7"}, - {file = "pendulum-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38ad2121c5ec7c4c190c7334e789c3b4624798859156b138fcc4d92295835dc"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde4d0b2024b9785f66b7f30ed59281bd60d63d9213cda0eb0910ead777f6d37"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2c5675769fb6d4c11238132962939b960fcb365436b6d623c5864287faa319"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af95e03e066826f0f4c65811cbee1b3123d4a45a1c3a2b4fc23c4b0dff893b5"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2165a8f33cb15e06c67070b8afc87a62b85c5a273e3aaa6bc9d15c93a4920d6f"}, - {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ad5e65b874b5e56bd942546ea7ba9dd1d6a25121db1c517700f1c9de91b28518"}, - {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17fe4b2c844bbf5f0ece69cfd959fa02957c61317b2161763950d88fed8e13b9"}, - {file = "pendulum-3.0.0-cp312-none-win_amd64.whl", hash = "sha256:78f8f4e7efe5066aca24a7a57511b9c2119f5c2b5eb81c46ff9222ce11e0a7a5"}, - {file = "pendulum-3.0.0-cp312-none-win_arm64.whl", hash = "sha256:28f49d8d1e32aae9c284a90b6bb3873eee15ec6e1d9042edd611b22a94ac462f"}, - {file = "pendulum-3.0.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d4e2512f4e1a4670284a153b214db9719eb5d14ac55ada5b76cbdb8c5c00399d"}, - {file = "pendulum-3.0.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d897eb50883cc58d9b92f6405245f84b9286cd2de6e8694cb9ea5cb15195a32"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e169cc2ca419517f397811bbe4589cf3cd13fca6dc38bb352ba15ea90739ebb"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17c3084a4524ebefd9255513692f7e7360e23c8853dc6f10c64cc184e1217ab"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:826d6e258052715f64d05ae0fc9040c0151e6a87aae7c109ba9a0ed930ce4000"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2aae97087872ef152a0c40e06100b3665d8cb86b59bc8471ca7c26132fccd0f"}, - {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac65eeec2250d03106b5e81284ad47f0d417ca299a45e89ccc69e36130ca8bc7"}, - {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5346d08f3f4a6e9e672187faa179c7bf9227897081d7121866358af369f44f9"}, - {file = "pendulum-3.0.0-cp37-none-win_amd64.whl", hash = "sha256:235d64e87946d8f95c796af34818c76e0f88c94d624c268693c85b723b698aa9"}, - {file = "pendulum-3.0.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6a881d9c2a7f85bc9adafcfe671df5207f51f5715ae61f5d838b77a1356e8b7b"}, - {file = "pendulum-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7762d2076b9b1cb718a6631ad6c16c23fc3fac76cbb8c454e81e80be98daa34"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e8e36a8130819d97a479a0e7bf379b66b3b1b520e5dc46bd7eb14634338df8c"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dc843253ac373358ffc0711960e2dd5b94ab67530a3e204d85c6e8cb2c5fa10"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a78ad3635d609ceb1e97d6aedef6a6a6f93433ddb2312888e668365908c7120"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a137e9e0d1f751e60e67d11fc67781a572db76b2296f7b4d44554761049d6"}, - {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c95984037987f4a457bb760455d9ca80467be792236b69d0084f228a8ada0162"}, - {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29c6e578fe0f893766c0d286adbf0b3c726a4e2341eba0917ec79c50274ec16"}, - {file = "pendulum-3.0.0-cp38-none-win_amd64.whl", hash = "sha256:deaba8e16dbfcb3d7a6b5fabdd5a38b7c982809567479987b9c89572df62e027"}, - {file = "pendulum-3.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b11aceea5b20b4b5382962b321dbc354af0defe35daa84e9ff3aae3c230df694"}, - {file = "pendulum-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90d4d504e82ad236afac9adca4d6a19e4865f717034fc69bafb112c320dcc8f"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825799c6b66e3734227756fa746cc34b3549c48693325b8b9f823cb7d21b19ac"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad769e98dc07972e24afe0cff8d365cb6f0ebc7e65620aa1976fcfbcadc4c6f3"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6fc26907eb5fb8cc6188cc620bc2075a6c534d981a2f045daa5f79dfe50d512"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c717eab1b6d898c00a3e0fa7781d615b5c5136bbd40abe82be100bb06df7a56"}, - {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3ddd1d66d1a714ce43acfe337190be055cdc221d911fc886d5a3aae28e14b76d"}, - {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:822172853d7a9cf6da95d7b66a16c7160cb99ae6df55d44373888181d7a06edc"}, - {file = "pendulum-3.0.0-cp39-none-win_amd64.whl", hash = "sha256:840de1b49cf1ec54c225a2a6f4f0784d50bd47f68e41dc005b7f67c7d5b5f3ae"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b1f74d1e6ffe5d01d6023870e2ce5c2191486928823196f8575dcc786e107b1"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:729e9f93756a2cdfa77d0fc82068346e9731c7e884097160603872686e570f07"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e586acc0b450cd21cbf0db6bae386237011b75260a3adceddc4be15334689a9a"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22e7944ffc1f0099a79ff468ee9630c73f8c7835cd76fdb57ef7320e6a409df4"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fa30af36bd8e50686846bdace37cf6707bdd044e5cb6e1109acbad3277232e04"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:440215347b11914ae707981b9a57ab9c7b6983ab0babde07063c6ee75c0dc6e7"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:314c4038dc5e6a52991570f50edb2f08c339debdf8cea68ac355b32c4174e820"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5acb1d386337415f74f4d1955c4ce8d0201978c162927d07df8eb0692b2d8533"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a789e12fbdefaffb7b8ac67f9d8f22ba17a3050ceaaa635cd1cc4645773a4b1e"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:860aa9b8a888e5913bd70d819306749e5eb488e6b99cd6c47beb701b22bdecf5"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5ebc65ea033ef0281368217fbf59f5cb05b338ac4dd23d60959c7afcd79a60a0"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9fef18ab0386ef6a9ac7bad7e43ded42c83ff7ad412f950633854f90d59afa8"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c134ba2f0571d0b68b83f6972e2307a55a5a849e7dac8505c715c531d2a8795"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:385680812e7e18af200bb9b4a49777418c32422d05ad5a8eb85144c4a285907b"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eec91cd87c59fb32ec49eb722f375bd58f4be790cae11c1b70fac3ee4f00da0"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4386bffeca23c4b69ad50a36211f75b35a4deb6210bdca112ac3043deb7e494a"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dfbcf1661d7146d7698da4b86e7f04814221081e9fe154183e34f4c5f5fa3bf8"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:04a1094a5aa1daa34a6b57c865b25f691848c61583fb22722a4df5699f6bf74c"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5b0ec85b9045bd49dd3a3493a5e7ddfd31c36a2a60da387c419fa04abcaecb23"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0a15b90129765b705eb2039062a6daf4d22c4e28d1a54fa260892e8c3ae6e157"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:bb8f6d7acd67a67d6fedd361ad2958ff0539445ef51cbe8cd288db4306503cd0"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd69b15374bef7e4b4440612915315cc42e8575fcda2a3d7586a0d88192d0c88"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc00f8110db6898360c53c812872662e077eaf9c75515d53ecc65d886eec209a"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:83a44e8b40655d0ba565a5c3d1365d27e3e6778ae2a05b69124db9e471255c4a"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1a3604e9fbc06b788041b2a8b78f75c243021e0f512447806a6d37ee5214905d"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:92c307ae7accebd06cbae4729f0ba9fa724df5f7d91a0964b1b972a22baa482b"}, - {file = "pendulum-3.0.0.tar.gz", hash = "sha256:5d034998dea404ec31fae27af6b22cff1708f830a1ed7353be4d1019bb9f584e"}, -] - -[package.dependencies] -python-dateutil = ">=2.6" -tzdata = ">=2020.1" - -[package.extras] -test = ["time-machine (>=2.6.0)"] - -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - -[[package]] -name = "pydantic" -version = "1.9.2" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "pydantic-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e"}, - {file = "pydantic-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08"}, - {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c"}, - {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131"}, - {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76"}, - {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567"}, - {file = "pydantic-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044"}, - {file = "pydantic-1.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555"}, - {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84"}, - {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f"}, - {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb"}, - {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b"}, - {file = "pydantic-1.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001"}, - {file = "pydantic-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56"}, - {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4"}, - {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f"}, - {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979"}, - {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d"}, - {file = "pydantic-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7"}, - {file = "pydantic-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3"}, - {file = "pydantic-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa"}, - {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3"}, - {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0"}, - {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8"}, - {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8"}, - {file = "pydantic-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326"}, - {file = "pydantic-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801"}, - {file = "pydantic-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44"}, - {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747"}, - {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453"}, - {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb"}, - {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15"}, - {file = "pydantic-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55"}, - {file = "pydantic-1.9.2-py3-none-any.whl", hash = "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e"}, - {file = "pydantic-1.9.2.tar.gz", hash = "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d"}, -] - -[package.dependencies] -typing-extensions = ">=3.7.4.3" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pyyaml" -version = "5.4.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-cache" -version = "1.2.0" -description = "A persistent cache for python requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests_cache-1.2.0-py3-none-any.whl", hash = "sha256:490324301bf0cb924ff4e6324bd2613453e7e1f847353928b08adb0fdfb7f722"}, - {file = "requests_cache-1.2.0.tar.gz", hash = "sha256:db1c709ca343cc1cd5b6c8b1a5387298eceed02306a6040760db538c885e3838"}, -] - -[package.dependencies] -attrs = ">=21.2" -cattrs = ">=22.2" -platformdirs = ">=2.5" -requests = ">=2.22" -url-normalize = ">=1.4" -urllib3 = ">=1.25.5" - -[package.extras] -all = ["boto3 (>=1.15)", "botocore (>=1.18)", "itsdangerous (>=2.0)", "pymongo (>=3)", "pyyaml (>=6.0.1)", "redis (>=3)", "ujson (>=5.4)"] -bson = ["bson (>=0.5)"] -docs = ["furo (>=2023.3,<2024.0)", "linkify-it-py (>=2.0,<3.0)", "myst-parser (>=1.0,<2.0)", "sphinx (>=5.0.2,<6.0.0)", "sphinx-autodoc-typehints (>=1.19)", "sphinx-automodapi (>=0.14)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.2)", "sphinx-notfound-page (>=0.8)", "sphinxcontrib-apidoc (>=0.3)", "sphinxext-opengraph (>=0.9)"] -dynamodb = ["boto3 (>=1.15)", "botocore (>=1.18)"] -json = ["ujson (>=5.4)"] -mongodb = ["pymongo (>=3)"] -redis = ["redis (>=3)"] -security = ["itsdangerous (>=2.0)"] -yaml = ["pyyaml (>=6.0.1)"] - -[[package]] -name = "requests-mock" -version = "1.9.3" -description = "Mock out responses from the requests package" -optional = false -python-versions = "*" -files = [ - {file = "requests-mock-1.9.3.tar.gz", hash = "sha256:8d72abe54546c1fc9696fa1516672f1031d72a55a1d66c85184f972a24ba0eba"}, - {file = "requests_mock-1.9.3-py2.py3-none-any.whl", hash = "sha256:0a2d38a117c08bb78939ec163522976ad59a6b7fdd82b709e23bb98004a44970"}, -] - -[package.dependencies] -requests = ">=2.3,<3" -six = "*" - -[package.extras] -fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.18)", "testtools"] - -[[package]] -name = "setuptools" -version = "70.0.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, - {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, -] - -[package.extras] -docs = ["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"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "tzdata" -version = "2024.1" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, -] - -[[package]] -name = "url-normalize" -version = "1.4.3" -description = "URL normalization for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "url-normalize-1.4.3.tar.gz", hash = "sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2"}, - {file = "url_normalize-1.4.3-py2.py3-none-any.whl", hash = "sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "urllib3" -version = "2.2.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.6" -files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.9,<3.12" -content-hash = "ee26f6ef6b3ba9c7a97696e9ce8e7a8ea1f8450df15a732ed3b8e32bfaa0ada7" diff --git a/airbyte-integrations/connectors/source-youtube-analytics/pyproject.toml b/airbyte-integrations/connectors/source-youtube-analytics/pyproject.toml deleted file mode 100644 index 72cd145624feb..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/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.1.6" -name = "source-youtube-analytics" -description = "Source implementation for Youtube Analytics." -authors = [ "Airbyte ",] -license = "MIT" -readme = "README.md" -documentation = "https://docs.airbyte.com/integrations/sources/youtube-analytics" -homepage = "https://airbyte.com" -repository = "https://github.com/airbytehq/airbyte" -[[tool.poetry.packages]] -include = "source_youtube_analytics" - -[tool.poetry.dependencies] -python = "^3.9,<3.12" -airbyte-cdk = "0.38.0" - -[tool.poetry.scripts] -source-youtube-analytics = "source_youtube_analytics.run:run" - -[tool.poetry.group.dev.dependencies] -requests-mock = "==1.9.3" -pytest = "^6.1" -pytest-mock = "^3.6.1" diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/__init__.py b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/__init__.py deleted file mode 100644 index 6970981cc59e5..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -# Copyright (c) 2021 Airbyte, Inc., all rights reserved. -# - - -from .source import SourceYoutubeAnalytics - -__all__ = ["SourceYoutubeAnalytics"] diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/defaults/channel_reports.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/defaults/channel_reports.json deleted file mode 100644 index 23a8c483d6f96..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/defaults/channel_reports.json +++ /dev/null @@ -1,274 +0,0 @@ -[ - { - "id": "channel_annotations_a1", - "name": "Annotations", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "annotation_type", - "annotation_id" - ], - "metrics": [] - }, - { - "id": "channel_basic_a2", - "name": "User activity", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code" - ], - "metrics": [] - }, - { - "id": "channel_cards_a1", - "name": "Cards", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "card_type", - "card_id" - ], - "metrics": [] - }, - { - "id": "channel_combined_a2", - "name": "Combined", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "playback_location_type", - "traffic_source_type", - "device_type", - "operating_system" - ], - "metrics": [] - }, - { - "id": "channel_demographics_a1", - "name": "Demographics", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "age_group", - "gender" - ], - "metrics": [] - }, - { - "id": "channel_device_os_a2", - "name": "Device and OS", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "device_type", - "operating_system" - ], - "metrics": [] - }, - { - "id": "channel_end_screens_a1", - "name": "End screens", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "end_screen_element_type", - "end_screen_element_id" - ], - "metrics": [] - }, - { - "id": "channel_playback_location_a2", - "name": "Playback locations", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "playback_location_type", - "playback_location_detail" - ], - "metrics": [] - }, - { - "id": "channel_province_a2", - "name": "Province", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "province_code" - ], - "metrics": [] - }, - { - "id": "channel_sharing_service_a1", - "name": "Sharing service", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "sharing_service" - ], - "metrics": [] - }, - { - "id": "channel_subtitles_a2", - "name": "Subtitles", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "subtitle_language" - ], - "metrics": [] - }, - { - "id": "channel_traffic_source_a2", - "name": "Traffic sources", - "dimensions": [ - "date", - "channel_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "traffic_source_type", - "traffic_source_detail" - ], - "metrics": [] - }, - { - "id": "playlist_basic_a1", - "name": "Playlist user activity", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code" - ], - "metrics": [] - }, - { - "id": "playlist_combined_a1", - "name": "Playlist combined", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "playback_location_type", - "traffic_source_type", - "device_type", - "operating_system" - ], - "metrics": [] - }, - { - "id": "playlist_device_os_a1", - "name": "Playlist device and OS", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "device_type", - "operating_system" - ], - "metrics": [] - }, - { - "id": "playlist_playback_location_a1", - "name": "Playlist playback locations", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "playback_location_type", - "playback_location_detail" - ], - "metrics": [] - }, - { - "id": "playlist_province_a1", - "name": "Playlist province", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "province_code" - ], - "metrics": [] - }, - { - "id": "playlist_traffic_source_a1", - "name": "Playlist traffic sources", - "dimensions": [ - "date", - "channel_id", - "playlist_id", - "video_id", - "live_or_on_demand", - "subscribed_status", - "country_code", - "traffic_source_type", - "traffic_source_detail" - ], - "metrics": [] - } -] diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/run.py deleted file mode 100644 index 27f8967eff437..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/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_youtube_analytics import SourceYoutubeAnalytics - - -def run(): - source = SourceYoutubeAnalytics() - launch(source, sys.argv[1:]) diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_annotations_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_annotations_a1.json deleted file mode 100644 index 7d44a378504c0..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_annotations_a1.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "annotation_type": { - "type": ["null", "string"] - }, - "annotation_id": { - "type": ["null", "string"] - }, - "annotation_impressions": { - "type": ["null", "string"] - }, - "annotation_clickable_impressions": { - "type": ["null", "string"] - }, - "annotation_clicks": { - "type": ["null", "string"] - }, - "annotation_click_through_rate": { - "type": ["null", "string"] - }, - "annotation_closable_impressions": { - "type": ["null", "string"] - }, - "annotation_closes": { - "type": ["null", "string"] - }, - "annotation_close_rate": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_basic_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_basic_a2.json deleted file mode 100644 index 98e09cf869b3d..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_basic_a2.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "comments": { - "type": ["null", "integer"] - }, - "likes": { - "type": ["null", "integer"] - }, - "dislikes": { - "type": ["null", "integer"] - }, - "shares": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "annotation_impressions": { - "type": ["null", "integer"] - }, - "annotation_clickable_impressions": { - "type": ["null", "integer"] - }, - "annotation_clicks": { - "type": ["null", "integer"] - }, - "annotation_click_through_rate": { - "type": ["null", "number"] - }, - "annotation_closable_impressions": { - "type": ["null", "integer"] - }, - "annotation_closes": { - "type": ["null", "integer"] - }, - "annotation_close_rate": { - "type": ["null", "number"] - }, - "card_teaser_impressions": { - "type": ["null", "integer"] - }, - "card_teaser_clicks": { - "type": ["null", "integer"] - }, - "card_teaser_click_rate": { - "type": ["null", "number"] - }, - "card_impressions": { - "type": ["null", "integer"] - }, - "card_clicks": { - "type": ["null", "integer"] - }, - "card_click_rate": { - "type": ["null", "number"] - }, - "subscribers_gained": { - "type": ["null", "integer"] - }, - "subscribers_lost": { - "type": ["null", "integer"] - }, - "videos_added_to_playlists": { - "type": ["null", "integer"] - }, - "videos_removed_from_playlists": { - "type": ["null", "integer"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_cards_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_cards_a1.json deleted file mode 100644 index 25a8fae12135a..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_cards_a1.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "card_type": { - "type": ["null", "string"] - }, - "card_id": { - "type": ["null", "string"] - }, - "card_teaser_impressions": { - "type": ["null", "string"] - }, - "card_teaser_clicks": { - "type": ["null", "string"] - }, - "card_teaser_click_rate": { - "type": ["null", "string"] - }, - "card_impressions": { - "type": ["null", "string"] - }, - "card_clicks": { - "type": ["null", "string"] - }, - "card_click_rate": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_combined_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_combined_a2.json deleted file mode 100644 index 08b81fee2eb1b..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_combined_a2.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "playback_location_type": { - "type": ["null", "integer"] - }, - "traffic_source_type": { - "type": ["null", "integer"] - }, - "device_type": { - "type": ["null", "integer"] - }, - "operating_system": { - "type": ["null", "integer"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_demographics_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_demographics_a1.json deleted file mode 100644 index 78ed6aacc97d1..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_demographics_a1.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "age_group": { - "type": ["null", "string"] - }, - "gender": { - "type": ["null", "string"] - }, - "views_percentage": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_device_os_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_device_os_a2.json deleted file mode 100644 index c589e6ade85e0..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_device_os_a2.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "device_type": { - "type": ["null", "integer"] - }, - "operating_system": { - "type": ["null", "integer"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_end_screens_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_end_screens_a1.json deleted file mode 100644 index 398b81005f872..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_end_screens_a1.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "end_screen_element_type": { - "type": ["null", "string"] - }, - "end_screen_element_id": { - "type": ["null", "string"] - }, - "end_screen_element_clicks": { - "type": ["null", "string"] - }, - "end_screen_element_impressions": { - "type": ["null", "string"] - }, - "end_screen_element_click_rate": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_playback_location_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_playback_location_a2.json deleted file mode 100644 index f3ec4a981964b..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_playback_location_a2.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "playback_location_type": { - "type": ["null", "integer"] - }, - "playback_location_detail": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_province_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_province_a2.json deleted file mode 100644 index 31b1164852043..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_province_a2.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "province_code": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "annotation_click_through_rate": { - "type": ["null", "integer"] - }, - "annotation_close_rate": { - "type": ["null", "integer"] - }, - "annotation_impressions": { - "type": ["null", "integer"] - }, - "annotation_clickable_impressions": { - "type": ["null", "integer"] - }, - "annotation_closable_impressions": { - "type": ["null", "integer"] - }, - "annotation_clicks": { - "type": ["null", "integer"] - }, - "annotation_closes": { - "type": ["null", "integer"] - }, - "card_click_rate": { - "type": ["null", "integer"] - }, - "card_teaser_click_rate": { - "type": ["null", "integer"] - }, - "card_impressions": { - "type": ["null", "integer"] - }, - "card_teaser_impressions": { - "type": ["null", "integer"] - }, - "card_clicks": { - "type": ["null", "integer"] - }, - "card_teaser_clicks": { - "type": ["null", "integer"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_sharing_service_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_sharing_service_a1.json deleted file mode 100644 index 70b9bd150b7fd..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_sharing_service_a1.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "sharing_service": { - "type": ["null", "string"] - }, - "shares": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_subtitles_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_subtitles_a2.json deleted file mode 100644 index d189c49b2e8c6..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_subtitles_a2.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "subtitle_language": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_traffic_source_a2.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_traffic_source_a2.json deleted file mode 100644 index 077e0585c5302..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/channel_traffic_source_a2.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "traffic_source_type": { - "type": ["null", "integer"] - }, - "traffic_source_detail": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "average_view_duration_percentage": { - "type": ["null", "number"] - }, - "red_views": { - "type": ["null", "integer"] - }, - "red_watch_time_minutes": { - "type": ["null", "number"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_basic_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_basic_a1.json deleted file mode 100644 index d2fc5834aaceb..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_basic_a1.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "integer"] - }, - "playlist_saves_added": { - "type": ["null", "integer"] - }, - "playlist_saves_removed": { - "type": ["null", "integer"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_combined_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_combined_a1.json deleted file mode 100644 index cdd3292cd9812..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_combined_a1.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "playback_location_type": { - "type": ["null", "integer"] - }, - "traffic_source_type": { - "type": ["null", "integer"] - }, - "device_type": { - "type": ["null", "integer"] - }, - "operating_system": { - "type": ["null", "integer"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "integer"] - }, - "playlist_saves_added": { - "type": ["null", "integer"] - }, - "playlist_saves_removed": { - "type": ["null", "integer"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_device_os_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_device_os_a1.json deleted file mode 100644 index 383957aa165de..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_device_os_a1.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "device_type": { - "type": ["null", "integer"] - }, - "operating_system": { - "type": ["null", "integer"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "integer"] - }, - "playlist_saves_added": { - "type": ["null", "integer"] - }, - "playlist_saves_removed": { - "type": ["null", "integer"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_playback_location_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_playback_location_a1.json deleted file mode 100644 index 5ce825fab94b2..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_playback_location_a1.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "playback_location_type": { - "type": ["null", "integer"] - }, - "playback_location_detail": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "integer"] - }, - "playlist_saves_added": { - "type": ["null", "integer"] - }, - "playlist_saves_removed": { - "type": ["null", "integer"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_province_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_province_a1.json deleted file mode 100644 index 2d77f0d13fd12..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_province_a1.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "province_code": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "string"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "string"] - }, - "playlist_saves_added": { - "type": ["null", "string"] - }, - "playlist_saves_removed": { - "type": ["null", "string"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_traffic_source_a1.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_traffic_source_a1.json deleted file mode 100644 index 3c6a1ab476ed7..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/schemas/playlist_traffic_source_a1.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "date": { - "type": "integer" - }, - "channel_id": { - "type": ["null", "string"] - }, - "playlist_id": { - "type": ["null", "string"] - }, - "video_id": { - "type": ["null", "string"] - }, - "live_or_on_demand": { - "type": ["null", "string"] - }, - "subscribed_status": { - "type": ["null", "string"] - }, - "country_code": { - "type": ["null", "string"] - }, - "traffic_source_type": { - "type": ["null", "integer"] - }, - "traffic_source_detail": { - "type": ["null", "string"] - }, - "views": { - "type": ["null", "integer"] - }, - "watch_time_minutes": { - "type": ["null", "number"] - }, - "average_view_duration_seconds": { - "type": ["null", "number"] - }, - "playlist_starts": { - "type": ["null", "integer"] - }, - "playlist_saves_added": { - "type": ["null", "integer"] - }, - "playlist_saves_removed": { - "type": ["null", "integer"] - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py deleted file mode 100644 index cd6af9e03d9bc..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/source.py +++ /dev/null @@ -1,303 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - - -import csv -import datetime -import io -import json -import pkgutil -from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple - -import pendulum -import requests - -from airbyte_cdk.sources import AbstractSource -from airbyte_cdk.sources.streams import Stream -from airbyte_cdk.sources.streams.http import HttpStream, HttpSubStream -from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator -from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer - - -class CustomBackoffMixin: - def daily_quota_exceeded(self, response: requests.Response) -> bool: - """Response example: - { - "error": { - "code": 429, - "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per minute' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127'.", - "status": "RESOURCE_EXHAUSTED", - "details": [ - { - "reason": "RATE_LIMIT_EXCEEDED", - "metadata": { - "consumer": "projects/863188056127", - "quota_limit": "FreeQuotaRequestsPerMinutePerProject", - "quota_limit_value": "60", - "quota_metric": "youtubereporting.googleapis.com/free_quota_requests", - "service": "youtubereporting.googleapis.com", - } - }, - ] - } - } - - :param response: - :return: - """ - details = response.json().get("error", {}).get("details", []) - for detail in details: - if detail.get("reason") == "RATE_LIMIT_EXCEEDED": - if detail.get("metadata", {}).get("quota_limit") == "FreeQuotaRequestsPerDayPerProject": - self.logger.error(f"Exceeded daily quota: {detail.get('metadata', {}).get('quota_limit_value')} reqs/day") - return True - break - return False - - def should_retry(self, response: requests.Response) -> bool: - """ - Override to set different conditions for backoff based on the response from the server. - - By default, back off on the following HTTP response statuses: - - 500s to handle transient server errors - - 429 (Too Many Requests) indicating rate limiting: - Different behavior in case of 'RATE_LIMIT_EXCEEDED': - - Requests Per Minute: - "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per minute' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127'." - "quota_limit": "FreeQuotaRequestsPerMinutePerProject", - "quota_limit_value": "60", - - --> use increased retry_factor (30 seconds) - - Requests Per Day: - "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per day' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127" - "quota_limit": "FreeQuotaRequestsPerDayPerProject - "quota_limit_value": "20000", - - --> just throw an error, next scan is reasonable to start only in 1 day. - """ - if 500 <= response.status_code < 600: - return True - - if response.status_code == 429 and not self.daily_quota_exceeded(response): - return True - - return False - - @property - def retry_factor(self) -> float: - """ - Default FreeQuotaRequestsPerMinutePerProject is 60 reqs/min, so reasonable delay is 30 seconds - """ - return 30 - - -class JobsResource(CustomBackoffMixin, HttpStream): - """ - https://developers.google.com/youtube/reporting/v1/reference/rest/v1/jobs - - All YouTube Analytics streams require a created reporting job. - This class allows to `list` all existing reporting jobs or `create` new reporting job for a specific stream. One stream can have only one reporting job. - By creating a reporting job, you are instructing YouTube to generate stream data on a daily basis. If reporting job is removed YouTube removes all stream data. - - On every connector invocation, it gets a list of all running reporting jobs, if the currently processed stream has a reporting job - connector does nothing, - but if the currently processed stream does not have a job connector immediately creates one. This connector does not store IDs of reporting jobs. - If the reporting job was created by the user separately, this connector just uses that job. This connector does not remove reporting jobs it can only create them. - - After reporting job is created, the first data can be available only after up to 48 hours. - """ - - name = None - primary_key = None - http_method = None - raise_on_http_errors = True - url_base = "https://youtubereporting.googleapis.com/v1/" - JOB_NAME = "Airbyte reporting job" - - def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: - return None - - def should_retry(self, response: requests.Response) -> bool: - # if the connected Google account is not bounded with target Youtube account, - # we receive `401: UNAUTHENTICATED` - if response.status_code == 401: - setattr(self, "raise_on_http_errors", False) - return False - else: - return super().should_retry(response) - - def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: - return [response.json()] - - def path(self, **kwargs) -> str: - return "jobs" - - def request_body_json(self, **kwargs) -> Optional[Mapping]: - if self.name: - return {"name": self.JOB_NAME, "reportTypeId": self.name} - - def list(self): - "https://developers.google.com/youtube/reporting/v1/reference/rest/v1/jobs/list" - self.name = None - self.http_method = "GET" - results = list(self.read_records(sync_mode=None)) - result = results[0] - return result.get("jobs", {}) - - def create(self, name): - "https://developers.google.com/youtube/reporting/v1/reference/rest/v1/jobs/create" - self.name = name - self.http_method = "POST" - results = list(self.read_records(sync_mode=None)) - result = results[0] - return result["id"] - - -class ReportResources(CustomBackoffMixin, HttpStream): - "https://developers.google.com/youtube/reporting/v1/reference/rest/v1/jobs.reports/list" - - name = None - primary_key = "id" - url_base = "https://youtubereporting.googleapis.com/v1/" - - def __init__(self, name: str, jobs_resource: JobsResource, job_id: str, start_time: str = None, **kwargs): - self.name = name - self.jobs_resource = jobs_resource - self.job_id = job_id - self.start_time = start_time - super().__init__(**kwargs) - - def path( - self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None - ) -> str: - if not self.job_id: - self.job_id = self.jobs_resource.create(self.name) - self.logger.info(f"YouTube reporting job is created: '{self.job_id}'") - return "jobs/{}/reports".format(self.job_id) - - def request_params( - self, - stream_state: Mapping[str, Any], - stream_slice: Mapping[str, Any] = None, - next_page_token: Mapping[str, Any] = None, - ) -> MutableMapping[str, Any]: - return {"startTimeAtOrAfter": self.start_time} if self.start_time else {} - - def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: - return None - - def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: - response_json = response.json() - reports = [] - for report in response_json.get("reports", []): - report = {**report} - report["startTime"] = datetime.datetime.strptime(report["startTime"], "%Y-%m-%dT%H:%M:%S%z") - reports.append(report) - reports.sort(key=lambda x: x["startTime"]) - date = kwargs["stream_state"].get("date") - if date: - reports = [r for r in reports if int(r["startTime"].date().strftime("%Y%m%d")) > date] - if not reports: - reports.append(None) - return reports - - -class ChannelReports(CustomBackoffMixin, HttpSubStream): - "https://developers.google.com/youtube/reporting/v1/reports/channel_reports" - - name = None - primary_key = None - cursor_field = "date" - url_base = "" - transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) - - def __init__(self, name: str, dimensions: List[str], **kwargs): - self.name = name - self.primary_key = dimensions - super().__init__(**kwargs) - - def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: - return None - - def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: - fp = io.StringIO(response.text) - reader = csv.DictReader(fp) - for record in reader: - yield record - - def get_updated_state(self, current_stream_state: MutableMapping[str, Any], latest_record: Mapping[str, Any]) -> Mapping[str, Any]: - if not current_stream_state: - return {self.cursor_field: latest_record[self.cursor_field]} - return {self.cursor_field: max(current_stream_state[self.cursor_field], latest_record[self.cursor_field])} - - def path( - self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None - ) -> str: - return stream_slice["parent"]["downloadUrl"] - - def read_records(self, *, stream_slice: Mapping[str, Any] = None, **kwargs) -> Iterable[Mapping[str, Any]]: - parent = stream_slice.get("parent") - if parent: - yield from super().read_records(stream_slice=stream_slice, **kwargs) - else: - self.logger.info("no data from parent stream") - yield from [] - - -class SourceYoutubeAnalytics(AbstractSource): - @staticmethod - def get_authenticator(config): - credentials = config["credentials"] - client_id = credentials["client_id"] - client_secret = credentials["client_secret"] - refresh_token = credentials["refresh_token"] - - return Oauth2Authenticator( - token_refresh_endpoint="https://oauth2.googleapis.com/token", - client_id=client_id, - client_secret=client_secret, - refresh_token=refresh_token, - ) - - def check_connection(self, logger, config) -> Tuple[bool, any]: - authenticator = self.get_authenticator(config) - jobs_resource = JobsResource(authenticator=authenticator) - result = jobs_resource.list() - if result: - return True, None - else: - return ( - False, - "The Youtube account is not valid. Please make sure you're trying to use the active Youtube Account connected to your Google Account.", - ) - - def streams(self, config: Mapping[str, Any]) -> List[Stream]: - authenticator = self.get_authenticator(config) - jobs_resource = JobsResource(authenticator=authenticator) - jobs = jobs_resource.list() - report_to_job_id = {j["reportTypeId"]: j["id"] for j in jobs} - - # By default, API returns reports for last 60 days. Report for each day requires a separate request. - # Full scan of all 18 streams requires ~ 1100 requests (18+18*60), so we can hit 'default' API quota limits: - # - 60 reqs per minute - # - 20000 reqs per day - # For SAT: scan only last N days ('testing_period' option) in order to decrease a number of requests and avoid API limits - start_time = None - testing_period = config.get("testing_period") - if testing_period: - start_time = pendulum.today().add(days=-int(testing_period)).to_rfc3339_string() - - channel_reports = json.loads(pkgutil.get_data("source_youtube_analytics", "defaults/channel_reports.json")) - - streams = [] - for channel_report in channel_reports: - stream_name = channel_report["id"] - dimensions = channel_report["dimensions"] - job_id = report_to_job_id.get(stream_name) - parent = ReportResources( - name=stream_name, jobs_resource=jobs_resource, job_id=job_id, start_time=start_time, authenticator=authenticator - ) - streams.append(ChannelReports(name=stream_name, dimensions=dimensions, parent=parent, authenticator=authenticator)) - return streams diff --git a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/spec.json b/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/spec.json deleted file mode 100644 index 9be6b96fba84f..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/source_youtube_analytics/spec.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "documentationUrl": "https://docs.airbyte.com/integrations/sources/youtube-analytics", - "connectionSpecification": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "YouTube Analytics Spec", - "type": "object", - "required": ["credentials"], - "additionalProperties": true, - "properties": { - "credentials": { - "title": "Authenticate via OAuth 2.0", - "type": "object", - "required": ["client_id", "client_secret", "refresh_token"], - "additionalProperties": true, - "properties": { - "client_id": { - "title": "Client ID", - "type": "string", - "description": "The Client ID of your developer application", - "airbyte_secret": true - }, - "client_secret": { - "title": "Client Secret", - "type": "string", - "description": "The client secret of your developer application", - "airbyte_secret": true - }, - "refresh_token": { - "title": "Refresh Token", - "type": "string", - "description": "A refresh token generated using the above client ID and secret", - "airbyte_secret": true - } - } - } - } - }, - "advanced_auth": { - "auth_flow_type": "oauth2.0", - "oauth_config_specification": { - "complete_oauth_output_specification": { - "type": "object", - "additionalProperties": true, - "properties": { - "refresh_token": { - "type": "string", - "path_in_connector_config": ["credentials", "refresh_token"] - } - } - }, - "complete_oauth_server_input_specification": { - "type": "object", - "additionalProperties": true, - "properties": { - "client_id": { - "type": "string" - }, - "client_secret": { - "type": "string" - } - } - }, - "complete_oauth_server_output_specification": { - "type": "object", - "additionalProperties": true, - "properties": { - "client_id": { - "type": "string", - "path_in_connector_config": ["credentials", "client_id"] - }, - "client_secret": { - "type": "string", - "path_in_connector_config": ["credentials", "client_secret"] - } - } - } - } - } -} diff --git a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py b/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py deleted file mode 100644 index 9744592d3ba5e..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_source.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -import json -import os -from unittest.mock import MagicMock - -from source_youtube_analytics.source import SourceYoutubeAnalytics - -from airbyte_cdk.sources.streams.http.auth.core import NoAuth - - -def test_check_connection(requests_mock): - access_token = "token" - mock_oauth_call = requests_mock.post("https://oauth2.googleapis.com/token", json={"access_token": access_token, "expires_in": 0}) - - mock_jobs_call = requests_mock.get("https://youtubereporting.googleapis.com/v1/jobs", json={"jobs": [1, 2, 3]}) - - source = SourceYoutubeAnalytics() - logger_mock, config_mock = MagicMock(), MagicMock() - assert source.check_connection(logger_mock, config_mock) == (True, None) - assert mock_oauth_call.called_once - assert mock_jobs_call.called_once - assert mock_jobs_call.last_request.headers["Authorization"] == "Bearer " + access_token - - -def test_streams(requests_mock): - requests_mock.get("https://youtubereporting.googleapis.com/v1/jobs", json={}) - - with open(os.path.join(os.path.dirname(__file__), "../source_youtube_analytics/defaults/channel_reports.json")) as fp: - channel_reports = json.load(fp) - - source = SourceYoutubeAnalytics() - source.get_authenticator = MagicMock(return_value=NoAuth()) - config_mock = MagicMock() - streams = source.streams(config_mock) - assert len(streams) == len(channel_reports) diff --git a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_streams.py deleted file mode 100644 index 0726b5da5ca8a..0000000000000 --- a/airbyte-integrations/connectors/source-youtube-analytics/unit_tests/test_streams.py +++ /dev/null @@ -1,229 +0,0 @@ -# -# Copyright (c) 2023 Airbyte, Inc., all rights reserved. -# - -import datetime -from collections import OrderedDict -from unittest.mock import MagicMock - -from source_youtube_analytics.source import ChannelReports, CustomBackoffMixin, JobsResource, ReportResources - - -def test_jobs_resource_list(requests_mock): - json_result = { - "jobs": [ - { - "id": "038777e7-dc6e-43c8-b86f-ed954c7acd95", - "name": "Airbyte reporting job", - "reportTypeId": "channel_playback_location_a2", - "createTime": "2021-10-30T20:32:58Z", - }, - { - "id": "1c20da45-0604-4d60-85db-925989df1db6", - "name": "Airbyte reporting job", - "reportTypeId": "channel_basic_a2", - "createTime": "2021-10-25T19:48:36Z", - }, - ] - } - - mock_jobs_call = requests_mock.get("https://youtubereporting.googleapis.com/v1/jobs", json=json_result) - jobs_resource = JobsResource() - jobs = jobs_resource.list() - assert jobs == json_result["jobs"] - assert mock_jobs_call.called_once - - -def test_jobs_resource_create(requests_mock): - name = "channel_basic_a2" - json_result = { - "createTime": "2021-10-30T20:32:58Z", - "id": "038777e7-dc6e-43c8-b86f-ed954c7acd95", - "name": "Airbyte reporting job", - "reportTypeId": name, - } - - mock_jobs_call = requests_mock.post("https://youtubereporting.googleapis.com/v1/jobs", json=json_result) - jobs_resource = JobsResource() - result = jobs_resource.create(name) - assert result == json_result["id"] - assert mock_jobs_call.called_once - - -def test_report_resources_path(requests_mock): - mock_jobs_call = requests_mock.post("https://youtubereporting.googleapis.com/v1/jobs", json={"id": "job1"}) - - jobs_resource = JobsResource() - stream = ReportResources("stream_name", jobs_resource, "job1") - assert stream.path() == "jobs/job1/reports" - assert not mock_jobs_call.called_once - - stream = ReportResources("stream_name", jobs_resource, job_id=None) - assert not mock_jobs_call.called_once - assert stream.path() == "jobs/job1/reports" - assert mock_jobs_call.called_once - assert stream.path() == "jobs/job1/reports" - assert mock_jobs_call.called_once - assert mock_jobs_call.last_request.json() == {"name": "Airbyte reporting job", "reportTypeId": "stream_name"} - - -def test_report_resources_parse_response(): - jobs_resource = JobsResource() - stream = ReportResources("stream_name", jobs_resource, "job1") - - response = MagicMock() - response.json = MagicMock(return_value={}) - assert stream.parse_response(response, stream_state={}) == [None] - response.json = MagicMock(return_value={"reports": []}) - assert stream.parse_response(response, stream_state={}) == [None] - - reports = [ - { - "id": "4317112913", - "jobId": "1c20da45-0604-4d60-85db-925989df1db6", - "startTime": "2021-10-25T07:00:00Z", - "endTime": "2021-10-26T07:00:00Z", - "createTime": "2021-10-27T04:59:46.114806Z", - "downloadUrl": "https://youtubereporting.googleapis.com/v1/media/CHANNEL/ybpwL6sPt6SSzazIV400WQ/jobs/1c20da45-0604-4d60-85db-925989df1db6/reports/4317112913?alt=media", - }, - { - "id": "4315953856", - "jobId": "1c20da45-0604-4d60-85db-925989df1db6", - "startTime": "2021-10-18T07:00:00Z", - "endTime": "2021-10-19T07:00:00Z", - "createTime": "2021-10-26T07:43:27.680074Z", - "downloadUrl": "https://youtubereporting.googleapis.com/v1/media/CHANNEL/ybpwL6sPt6SSzazIV400WQ/jobs/1c20da45-0604-4d60-85db-925989df1db6/reports/4315953856?alt=media", - }, - ] - - response.json = MagicMock(return_value={"reports": reports}) - result = stream.parse_response(response, stream_state={}) - - assert result == [ - { - "id": "4315953856", - "jobId": "1c20da45-0604-4d60-85db-925989df1db6", - "startTime": datetime.datetime(2021, 10, 18, 7, 0, tzinfo=datetime.timezone.utc), - "endTime": "2021-10-19T07:00:00Z", - "createTime": "2021-10-26T07:43:27.680074Z", - "downloadUrl": "https://youtubereporting.googleapis.com/v1/media/CHANNEL/ybpwL6sPt6SSzazIV400WQ/jobs/1c20da45-0604-4d60-85db-925989df1db6/reports/4315953856?alt=media", - }, - { - "id": "4317112913", - "jobId": "1c20da45-0604-4d60-85db-925989df1db6", - "startTime": datetime.datetime(2021, 10, 25, 7, 0, tzinfo=datetime.timezone.utc), - "endTime": "2021-10-26T07:00:00Z", - "createTime": "2021-10-27T04:59:46.114806Z", - "downloadUrl": "https://youtubereporting.googleapis.com/v1/media/CHANNEL/ybpwL6sPt6SSzazIV400WQ/jobs/1c20da45-0604-4d60-85db-925989df1db6/reports/4317112913?alt=media", - }, - ] - - -def test_report_resources_next_page_token(): - jobs_resource = JobsResource() - stream = ReportResources("stream_name", jobs_resource, "job1") - assert stream.next_page_token({}) is None - - -def test_channel_reports_path(): - jobs_resource = JobsResource() - parent = ReportResources("stream_name", jobs_resource, "job1") - stream = ChannelReports("stream_name", [], parent=parent) - - downloadUrl = "https://youtubereporting.googleapis.com/v1/media/CHANNEL/ybpwL6sPt6SSzazIV400WQ/jobs/1c20da45-0604-4d60-85db-925989df1db6/reports/4317112913?alt=media" - stream_slice = { - "parent": { - "id": "4317112913", - "jobId": "1c20da45-0604-4d60-85db-925989df1db6", - "startTime": datetime.datetime(2021, 10, 25, 7, 0, tzinfo=datetime.timezone.utc), - "endTime": datetime.datetime(2021, 10, 26, 7, 0, tzinfo=datetime.timezone.utc), - "createTime": datetime.datetime(2021, 10, 27, 4, 59, 46, 114806, tzinfo=datetime.timezone.utc), - "downloadUrl": downloadUrl, - } - } - - path = stream.path(stream_state={}, stream_slice=stream_slice, next_page_token=None) - assert path == downloadUrl - - -def test_channel_reports_parse_response(): - jobs_resource = JobsResource() - parent = ReportResources("stream_name", jobs_resource, "job1") - stream = ChannelReports("stream_name", ["date", "channel_id"], parent=parent) - - response = MagicMock() - response.text = "date,channel_id,likes,dislikes\n20211026,UCybpwL6sPt6SSzazIV400WQ,210,21\n20211026,UCybpwL6sPt6SSzazIV400WQ,150,18\n" - - result = stream.parse_response(response, stream_state={}) - assert list(result) == [ - OrderedDict([("date", "20211026"), ("channel_id", "UCybpwL6sPt6SSzazIV400WQ"), ("likes", "210"), ("dislikes", "21")]), - OrderedDict([("date", "20211026"), ("channel_id", "UCybpwL6sPt6SSzazIV400WQ"), ("likes", "150"), ("dislikes", "18")]), - ] - - -def test_backoff_505(): - response = MagicMock() - response.status_code = 505 - assert CustomBackoffMixin().should_retry(response) is True - - -def test_backoff_429(): - response = MagicMock() - response.status_code = 429 - assert CustomBackoffMixin().should_retry(response) is True - - -def test_backoff_429_per_minute_limit(): - response = MagicMock() - response.status_code = 429 - response.json = MagicMock( - return_value={ - "error": { - "code": 429, - "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per minute' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127'.", - "status": "RESOURCE_EXHAUSTED", - "details": [ - { - "reason": "RATE_LIMIT_EXCEEDED", - "metadata": { - "consumer": "projects/863188056127", - "quota_limit": "FreeQuotaRequestsPerMinutePerProject", - "quota_limit_value": "60", - "quota_metric": "youtubereporting.googleapis.com/free_quota_requests", - "service": "youtubereporting.googleapis.com", - }, - } - ], - } - } - ) - assert CustomBackoffMixin().should_retry(response) is True - - -def test_backoff_429_per_day_limit(): - response = MagicMock() - response.status_code = 429 - response.json = MagicMock( - return_value={ - "error": { - "code": 429, - "message": "Quota exceeded for quota metric 'Free requests' and limit 'Free requests per day' of service 'youtubereporting.googleapis.com' for consumer 'project_number:863188056127", - "status": "RESOURCE_EXHAUSTED", - "details": [ - { - "reason": "RATE_LIMIT_EXCEEDED", - "metadata": { - "consumer": "projects/863188056127", - "quota_limit": "FreeQuotaRequestsPerDayPerProject", - "quota_limit_value": "20000", - "quota_metric": "youtubereporting.googleapis.com/free_quota_requests", - "service": "youtubereporting.googleapis.com", - }, - } - ], - } - } - ) - custom_mixin = CustomBackoffMixin() - custom_mixin.logger = MagicMock() - assert custom_mixin.should_retry(response) is False diff --git a/docs/integrations/sources/youtube-analytics.md b/docs/integrations/sources/youtube-analytics.md index d1593ab233c39..5fd0eff36508b 100644 --- a/docs/integrations/sources/youtube-analytics.md +++ b/docs/integrations/sources/youtube-analytics.md @@ -86,8 +86,9 @@ Quota usage is not an issue because data is retrieved once and then filtered, so | Version | Date | Pull Request | Subject | | :------ | :--------- | :------------------------------------------------------- | :--------------------------------------------- | -| 0.1.6 | 2024-06-17 | [39529](https://github.com/airbytehq/airbyte/pull/39529) | Pin CDK version to 0.38.0 | -| 0.1.5 | 2024-05-21 | [38546](https://github.com/airbytehq/airbyte/pull/38546) | [autopull] base image + poetry + up_to_date | +| 0.2.0 | 2024-07-27 | [42838](https://github.com/airbytehq/airbyte/pull/42838) | Migrate to LowCode | +| 0.1.6 | 2024-06-17 | [39529](https://github.com/airbytehq/airbyte/pull/39529) | Pin CDK version to 0.38.0 | +| 0.1.5 | 2024-05-21 | [38546](https://github.com/airbytehq/airbyte/pull/38546) | [autopull] base image + poetry + up_to_date | | 0.1.4 | 2023-05-22 | [26420](https://github.com/airbytehq/airbyte/pull/26420) | Migrate to advancedAuth | | 0.1.3 | 2022-09-30 | [17454](https://github.com/airbytehq/airbyte/pull/17454) | Added custom backoff logic | | 0.1.2 | 2022-09-29 | [17399](https://github.com/airbytehq/airbyte/pull/17399) | Fixed `403` error while `check connection` |