From 0fe455a1e724d1db2e7ea8d99b8e03cf51db4be4 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Wed, 26 Oct 2022 21:47:44 +0530 Subject: [PATCH 1/6] New source: Google webfonts --- .../source-google-webfonts/.dockerignore | 6 + .../source-google-webfonts/Dockerfile | 38 ++++++ .../source-google-webfonts/README.md | 103 ++++++++++++++++ .../source-google-webfonts/__init__.py | 3 + .../acceptance-test-config.yml | 20 ++++ .../acceptance-test-docker.sh | 16 +++ .../source-google-webfonts/bootstrap.md | 38 ++++++ .../source-google-webfonts/build.gradle | 9 ++ .../integration_tests/__init__.py | 3 + .../integration_tests/abnormal_state.json | 5 + .../integration_tests/acceptance.py | 16 +++ .../integration_tests/catalog.json | 39 ++++++ .../integration_tests/configured_catalog.json | 13 ++ .../integration_tests/invalid_config.json | 3 + .../integration_tests/sample_config.json | 3 + .../integration_tests/sample_state.json | 5 + .../connectors/source-google-webfonts/main.py | 13 ++ .../source-google-webfonts/requirements.txt | 2 + .../source-google-webfonts/setup.py | 29 +++++ .../source_google_webfonts/__init__.py | 8 ++ .../google_webfonts.yaml | 38 ++++++ .../source_google_webfonts/schemas/TODO.md | 16 +++ .../source_google_webfonts/schemas/fonts.json | 113 ++++++++++++++++++ .../source_google_webfonts/source.py | 18 +++ .../source_google_webfonts/spec.yaml | 22 ++++ 25 files changed, 579 insertions(+) create mode 100644 airbyte-integrations/connectors/source-google-webfonts/.dockerignore create mode 100644 airbyte-integrations/connectors/source-google-webfonts/Dockerfile create mode 100644 airbyte-integrations/connectors/source-google-webfonts/README.md create mode 100644 airbyte-integrations/connectors/source-google-webfonts/__init__.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/acceptance-test-config.yml create mode 100644 airbyte-integrations/connectors/source-google-webfonts/acceptance-test-docker.sh create mode 100644 airbyte-integrations/connectors/source-google-webfonts/bootstrap.md create mode 100644 airbyte-integrations/connectors/source-google-webfonts/build.gradle create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/__init__.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/acceptance.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/catalog.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/configured_catalog.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/main.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/requirements.txt create mode 100644 airbyte-integrations/connectors/source-google-webfonts/setup.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/__init__.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py create mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/spec.yaml diff --git a/airbyte-integrations/connectors/source-google-webfonts/.dockerignore b/airbyte-integrations/connectors/source-google-webfonts/.dockerignore new file mode 100644 index 0000000000000..b7c1ebe6c666a --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/.dockerignore @@ -0,0 +1,6 @@ +* +!Dockerfile +!main.py +!source_google_webfonts +!setup.py +!secrets diff --git a/airbyte-integrations/connectors/source-google-webfonts/Dockerfile b/airbyte-integrations/connectors/source-google-webfonts/Dockerfile new file mode 100644 index 0000000000000..56b13b3f8de27 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/Dockerfile @@ -0,0 +1,38 @@ +FROM python:3.9.11-alpine3.15 as base + +# build and load all requirements +FROM base as builder +WORKDIR /airbyte/integration_code + +# upgrade pip to the latest version +RUN apk --no-cache upgrade \ + && pip install --upgrade pip \ + && apk --no-cache add tzdata build-base + + +COPY setup.py ./ +# install necessary packages to a temporary folder +RUN pip install --prefix=/install . + +# build a clean environment +FROM base +WORKDIR /airbyte/integration_code + +# copy all loaded and built libraries to a pure basic image +COPY --from=builder /install /usr/local +# add default timezone settings +COPY --from=builder /usr/share/zoneinfo/Etc/UTC /etc/localtime +RUN echo "Etc/UTC" > /etc/timezone + +# bash is installed for more convenient debugging. +RUN apk --no-cache add bash + +# copy payload code only +COPY main.py ./ +COPY source_google_webfonts ./source_google_webfonts + +ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" +ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] + +LABEL io.airbyte.version=0.1.0 +LABEL io.airbyte.name=airbyte/source-google-webfonts diff --git a/airbyte-integrations/connectors/source-google-webfonts/README.md b/airbyte-integrations/connectors/source-google-webfonts/README.md new file mode 100644 index 0000000000000..f0e9d4f2ba724 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/README.md @@ -0,0 +1,103 @@ +# Google Webfonts Source + +This is the repository for the Google Webfonts configuration based source connector. +For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.io/integrations/sources/google-webfonts). + +## Local development + +### Prerequisites +**To iterate on this connector, make sure to complete this prerequisites section.** + +#### Minimum Python version required `= 3.9.0` + +#### Build & Activate Virtual Environment and install dependencies +From this connector directory, create a virtual environment: +``` +python -m venv .venv +``` + +This will generate a virtualenv for this module in `.venv/`. Make sure this venv is active in your +development environment of choice. To activate it from the terminal, run: +``` +source .venv/bin/activate +pip install -r requirements.txt +``` +If you are in an IDE, follow your IDE's instructions to activate the virtualenv. + +Note that while we are installing dependencies from `requirements.txt`, you should only edit `setup.py` for your dependencies. `requirements.txt` is +used for editable installs (`pip install -e`) to pull in Python dependencies from the monorepo and will call `setup.py`. +If this is mumbo jumbo to you, don't worry about it, just put your deps in `setup.py` but install using `pip install -r requirements.txt` and everything +should work as you expect. + +#### Building via Gradle +You can also build the connector in Gradle. This is typically used in CI and not needed for your development workflow. + +To build using Gradle, from the Airbyte repository root, run: +``` +./gradlew :airbyte-integrations:connectors:source-google-webfonts:build +``` + +#### Create credentials +**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.io/integrations/sources/google-webfonts) +to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_google_webfonts/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 `integration_tests/sample_config.json` for a sample config file. + +**If you are an Airbyte core member**, copy the credentials in Lastpass under the secret name `source google-webfonts test creds` +and place them into `secrets/config.json`. + +### Locally running the connector docker image + +#### Build +First, make sure you build the latest Docker image: +``` +docker build . -t airbyte/source-google-webfonts:dev +``` + +You can also build the connector image via Gradle: +``` +./gradlew :airbyte-integrations:connectors:source-google-webfonts:airbyteDocker +``` +When building via Gradle, the docker image name and tag, respectively, are the values of the `io.airbyte.name` and `io.airbyte.version` `LABEL`s in +the Dockerfile. + +#### Run +Then run any of the connector commands as follows: +``` +docker run --rm airbyte/source-google-webfonts:dev spec +docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-google-webfonts:dev check --config /secrets/config.json +docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-google-webfonts:dev discover --config /secrets/config.json +docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-google-webfonts:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json +``` +## Testing + +#### Acceptance Tests +Customize `acceptance-test-config.yml` file to configure tests. See [Source Acceptance Tests](https://docs.airbyte.io/connector-development/testing-connectors/source-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. + +To run your integration tests with docker + +### Using gradle to run tests +All commands should be run from airbyte project root. +To run unit tests: +``` +./gradlew :airbyte-integrations:connectors:source-google-webfonts:unitTest +``` +To run acceptance and custom integration tests: +``` +./gradlew :airbyte-integrations:connectors:source-google-webfonts:integrationTest +``` + +## Dependency Management +All of your dependencies should go in `setup.py`, NOT `requirements.txt`. The requirements file is only used to connect internal Airbyte dependencies in the monorepo for local development. +We split dependencies between two groups, dependencies that are: +* required for your connector to work need to go to `MAIN_REQUIREMENTS` list. +* required for the testing need to go to `TEST_REQUIREMENTS` list + +### 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 unit and integration tests. +1. Bump the connector version in `Dockerfile` -- just increment the value of the `LABEL io.airbyte.version` appropriately (we use [SemVer](https://semver.org/)). +1. Create a Pull Request. +1. Pat yourself on the back for being an awesome contributor. +1. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master. diff --git a/airbyte-integrations/connectors/source-google-webfonts/__init__.py b/airbyte-integrations/connectors/source-google-webfonts/__init__.py new file mode 100644 index 0000000000000..1100c1c58cf51 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-config.yml new file mode 100644 index 0000000000000..7e69e954eac45 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-config.yml @@ -0,0 +1,20 @@ +# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) +# for more information about how to configure these tests +connector_image: airbyte/source-google-webfonts:dev +tests: + spec: + - spec_path: "source_google_webfonts/spec.yaml" + connection: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" + discovery: + - config_path: "secrets/config.json" + basic_read: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + empty_streams: [] + full_refresh: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-docker.sh b/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-docker.sh new file mode 100644 index 0000000000000..c51577d10690c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/acceptance-test-docker.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +# Build latest connector image +docker build . -t $(cat acceptance-test-config.yml | grep "connector_image" | head -n 1 | cut -d: -f2-) + +# Pull latest acctest image +docker pull airbyte/source-acceptance-test:latest + +# Run +docker run --rm -it \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /tmp:/tmp \ + -v $(pwd):/test_input \ + airbyte/source-acceptance-test \ + --acceptance-test-config /test_input + diff --git a/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md b/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md new file mode 100644 index 0000000000000..e149c5f872f52 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md @@ -0,0 +1,38 @@ +# Google-webfonts + +The connector uses the v1 API documented here: https://developers.google.com/fonts/docs/developer_api . It is +straightforward HTTP REST API with API authentication. + +## Dummy API key + +Api key is mandate for this connector to work, It could be generated by a gmail account for free at https://console.cloud.google.com/apis/dashboard. +Just pass the generated API key and optional parameters for establishing the connection. Example:123 + +## Implementation details + +## Setup guide + +### Step 1: Set up Google-webfonts connection + +- Generate an API key (Example: 12345) +- Params (If specific info is needed) +- Available params + - sort: SORT_UNDEFINED, ALPHA, DATE, STYLE, TRENDING, POPULARITY + - alt: json, media or proto + - prettyPrint: boolean + +## Step 2: Generate schema for the endpoint + +### Custom schema is generated and tested with different IDs + +## Step 3: Spec, Secrets, and connector yaml files are configured with reference to the Airbyte documentation. + +## In a nutshell: + +1. Navigate to the Airbyte Open Source dashboard. +2. Set the name for your source. +3. Enter your `api_key`. +5. Enter your config params if needed. (Optional) +6. Click **Set up source**. + + * We use only GET methods, towards the webfonts endpoints which is straightforward \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-webfonts/build.gradle b/airbyte-integrations/connectors/source-google-webfonts/build.gradle new file mode 100644 index 0000000000000..8bf7fd7487291 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'airbyte-python' + id 'airbyte-docker' + id 'airbyte-source-acceptance-test' +} + +airbytePython { + moduleDirectory 'source_google_webfonts' +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/__init__.py b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/__init__.py new file mode 100644 index 0000000000000..1100c1c58cf51 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json new file mode 100644 index 0000000000000..52b0f2c2118f4 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json @@ -0,0 +1,5 @@ +{ + "todo-stream-name": { + "todo-field-name": "todo-abnormal-value" + } +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/acceptance.py b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/acceptance.py new file mode 100644 index 0000000000000..1302b2f57e10e --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/acceptance.py @@ -0,0 +1,16 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +import pytest + +pytest_plugins = ("source_acceptance_test.plugin",) + + +@pytest.fixture(scope="session", autouse=True) +def connector_setup(): + """This fixture is a placeholder for external resources that acceptance test might require.""" + # TODO: setup test dependencies if needed. otherwise remove the TODO comments + yield + # TODO: clean up test dependencies diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/catalog.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/catalog.json new file mode 100644 index 0000000000000..6799946a68514 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/catalog.json @@ -0,0 +1,39 @@ +{ + "streams": [ + { + "name": "TODO fix this file", + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": "column1", + "json_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "column1": { + "type": "string" + }, + "column2": { + "type": "number" + } + } + } + }, + { + "name": "table1", + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": false, + "json_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "column1": { + "type": "string" + }, + "column2": { + "type": "number" + } + } + } + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/configured_catalog.json new file mode 100644 index 0000000000000..2875f86374215 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/configured_catalog.json @@ -0,0 +1,13 @@ +{ + "streams": [ + { + "stream": { + "name": "fonts", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json new file mode 100644 index 0000000000000..f3732995784f2 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json @@ -0,0 +1,3 @@ +{ + "todo-wrong-field": "this should be an incomplete config file, used in standard tests" +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json new file mode 100644 index 0000000000000..ecc4913b84c74 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json @@ -0,0 +1,3 @@ +{ + "fix-me": "TODO" +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json new file mode 100644 index 0000000000000..3587e579822d0 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json @@ -0,0 +1,5 @@ +{ + "todo-stream-name": { + "todo-field-name": "value" + } +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/main.py b/airbyte-integrations/connectors/source-google-webfonts/main.py new file mode 100644 index 0000000000000..065faa3891bf1 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/main.py @@ -0,0 +1,13 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +import sys + +from airbyte_cdk.entrypoint import launch +from source_google_webfonts import SourceGoogleWebfonts + +if __name__ == "__main__": + source = SourceGoogleWebfonts() + launch(source, sys.argv[1:]) diff --git a/airbyte-integrations/connectors/source-google-webfonts/requirements.txt b/airbyte-integrations/connectors/source-google-webfonts/requirements.txt new file mode 100644 index 0000000000000..0411042aa0911 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/requirements.txt @@ -0,0 +1,2 @@ +-e ../../bases/source-acceptance-test +-e . diff --git a/airbyte-integrations/connectors/source-google-webfonts/setup.py b/airbyte-integrations/connectors/source-google-webfonts/setup.py new file mode 100644 index 0000000000000..f290fc2148d46 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/setup.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from setuptools import find_packages, setup + +MAIN_REQUIREMENTS = [ + "airbyte-cdk~=0.1", +] + +TEST_REQUIREMENTS = [ + "pytest~=6.1", + "pytest-mock~=3.6.1", + "source-acceptance-test", +] + +setup( + name="source_google_webfonts", + description="Source implementation for Google Webfonts.", + author="Airbyte", + author_email="contact@airbyte.io", + packages=find_packages(), + install_requires=MAIN_REQUIREMENTS, + package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]}, + extras_require={ + "tests": TEST_REQUIREMENTS, + }, +) diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/__init__.py b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/__init__.py new file mode 100644 index 0000000000000..4045cfdf0228b --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/__init__.py @@ -0,0 +1,8 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + + +from .source import SourceGoogleWebfonts + +__all__ = ["SourceGoogleWebfonts"] diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml new file mode 100644 index 0000000000000..61310dc2ac11f --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml @@ -0,0 +1,38 @@ +version: "0.1.0" + +definitions: + selector: + extractor: + field_pointer: ["items"] + requester: + url_base: "https://webfonts.googleapis.com/v1" + http_method: "GET" + authenticator: + type: ApiKeyAuthenticator + header: "apikey" + api_token: "{{ config['api_key'] }}" + + retriever: + record_selector: + $ref: "*ref(definitions.selector)" + paginator: + type: NoPagination + requester: + $ref: "*ref(definitions.requester)" + + base_stream: + retriever: + $ref: "*ref(definitions.retriever)" + + fonts_stream: + $ref: "*ref(definitions.base_stream)" + $options: + name: "fonts" + path: "/webfonts?key={{ config['api_key'] }}&sort={{ config['sort'] or 'SORT_UNDEFINED'}}&prettyPrint={{ config['prettyPrint'] or 'true'}}&alt={{ config['alt'] or 'json'}}" + +streams: + - "*ref(definitions.fonts_stream)" + +check: + stream_names: + - "fonts" diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md new file mode 100644 index 0000000000000..ab073b0d10830 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md @@ -0,0 +1,16 @@ +# TODO: Define your stream schemas +Your connector must describe the schema of each stream it can output using [JSONSchema](https://json-schema.org). + +You can describe the schema of your streams using one `.json` file per stream. + +## Static schemas +From the `google_webfonts.yaml` configuration file, you read the `.json` files in the `schemas/` directory. You can refer to a schema in your configuration file using the `schema_loader` component's `file_path` field. For example: +``` +schema_loader: + type: JsonSchema + file_path: "./source_google_webfonts/schemas/customers.json" +``` +Every stream specified in the configuration file should have a corresponding `.json` schema file. + +Delete this file once you're done. Or don't. Up to you :) + diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json new file mode 100644 index 0000000000000..23b12211cf5d5 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json @@ -0,0 +1,113 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1666796406.json", + "title": "Root", + "type": "object", + "properties": { + "kind": { + "$id": "#root/kind", + "title": "Kind", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "items": { + "$id": "#root/items", + "title": "Items", + "type": "array", + "default": [], + "items":{ + "$id": "#root/items/items", + "title": "Items", + "type": "object", + "properties": { + "family": { + "$id": "#root/items/items/family", + "title": "Family", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "variants": { + "$id": "#root/items/items/variants", + "title": "Variants", + "type": "array", + "default": [], + "items":{ + "$id": "#root/items/items/variants/items", + "title": "Items", + "type": "string", + "default": "", + "pattern": "^.*$" + } + }, + "subsets": { + "$id": "#root/items/items/subsets", + "title": "Subsets", + "type": "array", + "default": [], + "items":{ + "$id": "#root/items/items/subsets/items", + "title": "Items", + "type": "string", + "default": "", + "pattern": "^.*$" + } + }, + "version": { + "$id": "#root/items/items/version", + "title": "Version", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "lastModified": { + "$id": "#root/items/items/lastModified", + "title": "Lastmodified", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "files": { + "$id": "#root/items/items/files", + "title": "Files", + "type": "object", + "properties": { + "regular": { + "$id": "#root/items/items/files/regular", + "title": "Regular", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "italic": { + "$id": "#root/items/items/files/italic", + "title": "Italic", + "type": "string", + "default": "", + "pattern": "^.*$" + } + } + } +, + "category": { + "$id": "#root/items/items/category", + "title": "Category", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "kind": { + "$id": "#root/items/items/kind", + "title": "Kind", + "type": "string", + "default": "", + "pattern": "^.*$" + } + } + } + + } + } +} diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py new file mode 100644 index 0000000000000..353c6e585164a --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py @@ -0,0 +1,18 @@ +# +# Copyright (c) 2022 Airbyte, Inc., all rights reserved. +# + +from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource + +""" +This file provides the necessary constructs to interpret a provided declarative YAML configuration file into +source connector. + +WARNING: Do not modify this file. +""" + + +# Declarative Source +class SourceGoogleWebfonts(YamlDeclarativeSource): + def __init__(self): + super().__init__(**{"path_to_yaml": "google_webfonts.yaml"}) diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/spec.yaml b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/spec.yaml new file mode 100644 index 0000000000000..ebc80b05ad5a8 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/spec.yaml @@ -0,0 +1,22 @@ +documentationUrl: https://docs.airbyte.com/integrations/sources/google-webfonts +connectionSpecification: + $schema: http://json-schema.org/draft-07/schema# + title: Google Webfonts Spec + type: object + required: + - api_key + additionalProperties: true + properties: + api_key: + type: string + description: API key is required to access google apis, For getting your's goto google console and generate api key for Webfonts + airbyte_secret: true + sort: + type: string + description: Optional, to find how to sort + prettyPrint: + type: string + description: Optional, boolean type + alt: + type: string + description: Optional, Available params- json, media, proto From 02692cd92615215d909dd3ba4b6019fc0897f622 Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Wed, 26 Oct 2022 21:48:24 +0530 Subject: [PATCH 2/6] chore: Add Docs --- docs/integrations/README.md | 1 + docs/integrations/sources/google-webfonts.md | 68 ++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 docs/integrations/sources/google-webfonts.md diff --git a/docs/integrations/README.md b/docs/integrations/README.md index aca4349b68c55..6ad1c7c1e4cd6 100644 --- a/docs/integrations/README.md +++ b/docs/integrations/README.md @@ -74,6 +74,7 @@ For more information about the grading system, see [Product Release Stages](http | [Google Directory](sources/google-directory.md) | Alpha | Yes | | [Google Search Console](sources/google-search-console.md) | Generally Available | Yes | | [Google Sheets](sources/google-sheets.md) | Generally Available | Yes | +| [Google Webfonts](sources/google-webfonts.md) | Alpha | Yes | | [Google Workspace Admin Reports](sources/google-workspace-admin-reports.md) | Alpha | Yes | | [Greenhouse](sources/greenhouse.md) | Beta | Yes | | [Gutendex](sources/gutendex.md) | Alpha | No | diff --git a/docs/integrations/sources/google-webfonts.md b/docs/integrations/sources/google-webfonts.md new file mode 100644 index 0000000000000..af5df9899f044 --- /dev/null +++ b/docs/integrations/sources/google-webfonts.md @@ -0,0 +1,68 @@ +# Google-webfonts + +This page contains the setup guide and reference information for the [Google-webfonts](https://developers.google.com/fonts/docs/developer_api) source connector. + +## Prerequisites + +Api key is mandate for this connector to work, It could be generated by a gmail account for free at https://console.cloud.google.com/apis/dashboard. +Just pass the generated API key and optional parameters for establishing the connection. Example:123 + +## Setup guide + +### Step 1: Set up Google-webfonts connection + +- Generate an API key (Example: 12345) +- Params (If specific info is needed) +- Available params + - sort: SORT_UNDEFINED, ALPHA, DATE, STYLE, TRENDING, POPULARITY + - alt: json, media or proto + - prettyPrint: boolean + +## Step 2: Set up the Google-webfonts connector in Airbyte + +### For Airbyte Cloud: + +1. [Log into your Airbyte Cloud](https://cloud.airbyte.io/workspaces) account. +2. In the left navigation bar, click **Sources**. In the top-right corner, click **+new source**. +3. On the Set up the source page, enter the name for the Google-webfonts connector and select **Google-webfonts** from the Source type dropdown. +4. Enter your `api_key`. +5. Enter the params configuration if needed. (Optional) +6. Click **Set up source**. + +### For Airbyte OSS: + +1. Navigate to the Airbyte Open Source dashboard. +2. Set the name for your source. +3. Enter your `api_key`. +5. Enter the params configuration if needed. (Optional) +6. Click **Set up source**. + +## Supported sync modes + +The Google-webfonts source connector supports the following [sync modes](https://docs.airbyte.com/cloud/core-concepts#connection-sync-modes): + +| Feature | Supported? | +| :---------------------------- | :--------- | +| Full Refresh Sync | Yes | +| Incremental Sync | No | +| Replicate Incremental Deletes | No | +| SSL connection | Yes | +| Namespaces | No | + +## Supported Streams + +- Webfonts (Single stream API) + +## API method example + +GET https://webfonts.googleapis.com/v1/webfonts?key=<1234567>&sort=SORT_UNDEFINED&prettyPrint=true&alt=json + +## Performance considerations + +Google Webfont's [API reference](https://developers.google.com/fonts/docs/developer_api) has v1 at present and v2 is at development. The connector as default uses v1. + +## Changelog + +| Version | Date | Pull Request | Subject | +| :------ | :--------- | :----------------------------------------------------- | :------------- | +| 0.1.0 | 2022-10-26 | [Init](https://github.com/airbytehq/airbyte/pull/) | Initial commit | \ No newline at end of file From 35f57a7b1fb03df9513e4402b6f478ae7646537e Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Wed, 26 Oct 2022 22:02:39 +0530 Subject: [PATCH 3/6] chore: update changelog --- docs/integrations/sources/google-webfonts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/sources/google-webfonts.md b/docs/integrations/sources/google-webfonts.md index af5df9899f044..0ab7b2723da07 100644 --- a/docs/integrations/sources/google-webfonts.md +++ b/docs/integrations/sources/google-webfonts.md @@ -65,4 +65,4 @@ Google Webfont's [API reference](https://developers.google.com/fonts/docs/develo | Version | Date | Pull Request | Subject | | :------ | :--------- | :----------------------------------------------------- | :------------- | -| 0.1.0 | 2022-10-26 | [Init](https://github.com/airbytehq/airbyte/pull/) | Initial commit | \ No newline at end of file +| 0.1.0 | 2022-10-26 | [Init](https://github.com/airbytehq/airbyte/pull/18496)| Initial commit | \ No newline at end of file From aa97c2a28e53e0a96d8f5bedd6a95385ce4a396a Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Thu, 27 Oct 2022 19:24:07 +0530 Subject: [PATCH 4/6] chore: resolved given comments for PR --- .../integration_tests/invalid_config.json | 5 +- .../integration_tests/sample_config.json | 5 +- .../integration_tests/sample_state.json | 5 - .../source_google_webfonts/schemas/TODO.md | 16 -- .../source_google_webfonts/schemas/fonts.json | 220 +++++++++--------- docs/integrations/sources/google-webfonts.md | 4 +- 6 files changed, 119 insertions(+), 136 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json delete mode 100644 airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json index f3732995784f2..316264c50d74a 100644 --- a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/invalid_config.json @@ -1,3 +1,6 @@ { - "todo-wrong-field": "this should be an incomplete config file, used in standard tests" + "api_key": "", + "sort": "", + "prettyPrint": "", + "alt": "" } diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json index ecc4913b84c74..93b02698274d2 100644 --- a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json +++ b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_config.json @@ -1,3 +1,6 @@ { - "fix-me": "TODO" + "api_key": "", + "sort": "SORT_UNDEFINED", + "prettyPrint": "true", + "alt": "json" } diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json deleted file mode 100644 index 3587e579822d0..0000000000000 --- a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/sample_state.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "todo-stream-name": { - "todo-field-name": "value" - } -} diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md deleted file mode 100644 index ab073b0d10830..0000000000000 --- a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/TODO.md +++ /dev/null @@ -1,16 +0,0 @@ -# TODO: Define your stream schemas -Your connector must describe the schema of each stream it can output using [JSONSchema](https://json-schema.org). - -You can describe the schema of your streams using one `.json` file per stream. - -## Static schemas -From the `google_webfonts.yaml` configuration file, you read the `.json` files in the `schemas/` directory. You can refer to a schema in your configuration file using the `schema_loader` component's `file_path` field. For example: -``` -schema_loader: - type: JsonSchema - file_path: "./source_google_webfonts/schemas/customers.json" -``` -Every stream specified in the configuration file should have a corresponding `.json` schema file. - -Delete this file once you're done. Or don't. Up to you :) - diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json index 23b12211cf5d5..9c62b02dc3291 100644 --- a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/schemas/fonts.json @@ -1,113 +1,111 @@ { - "definitions": {}, - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://example.com/object1666796406.json", - "title": "Root", - "type": "object", - "properties": { - "kind": { - "$id": "#root/kind", - "title": "Kind", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "items": { - "$id": "#root/items", - "title": "Items", - "type": "array", - "default": [], - "items":{ - "$id": "#root/items/items", - "title": "Items", - "type": "object", - "properties": { - "family": { - "$id": "#root/items/items/family", - "title": "Family", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "variants": { - "$id": "#root/items/items/variants", - "title": "Variants", - "type": "array", - "default": [], - "items":{ - "$id": "#root/items/items/variants/items", - "title": "Items", - "type": "string", - "default": "", - "pattern": "^.*$" - } - }, - "subsets": { - "$id": "#root/items/items/subsets", - "title": "Subsets", - "type": "array", - "default": [], - "items":{ - "$id": "#root/items/items/subsets/items", - "title": "Items", - "type": "string", - "default": "", - "pattern": "^.*$" - } - }, - "version": { - "$id": "#root/items/items/version", - "title": "Version", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "lastModified": { - "$id": "#root/items/items/lastModified", - "title": "Lastmodified", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "files": { - "$id": "#root/items/items/files", - "title": "Files", - "type": "object", - "properties": { - "regular": { - "$id": "#root/items/items/files/regular", - "title": "Regular", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "italic": { - "$id": "#root/items/items/files/italic", - "title": "Italic", - "type": "string", - "default": "", - "pattern": "^.*$" - } - } - } -, - "category": { - "$id": "#root/items/items/category", - "title": "Category", - "type": "string", - "default": "", - "pattern": "^.*$" - }, - "kind": { - "$id": "#root/items/items/kind", - "title": "Kind", - "type": "string", - "default": "", - "pattern": "^.*$" - } - } - } - - } - } + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1666796406.json", + "title": "Root", + "type": "object", + "properties": { + "kind": { + "$id": "#root/kind", + "title": "Kind", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "items": { + "$id": "#root/items", + "title": "Items", + "type": "array", + "default": [], + "items": { + "$id": "#root/items/items", + "title": "Items", + "type": "object", + "properties": { + "family": { + "$id": "#root/items/items/family", + "title": "Family", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "variants": { + "$id": "#root/items/items/variants", + "title": "Variants", + "type": "array", + "default": [], + "items": { + "$id": "#root/items/items/variants/items", + "title": "Items", + "type": "string", + "default": "", + "pattern": "^.*$" + } + }, + "subsets": { + "$id": "#root/items/items/subsets", + "title": "Subsets", + "type": "array", + "default": [], + "items": { + "$id": "#root/items/items/subsets/items", + "title": "Items", + "type": "string", + "default": "", + "pattern": "^.*$" + } + }, + "version": { + "$id": "#root/items/items/version", + "title": "Version", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "lastModified": { + "$id": "#root/items/items/lastModified", + "title": "Lastmodified", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "files": { + "$id": "#root/items/items/files", + "title": "Files", + "type": "object", + "properties": { + "regular": { + "$id": "#root/items/items/files/regular", + "title": "Regular", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "italic": { + "$id": "#root/items/items/files/italic", + "title": "Italic", + "type": "string", + "default": "", + "pattern": "^.*$" + } + } + }, + "category": { + "$id": "#root/items/items/category", + "title": "Category", + "type": "string", + "default": "", + "pattern": "^.*$" + }, + "kind": { + "$id": "#root/items/items/kind", + "title": "Kind", + "type": "string", + "default": "", + "pattern": "^.*$" + } + } + } + } + } } diff --git a/docs/integrations/sources/google-webfonts.md b/docs/integrations/sources/google-webfonts.md index 0ab7b2723da07..b3a5e69ab01e6 100644 --- a/docs/integrations/sources/google-webfonts.md +++ b/docs/integrations/sources/google-webfonts.md @@ -26,7 +26,7 @@ Just pass the generated API key and optional parameters for establishing the con 2. In the left navigation bar, click **Sources**. In the top-right corner, click **+new source**. 3. On the Set up the source page, enter the name for the Google-webfonts connector and select **Google-webfonts** from the Source type dropdown. 4. Enter your `api_key`. -5. Enter the params configuration if needed. (Optional) +5. Enter the params configuration if needed. Supported params are: sort, alt, prettyPrint (Optional) 6. Click **Set up source**. ### For Airbyte OSS: @@ -34,7 +34,7 @@ Just pass the generated API key and optional parameters for establishing the con 1. Navigate to the Airbyte Open Source dashboard. 2. Set the name for your source. 3. Enter your `api_key`. -5. Enter the params configuration if needed. (Optional) +5. Enter the params configuration if needed. Supported params are: sort, alt, prettyPrint (Optional) 6. Click **Set up source**. ## Supported sync modes From 8f9133a66228d5e186b1eadd3a4de8f9f443ec6f Mon Sep 17 00:00:00 2001 From: btkcodedev Date: Thu, 27 Oct 2022 19:31:41 +0530 Subject: [PATCH 5/6] chore: unwanted files removed --- .../connectors/source-google-webfonts/bootstrap.md | 2 +- .../integration_tests/abnormal_state.json | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json diff --git a/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md b/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md index e149c5f872f52..10cfa3b880b54 100644 --- a/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md +++ b/airbyte-integrations/connectors/source-google-webfonts/bootstrap.md @@ -3,7 +3,7 @@ The connector uses the v1 API documented here: https://developers.google.com/fonts/docs/developer_api . It is straightforward HTTP REST API with API authentication. -## Dummy API key +## API key Api key is mandate for this connector to work, It could be generated by a gmail account for free at https://console.cloud.google.com/apis/dashboard. Just pass the generated API key and optional parameters for establishing the connection. Example:123 diff --git a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json deleted file mode 100644 index 52b0f2c2118f4..0000000000000 --- a/airbyte-integrations/connectors/source-google-webfonts/integration_tests/abnormal_state.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "todo-stream-name": { - "todo-field-name": "todo-abnormal-value" - } -} From e2540bdc733904cc30f8b48c7cc096092d840b12 Mon Sep 17 00:00:00 2001 From: sajarin Date: Thu, 27 Oct 2022 14:13:18 -0400 Subject: [PATCH 6/6] fix: generate and add source definitions --- .../resources/seed/source_definitions.yaml | 8 ++++++ .../src/main/resources/seed/source_specs.yaml | 28 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 09455c302eae8..c7e7920df1513 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -452,6 +452,14 @@ icon: google-sheets.svg sourceType: file releaseStage: generally_available +- name: Google Webfonts + sourceDefinitionId: a68fbcde-b465-4ab3-b2a6-b0590a875835 + dockerRepository: airbyte/source-google-webfonts + dockerImageTag: 0.1.0 + documentationUrl: https://docs.airbyte.com/integrations/sources/google-webfonts + icon: googleworkpace.svg + sourceType: api + releaseStage: alpha - name: Google Workspace Admin Reports sourceDefinitionId: ed9dfefa-1bbc-419d-8c5e-4d78f0ef6734 dockerRepository: airbyte/source-google-workspace-admin-reports diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 771eb62db0bef..3ff62f7a45abd 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -4631,6 +4631,34 @@ - - "client_secret" oauthFlowOutputParameters: - - "refresh_token" +- dockerImage: "airbyte/source-google-webfonts:0.1.0" + spec: + documentationUrl: "https://docs.airbyte.com/integrations/sources/google-webfonts" + connectionSpecification: + $schema: "http://json-schema.org/draft-07/schema#" + title: "Google Webfonts Spec" + type: "object" + required: + - "api_key" + additionalProperties: true + properties: + api_key: + type: "string" + description: "API key is required to access google apis, For getting your's\ + \ goto google console and generate api key for Webfonts" + airbyte_secret: true + sort: + type: "string" + description: "Optional, to find how to sort" + prettyPrint: + type: "string" + description: "Optional, boolean type" + alt: + type: "string" + description: "Optional, Available params- json, media, proto" + supportsNormalization: false + supportsDBT: false + supported_destination_sync_modes: [] - dockerImage: "airbyte/source-google-workspace-admin-reports:0.1.8" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/google-workspace-admin-reports"