airbyte-ci: add format commands (#31831)
Co-authored-by: Ben Church <ben@airbyte.io> Co-authored-by: bnchrch <bnchrch@users.noreply.github.com> Co-authored-by: alafanechere <augustin.lafanechere@gmail.com> Co-authored-by: Augustin <augustin@airbyte.io> Co-authored-by: Marius Posta <marius@airbyte.io> Co-authored-by: alafanechere <alafanechere@users.noreply.github.com>
This commit is contained in:
62
.github/workflows/format.yml
vendored
62
.github/workflows/format.yml
vendored
@@ -1,7 +1,9 @@
|
||||
name: Format Code (Python + Java)
|
||||
name: Check for formatting errors
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
# Cancel any previous runs on the same branch if they are still in progress
|
||||
cancel-in-progress: true
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
@@ -10,8 +12,8 @@ on:
|
||||
- master
|
||||
pull_request:
|
||||
jobs:
|
||||
format-and-commit:
|
||||
runs-on: ubuntu-latest
|
||||
format-fix:
|
||||
runs-on: "conn-prod-xlarge-runner"
|
||||
name: "Apply All Formatting Rules"
|
||||
timeout-minutes: 40
|
||||
steps:
|
||||
@@ -20,16 +22,16 @@ jobs:
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
# Important that this is set so that CI checks are triggered again
|
||||
# Without this we would be be forever waiting on required checks to pass
|
||||
# Without this we would be forever waiting on required checks to pass
|
||||
token: ${{ secrets.GH_PAT_APPROVINGTON_OCTAVIA }}
|
||||
|
||||
# IMPORTANT! This is nessesary to make sure that a status is reported on the PR
|
||||
# even if the workflow is skipped. If we used github actions filters, the workflow
|
||||
# IMPORTANT! This is necessary to make sure that a status is reported on the PR
|
||||
# even if the workflow is skipped. If we used GitHub Actions filters, the workflow
|
||||
# would not be reported as skipped, but instead would be forever pending.
|
||||
#
|
||||
# I KNOW THIS SOUNDS CRAZY, BUT IT IS TRUE.
|
||||
#
|
||||
# Also it gets worse
|
||||
# Also, it gets worse
|
||||
#
|
||||
# IMPORTANT! DO NOT CHANGE THE QUOTES AROUND THE GLOBS. THEY ARE REQUIRED.
|
||||
# MAKE SURE TO TEST ANY SYNTAX CHANGES BEFORE MERGING.
|
||||
@@ -42,43 +44,23 @@ jobs:
|
||||
- '**/*'
|
||||
- '!**/*.md'
|
||||
|
||||
- uses: actions/setup-java@v3
|
||||
- name: Run airbyte-ci format fix
|
||||
uses: ./.github/actions/run-dagger-pipeline
|
||||
with:
|
||||
distribution: "zulu"
|
||||
java-version: "17"
|
||||
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
|
||||
- name: Set up CI Gradle Properties
|
||||
run: |
|
||||
mkdir -p ~/.gradle/
|
||||
cat > ~/.gradle/gradle.properties <<EOF
|
||||
org.gradle.jvmargs=-Xmx8g -Xss4m \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
|
||||
org.gradle.workers.max=8
|
||||
org.gradle.vfs.watch=false
|
||||
EOF
|
||||
|
||||
- name: Format
|
||||
if: steps.changes.outputs.format_any_changed == 'true'
|
||||
uses: Wandalen/wretry.action@v1.0.42
|
||||
with:
|
||||
command: ./gradlew format --scan --info --stacktrace
|
||||
attempt_limit: 3
|
||||
attempt_delay: 5000 # in ms
|
||||
context: "pull_request"
|
||||
docker_hub_password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
docker_hub_username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
gcs_credentials: ${{ secrets.METADATA_SERVICE_PROD_GCS_CREDENTIALS }}
|
||||
sentry_dsn: ${{ secrets.SENTRY_AIRBYTE_CI_DSN }}
|
||||
github_token: ${{ secrets.GH_PAT_MAINTENANCE_OCTAVIA }}
|
||||
subcommand: "format fix all"
|
||||
|
||||
# This is helpful in the case that we change a previously committed generated file to be ignored by git.
|
||||
- name: Remove any files that have been gitignored
|
||||
run: git ls-files -i -c --exclude-from=.gitignore | xargs -r git rm --cached
|
||||
|
||||
- name: Commit Formatting Changes (PR)
|
||||
uses: stefanzweifel/git-auto-commit-action@v4
|
||||
uses: stefanzweifel/git-auto-commit-action@v5
|
||||
# do not commit if master branch
|
||||
if: github.ref != 'refs/heads/master'
|
||||
with:
|
||||
@@ -86,15 +68,11 @@ jobs:
|
||||
commit_user_name: Octavia Squidington III
|
||||
commit_user_email: octavia-squidington-iii@users.noreply.github.com
|
||||
|
||||
- name: "Fail on Formatting Changes (Master)"
|
||||
if: github.ref == 'refs/heads/master'
|
||||
run: git --no-pager diff && test -z "$(git --no-pager diff)"
|
||||
|
||||
notify-failure-slack-channel:
|
||||
name: "Notify Slack Channel on Build Failures"
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- format-and-commit
|
||||
- format-fix
|
||||
if: ${{ failure() && github.ref == 'refs/heads/master' }}
|
||||
steps:
|
||||
- name: Checkout Airbyte
|
||||
|
||||
3
.github/workflows/gradle.yml
vendored
3
.github/workflows/gradle.yml
vendored
@@ -103,8 +103,7 @@ jobs:
|
||||
with:
|
||||
read-only: ${{ github.ref != 'refs/heads/master' }}
|
||||
# TODO: be able to remove the skipSlowTests property
|
||||
# TODO: remove the format task ASAP
|
||||
arguments: --scan --no-daemon --no-watch-fs format check -DskipSlowTests=true
|
||||
arguments: --scan --no-daemon --no-watch-fs check -DskipSlowTests=true
|
||||
|
||||
# In case of self-hosted EC2 errors, remove this block.
|
||||
stop-check-runner:
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import time
|
||||
from typing import Any, Optional
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from typing import Union
|
||||
|
||||
import dpath.util
|
||||
|
||||
@@ -100,6 +100,9 @@ At this point you can run `airbyte-ci` commands.
|
||||
- [`connectors bump_version` command](#connectors-bump_version)
|
||||
- [`connectors upgrade_base_image` command](#connectors-upgrade_base_image)
|
||||
- [`connectors migrate_to_base_image` command](#connectors-migrate_to_base_image)
|
||||
- [`format` command subgroup](#format-subgroup)
|
||||
* [`format check` command](#format-check-command)
|
||||
* [`format fix` command](#format-fix-command)
|
||||
- [`metadata` command subgroup](#metadata-command-subgroup)
|
||||
- [`metadata validate` command](#metadata-validate-command)
|
||||
* [Example](#example)
|
||||
@@ -205,7 +208,6 @@ flowchart TD
|
||||
entrypoint[[For each selected connector]]
|
||||
subgraph static ["Static code analysis"]
|
||||
qa[Run QA checks]
|
||||
fmt[Run code format checks]
|
||||
sem["Check version follows semantic versionning"]
|
||||
incr["Check version is incremented"]
|
||||
metadata_validation["Run metadata validation on metadata.yaml"]
|
||||
@@ -369,6 +371,29 @@ Migrate source-openweather to use the base image: `airbyte-ci connectors --name=
|
||||
| --------------------- | ----------------------------------------------------------- |
|
||||
| `PULL_REQUEST_NUMBER` | The GitHub pull request number, used in the changelog entry |
|
||||
|
||||
### <a id="format-subgroup"></a>`format` command subgroup
|
||||
|
||||
Available commands:
|
||||
* `airbyte-ci format check all`
|
||||
* `airbyte-ci format fix all`
|
||||
|
||||
### Examples
|
||||
- Check for formatting errors in the repository: `airbyte-ci format check all`
|
||||
- Fix formatting for only python files: `airbyte-ci format fix python`
|
||||
|
||||
### <a id="format-check-command"></a>`format check all` command
|
||||
|
||||
This command runs formatting checks, but does not format the code in place. It will exit 1 as soon as a failure is encountered. To fix errors, use `airbyte-ci format fix all`.
|
||||
|
||||
Running `airbyte-ci format check` will run checks on all different types of code. Run `airbyte-ci format check --help` for subcommands to check formatting for only certain types of files.
|
||||
|
||||
### <a id="format-fix-command"></a>`format fix all` command
|
||||
|
||||
This command runs formatting checks and reformats any code that would be reformatted, so it's recommended to stage changes you might have before running this command.
|
||||
|
||||
Running `airbyte-ci format fix all` will format all of the different types of code. Run `airbyte-ci format fix --help` for subcommands to format only certain types of files.
|
||||
|
||||
|
||||
### <a id="metadata-validate-command-subgroup"></a>`metadata` command subgroup
|
||||
|
||||
Available commands:
|
||||
@@ -408,7 +433,8 @@ This command runs the Python tests for a airbyte-ci poetry package.
|
||||
## Changelog
|
||||
| Version | PR | Description |
|
||||
| ------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
||||
| 2.5.9 | [#32427](https://github.com/airbytehq/airbyte/pull/32427) | Re-enable caching for source-postgres |
|
||||
| 2.6.0 | [#31831](https://github.com/airbytehq/airbyte/pull/31831) | Add `airbyte-ci format` commands, remove connector-specific formatting check |
|
||||
| 2.5.9 | [#32427](https://github.com/airbytehq/airbyte/pull/32427) | Re-enable caching for source-postgres |
|
||||
| 2.5.8 | [#32402](https://github.com/airbytehq/airbyte/pull/32402) | Set Dagger Cloud token for airbyters only |
|
||||
| 2.5.7 | [#31628](https://github.com/airbytehq/airbyte/pull/31628) | Add ClickPipelineContext class |
|
||||
| 2.5.6 | [#32139](https://github.com/airbytehq/airbyte/pull/32139) | Test coverage report on Python connector UnitTest. |
|
||||
|
||||
@@ -145,7 +145,7 @@ def should_use_remote_secrets(use_remote_secrets: Optional[bool]) -> bool:
|
||||
lazy_subcommands={
|
||||
"build": "pipelines.airbyte_ci.connectors.build_image.commands.build",
|
||||
"test": "pipelines.airbyte_ci.connectors.test.commands.test",
|
||||
"list": "pipelines.airbyte_ci.connectors.list.commands.list",
|
||||
"list": "pipelines.airbyte_ci.connectors.list.commands.list_connectors",
|
||||
"publish": "pipelines.airbyte_ci.connectors.publish.commands.publish",
|
||||
"bump_version": "pipelines.airbyte_ci.connectors.bump_version.commands.bump_version",
|
||||
"migrate_to_base_image": "pipelines.airbyte_ci.connectors.migrate_to_base_image.commands.migrate_to_base_image",
|
||||
|
||||
@@ -9,9 +9,9 @@ from rich.table import Table
|
||||
from rich.text import Text
|
||||
|
||||
|
||||
@click.command(cls=DaggerPipelineCommand, help="List all selected connectors.")
|
||||
@click.command(cls=DaggerPipelineCommand, help="List all selected connectors.", name="list")
|
||||
@click.pass_context
|
||||
async def list(
|
||||
async def list_connectors(
|
||||
ctx: click.Context,
|
||||
):
|
||||
selected_connectors = sorted(ctx.obj["selected_connectors_with_modified_files"], key=lambda x: x.technical_name)
|
||||
|
||||
@@ -21,12 +21,7 @@ LANGUAGE_MAPPING = {
|
||||
ConnectorLanguage.PYTHON: python_connectors.run_all_tests,
|
||||
ConnectorLanguage.LOW_CODE: python_connectors.run_all_tests,
|
||||
ConnectorLanguage.JAVA: java_connectors.run_all_tests,
|
||||
},
|
||||
"run_code_format_checks": {
|
||||
ConnectorLanguage.PYTHON: python_connectors.run_code_format_checks,
|
||||
ConnectorLanguage.LOW_CODE: python_connectors.run_code_format_checks,
|
||||
# ConnectorLanguage.JAVA: java_connectors.run_code_format_checks
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,22 +60,6 @@ async def run_qa_checks(context: ConnectorContext) -> List[StepResult]:
|
||||
return [await QaChecks(context).run()]
|
||||
|
||||
|
||||
async def run_code_format_checks(context: ConnectorContext) -> List[StepResult]:
|
||||
"""Run the code format checks according to the connector language.
|
||||
|
||||
Args:
|
||||
context (ConnectorContext): The current connector context.
|
||||
|
||||
Returns:
|
||||
List[StepResult]: The results of the code format checks steps.
|
||||
"""
|
||||
if _run_code_format_checks := LANGUAGE_MAPPING["run_code_format_checks"].get(context.connector.language):
|
||||
return await _run_code_format_checks(context)
|
||||
else:
|
||||
context.logger.warning(f"No code format checks defined for connector language {context.connector.language}!")
|
||||
return []
|
||||
|
||||
|
||||
async def run_all_tests(context: ConnectorContext) -> List[StepResult]:
|
||||
"""Run all the tests steps according to the connector language.
|
||||
|
||||
@@ -111,10 +90,7 @@ async def run_connector_test_pipeline(context: ConnectorContext, semaphore: anyi
|
||||
async with semaphore:
|
||||
async with context:
|
||||
async with asyncer.create_task_group() as task_group:
|
||||
tasks = [
|
||||
task_group.soonify(run_all_tests)(context),
|
||||
task_group.soonify(run_code_format_checks)(context),
|
||||
]
|
||||
tasks = [task_group.soonify(run_all_tests)(context)]
|
||||
if not context.code_tests_only:
|
||||
tasks += [
|
||||
task_group.soonify(run_metadata_validation)(context),
|
||||
|
||||
@@ -14,47 +14,11 @@ from dagger import Container, File
|
||||
from pipelines.airbyte_ci.connectors.build_image.steps.python_connectors import BuildConnectorImages
|
||||
from pipelines.airbyte_ci.connectors.context import ConnectorContext
|
||||
from pipelines.airbyte_ci.connectors.test.steps.common import AcceptanceTests, CheckBaseImageIsUsed
|
||||
from pipelines.consts import LOCAL_BUILD_PLATFORM, PYPROJECT_TOML_FILE_PATH
|
||||
from pipelines.consts import LOCAL_BUILD_PLATFORM
|
||||
from pipelines.dagger.actions import secrets
|
||||
from pipelines.models.steps import Step, StepResult, StepStatus
|
||||
|
||||
|
||||
class CodeFormatChecks(Step):
|
||||
"""A step to run the code format checks on a Python connector using Black, Isort and Flake."""
|
||||
|
||||
title = "Code format checks"
|
||||
|
||||
RUN_BLACK_CMD = ["python", "-m", "black", f"--config=/{PYPROJECT_TOML_FILE_PATH}", "--check", "."]
|
||||
RUN_ISORT_CMD = ["python", "-m", "isort", f"--settings-file=/{PYPROJECT_TOML_FILE_PATH}", "--check-only", "--diff", "."]
|
||||
RUN_FLAKE_CMD = ["python", "-m", "pflake8", f"--config=/{PYPROJECT_TOML_FILE_PATH}", "."]
|
||||
|
||||
async def _run(self) -> StepResult:
|
||||
"""Run a code format check on the container source code.
|
||||
|
||||
We call black, isort and flake commands:
|
||||
- Black formats the code: fails if the code is not formatted.
|
||||
- Isort checks the import orders: fails if the import are not properly ordered.
|
||||
- Flake enforces style-guides: fails if the style-guide is not followed.
|
||||
|
||||
Args:
|
||||
context (ConnectorContext): The current test context, providing a connector object, a dagger client and a repository directory.
|
||||
step (Step): The step in which the code format checks are run. Defaults to Step.CODE_FORMAT_CHECKS
|
||||
Returns:
|
||||
StepResult: Failure or success of the code format checks with stdout and stderr.
|
||||
"""
|
||||
connector_under_test = pipelines.dagger.actions.python.common.with_python_connector_source(self.context)
|
||||
|
||||
formatter = (
|
||||
connector_under_test.with_exec(["echo", "Running black"])
|
||||
.with_exec(self.RUN_BLACK_CMD)
|
||||
.with_exec(["echo", "Running Isort"])
|
||||
.with_exec(self.RUN_ISORT_CMD)
|
||||
.with_exec(["echo", "Running Flake"])
|
||||
.with_exec(self.RUN_FLAKE_CMD)
|
||||
)
|
||||
return await self.get_step_result(formatter)
|
||||
|
||||
|
||||
class PytestStep(Step, ABC):
|
||||
"""An abstract class to run pytest tests and evaluate success or failure according to pytest logs."""
|
||||
|
||||
@@ -261,15 +225,3 @@ async def run_all_tests(context: ConnectorContext) -> List[StepResult]:
|
||||
]
|
||||
|
||||
return step_results + [task.value for task in tasks]
|
||||
|
||||
|
||||
async def run_code_format_checks(context: ConnectorContext) -> List[StepResult]:
|
||||
"""Run the code format check steps for Python connectors.
|
||||
|
||||
Args:
|
||||
context (ConnectorContext): The current connector context.
|
||||
|
||||
Returns:
|
||||
List[StepResult]: Results of the code format checks.
|
||||
"""
|
||||
return [await CodeFormatChecks(context).run()]
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from typing import List
|
||||
|
||||
import dagger
|
||||
from pipelines.helpers.utils import sh_dash_c
|
||||
|
||||
|
||||
def run_check(
|
||||
container: dagger.Container,
|
||||
check_commands: List[str],
|
||||
) -> dagger.Container:
|
||||
"""Checks whether the repository is formatted correctly.
|
||||
Args:
|
||||
container: (dagger.Container): The container to run the formatting check in
|
||||
check_commands (List[str]): The list of commands to run to check the formatting
|
||||
"""
|
||||
return container.with_exec(sh_dash_c(check_commands), skip_entrypoint=True)
|
||||
|
||||
|
||||
async def run_format(
|
||||
container: dagger.Container,
|
||||
format_commands: List[str],
|
||||
) -> dagger.Container:
|
||||
"""Formats the repository.
|
||||
Args:
|
||||
container: (dagger.Container): The container to run the formatter in
|
||||
format_commands (List[str]): The list of commands to run to format the repository
|
||||
"""
|
||||
format_container = container.with_exec(sh_dash_c(format_commands), skip_entrypoint=True)
|
||||
return await format_container.directory("/src").export(".")
|
||||
|
||||
|
||||
def mount_repo_for_formatting(
|
||||
dagger_client: dagger.Client,
|
||||
container: dagger.Container,
|
||||
include: List[str],
|
||||
) -> dagger.Container:
|
||||
"""Mounts the relevant parts of the repository: the code to format and the formatting config
|
||||
Args:
|
||||
container: (dagger.Container): The container to mount the repository in
|
||||
include (List[str]): The list of files to include in the container
|
||||
"""
|
||||
container = container.with_mounted_directory(
|
||||
"/src",
|
||||
dagger_client.host().directory(
|
||||
".",
|
||||
include=include,
|
||||
),
|
||||
).with_workdir("/src")
|
||||
|
||||
return container
|
||||
@@ -0,0 +1,105 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
import asyncclick as click
|
||||
import dagger
|
||||
from pipelines.airbyte_ci.format.actions import run_check
|
||||
from pipelines.airbyte_ci.format.containers import (
|
||||
format_java_container,
|
||||
format_js_container,
|
||||
format_license_container,
|
||||
format_python_container,
|
||||
)
|
||||
from pipelines.cli.dagger_pipeline_command import DaggerPipelineCommand
|
||||
from pipelines.helpers.cli import LogOptions, get_all_sibling_commands, invoke_commands_concurrently, log_command_results
|
||||
from pipelines.models.contexts.click_pipeline_context import ClickPipelineContext, pass_pipeline_context
|
||||
from pipelines.models.steps import CommandResult, StepStatus
|
||||
|
||||
|
||||
# HELPERS
|
||||
async def get_check_command_result(click_command: click.Command, checks_commands, container) -> CommandResult:
|
||||
try:
|
||||
stdout = await run_check(container, checks_commands).stdout()
|
||||
return CommandResult(click_command, status=StepStatus.SUCCESS, stdout=stdout)
|
||||
except dagger.ExecError as e:
|
||||
return CommandResult(click_command, status=StepStatus.FAILURE, stderr=e.stderr, stdout=e.stdout, exc_info=e)
|
||||
|
||||
|
||||
@click.group(
|
||||
help="Run code format checks and fail if any checks fail.",
|
||||
chain=True,
|
||||
)
|
||||
async def check():
|
||||
pass
|
||||
|
||||
|
||||
@check.command(name="all")
|
||||
@click.option("--list-errors", is_flag=True, default=False, help="Show detailed error messages for failed checks.")
|
||||
@click.pass_context
|
||||
async def all_checks(ctx: click.Context, list_errors: bool):
|
||||
"""
|
||||
Run all format checks and fail if any checks fail.
|
||||
"""
|
||||
all_commands = get_all_sibling_commands(ctx)
|
||||
|
||||
command_results = await invoke_commands_concurrently(ctx, all_commands)
|
||||
failure = any([r.status is StepStatus.FAILURE for r in command_results])
|
||||
parent_command = ctx.parent.command
|
||||
logger = logging.getLogger(parent_command.name)
|
||||
log_options = LogOptions(
|
||||
list_errors=list_errors,
|
||||
help_message="Run `airbyte-ci format check all --list-errors` to see detailed error messages for failed checks. Run `airbyte-ci format fix all` for a best effort fix.",
|
||||
)
|
||||
log_command_results(ctx, command_results, logger, log_options)
|
||||
if failure:
|
||||
raise click.Abort()
|
||||
|
||||
|
||||
@check.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
async def python(pipeline_context: ClickPipelineContext) -> CommandResult:
|
||||
"""Format python code via black and isort."""
|
||||
|
||||
dagger_client = await pipeline_context.get_dagger_client(pipeline_name="Check python formatting")
|
||||
container = format_python_container(dagger_client)
|
||||
check_commands = [
|
||||
"poetry install --no-root",
|
||||
"poetry run isort --settings-file pyproject.toml --check-only .",
|
||||
"poetry run black --config pyproject.toml --check .",
|
||||
]
|
||||
return await get_check_command_result(check.commands["python"], check_commands, container)
|
||||
|
||||
|
||||
@check.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
async def java(pipeline_context: ClickPipelineContext) -> CommandResult:
|
||||
"""Format java, groovy, and sql code via spotless."""
|
||||
dagger_client = await pipeline_context.get_dagger_client(pipeline_name="Check java formatting")
|
||||
container = format_java_container(dagger_client)
|
||||
check_commands = ["./gradlew spotlessCheck --scan"]
|
||||
return await get_check_command_result(check.commands["java"], check_commands, container)
|
||||
|
||||
|
||||
@check.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
async def js(pipeline_context: ClickPipelineContext):
|
||||
"""Format yaml and json code via prettier."""
|
||||
dagger_client = await pipeline_context.get_dagger_client(pipeline_name="Check js formatting")
|
||||
container = format_js_container(dagger_client)
|
||||
check_commands = ["prettier --check ."]
|
||||
return await get_check_command_result(check.commands["js"], check_commands, container)
|
||||
|
||||
|
||||
@check.command("license")
|
||||
@pass_pipeline_context
|
||||
async def license_check(pipeline_context: ClickPipelineContext):
|
||||
"""Add license to python and java code via addlicense."""
|
||||
license_file = "LICENSE_SHORT"
|
||||
dagger_client = await pipeline_context.get_dagger_client(pipeline_name="Check license header")
|
||||
container = format_license_container(dagger_client, license_file)
|
||||
check_commands = [f"addlicense -c 'Airbyte, Inc.' -l apache -v -f {license_file} --check ."]
|
||||
return await get_check_command_result(check.commands["license"], check_commands, container)
|
||||
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
"""
|
||||
Module exposing the format command.
|
||||
"""
|
||||
|
||||
import asyncclick as click
|
||||
from pipelines.cli.click_decorators import click_ignore_unused_kwargs, click_merge_args_into_context_obj
|
||||
from pipelines.cli.lazy_group import LazyGroup
|
||||
from pipelines.models.contexts.click_pipeline_context import ClickPipelineContext, pass_pipeline_context
|
||||
|
||||
|
||||
@click.group(
|
||||
cls=LazyGroup,
|
||||
name="format",
|
||||
help="Commands related to formatting.",
|
||||
lazy_subcommands={
|
||||
"check": "pipelines.airbyte_ci.format.check.commands.check",
|
||||
"fix": "pipelines.airbyte_ci.format.fix.commands.fix",
|
||||
},
|
||||
)
|
||||
@click_merge_args_into_context_obj
|
||||
@pass_pipeline_context
|
||||
@click_ignore_unused_kwargs
|
||||
async def format_code(pipeline_context: ClickPipelineContext):
|
||||
pass
|
||||
@@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
DEFAULT_FORMAT_IGNORE_LIST = [
|
||||
"**/__pycache__",
|
||||
'"**/.pytest_cache',
|
||||
"**/.venv",
|
||||
"**/venv",
|
||||
"**/.gradle",
|
||||
"**/node_modules",
|
||||
"**/.tox",
|
||||
"**/.eggs",
|
||||
"**/.mypy_cache",
|
||||
"**/.venv",
|
||||
"**/*.egg-info",
|
||||
"**/build",
|
||||
"**/dbt-project-template",
|
||||
"**/dbt-project-template-mssql",
|
||||
"**/dbt-project-template-mysql",
|
||||
"**/dbt-project-template-oracle",
|
||||
"**/dbt-project-template-clickhouse",
|
||||
"**/dbt-project-template-snowflake",
|
||||
"**/dbt-project-template-tidb",
|
||||
"**/dbt-project-template-duckdb",
|
||||
"**/dbt_test_config",
|
||||
"**/normalization_test_output",
|
||||
# '**/tools',
|
||||
"**/secrets",
|
||||
"**/charts", # Helm charts often have injected template strings that will fail general linting. Helm linting is done separately.
|
||||
"**/resources/seed/*_catalog.json", # Do not remove - this is also necessary to prevent diffs in our github workflows
|
||||
"**/resources/seed/*_registry.json", # Do not remove - this is also necessary to prevent diffs in our github workflows
|
||||
"**/resources/seed/specs_secrets_mask.yaml", # Downloaded externally.
|
||||
"**/resources/examples/airflow/superset/docker/pythonpath_dev/superset_config.py",
|
||||
"**/source-amplitude/unit_tests/api_data/zipped.json", # Zipped file presents as non-UTF-8 making spotless sad
|
||||
"**/airbyte-connector-builder-server/connector_builder/generated", # autogenerated code doesn't need to be formatted
|
||||
"**/airbyte-ci/connectors/metadata_service/lib/tests/fixtures/**/invalid", # These are deliberately invalid and unformattable.
|
||||
"**/__init__.py",
|
||||
"**/declarative_component_schema.py",
|
||||
"**/source-stock-ticker-api-tutorial/source.py",
|
||||
"**/tools/git_hooks/tests/test_spec_linter.py",
|
||||
"**/tools/schema_generator/schema_generator/infer_schemas.py",
|
||||
"**/.git",
|
||||
]
|
||||
@@ -0,0 +1,110 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
import dagger
|
||||
from pipelines.airbyte_ci.format.consts import DEFAULT_FORMAT_IGNORE_LIST
|
||||
from pipelines.consts import AMAZONCORRETTO_IMAGE, GO_IMAGE, NODE_IMAGE, PYTHON_3_10_IMAGE
|
||||
from pipelines.helpers.utils import sh_dash_c
|
||||
|
||||
|
||||
def build_container(
|
||||
dagger_client: dagger.Client,
|
||||
base_image: str,
|
||||
include: List[str],
|
||||
install_commands: Optional[List[str]] = None,
|
||||
env_vars: Optional[Dict[str, Any]] = {},
|
||||
) -> dagger.Container:
|
||||
"""Build a container for formatting code.
|
||||
Args:
|
||||
ctx (ClickPipelineContext): The context of the pipeline
|
||||
base_image (str): The base image to use for the container
|
||||
include (List[str]): The list of files to include in the container
|
||||
install_commands (Optional[List[str]]): The list of commands to run to install dependencies for the formatter
|
||||
env_vars (Optional[Dict[str, Any]]): The list of environment variables to set on the container
|
||||
Returns:
|
||||
dagger.Container: The container to use for formatting
|
||||
"""
|
||||
# Create container from base image
|
||||
container = dagger_client.container().from_(base_image)
|
||||
|
||||
# Add any environment variables
|
||||
for key, value in env_vars.items():
|
||||
container = container.with_env_variable(key, value)
|
||||
|
||||
# Install any dependencies of the formatter
|
||||
if install_commands:
|
||||
container = container.with_exec(sh_dash_c(install_commands), skip_entrypoint=True)
|
||||
|
||||
# Mount the relevant parts of the repository: the code to format and the formatting config
|
||||
# Exclude the default ignore list to keep things as small as possible
|
||||
container = container.with_mounted_directory(
|
||||
"/src",
|
||||
dagger_client.host().directory(
|
||||
".",
|
||||
include=include,
|
||||
exclude=DEFAULT_FORMAT_IGNORE_LIST,
|
||||
),
|
||||
)
|
||||
|
||||
# Set the working directory to the code to format
|
||||
container = container.with_workdir("/src")
|
||||
|
||||
return container
|
||||
|
||||
|
||||
def format_java_container(dagger_client: dagger.Client) -> dagger.Container:
|
||||
"""Format java, groovy, and sql code via spotless."""
|
||||
return build_container(
|
||||
dagger_client,
|
||||
base_image=AMAZONCORRETTO_IMAGE,
|
||||
include=[
|
||||
"**/*.java",
|
||||
"**/*.gradle",
|
||||
"gradlew",
|
||||
"gradlew.bat",
|
||||
"gradle",
|
||||
"**/deps.toml",
|
||||
"**/gradle.properties",
|
||||
"**/version.properties",
|
||||
"tools/gradle/codestyle/java-google-style.xml",
|
||||
],
|
||||
install_commands=[
|
||||
"yum update -y",
|
||||
"yum install -y findutils", # gradle requires xargs, which is shipped in findutils.
|
||||
"yum clean all",
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def format_js_container(dagger_client: dagger.Client) -> dagger.Container:
|
||||
"""Format yaml and json code via prettier."""
|
||||
return build_container(
|
||||
dagger_client,
|
||||
base_image=NODE_IMAGE,
|
||||
include=["**/*.yaml", "**/*.yml", "**.*/json", "package.json", "package-lock.json"],
|
||||
install_commands=["npm install -g npm@10.1.0 prettier@3.0.3"],
|
||||
)
|
||||
|
||||
|
||||
def format_license_container(dagger_client: dagger.Client, license_file: str) -> dagger.Container:
|
||||
return build_container(
|
||||
dagger_client,
|
||||
base_image=GO_IMAGE,
|
||||
include=["**/*.java", "**/*.py", license_file],
|
||||
install_commands=["go get -u github.com/google/addlicense"],
|
||||
)
|
||||
|
||||
|
||||
def format_python_container(dagger_client: dagger.Client) -> dagger.Container:
|
||||
"""Format python code via black and isort."""
|
||||
|
||||
return build_container(
|
||||
dagger_client,
|
||||
base_image=PYTHON_3_10_IMAGE,
|
||||
env_vars={"PIPX_BIN_DIR": "/usr/local/bin"},
|
||||
include=["**/*.py", "pyproject.toml", "poetry.lock"],
|
||||
install_commands=["pip install pipx", "pipx ensurepath", "pipx install poetry"],
|
||||
)
|
||||
@@ -0,0 +1,134 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
import logging
|
||||
from typing import List
|
||||
|
||||
import asyncclick as click
|
||||
import dagger
|
||||
from pipelines.airbyte_ci.format.actions import run_format
|
||||
from pipelines.airbyte_ci.format.containers import (
|
||||
format_java_container,
|
||||
format_js_container,
|
||||
format_license_container,
|
||||
format_python_container,
|
||||
)
|
||||
from pipelines.cli.click_decorators import click_ignore_unused_kwargs
|
||||
from pipelines.cli.dagger_pipeline_command import DaggerPipelineCommand
|
||||
from pipelines.helpers.cli import (
|
||||
LogOptions,
|
||||
get_all_sibling_commands,
|
||||
invoke_commands_concurrently,
|
||||
invoke_commands_sequentially,
|
||||
log_command_results,
|
||||
)
|
||||
from pipelines.models.contexts.click_pipeline_context import ClickPipelineContext, pass_pipeline_context
|
||||
from pipelines.models.steps import CommandResult, StepStatus
|
||||
|
||||
# HELPERS
|
||||
|
||||
|
||||
async def get_format_command_result(click_command: click.Command, container: dagger.Container, format_commands: List[str]) -> CommandResult:
|
||||
"""Run a format command and return the CommandResult.
|
||||
A command is considered successful if the export operation of run_format is successful.
|
||||
|
||||
Args:
|
||||
click_command (click.Command): The click command to run
|
||||
container (dagger.Container): The container to run the format_commands in
|
||||
format_commands (List[str]): The list of commands to run to format the repository
|
||||
|
||||
Returns:
|
||||
CommandResult: The result of running the command
|
||||
"""
|
||||
try:
|
||||
successful_export = await run_format(container, format_commands)
|
||||
status = StepStatus.SUCCESS if successful_export else StepStatus.FAILURE
|
||||
return CommandResult(click_command, status=status)
|
||||
except dagger.ExecError as e:
|
||||
return CommandResult(click_command, status=StepStatus.FAILURE, stderr=e.stderr, stdout=e.stdout, exc_info=e)
|
||||
|
||||
|
||||
@click.group(
|
||||
help="Run code format checks and fix any failures.",
|
||||
chain=True,
|
||||
)
|
||||
async def fix():
|
||||
pass
|
||||
|
||||
|
||||
@fix.command(cls=DaggerPipelineCommand, name="all")
|
||||
@click.pass_context
|
||||
async def all_fix(ctx: click.Context):
|
||||
"""Run code format checks and fix any failures."""
|
||||
parent_command = ctx.parent.command
|
||||
logger = logging.getLogger(parent_command.name)
|
||||
|
||||
concurrent_commands = [
|
||||
fix.commands["python"],
|
||||
fix.commands["java"],
|
||||
fix.commands["js"],
|
||||
]
|
||||
sequential_commands = [fix.commands["license"]]
|
||||
|
||||
# We can run language commands concurrently because they modify different set of files.
|
||||
command_results = await invoke_commands_concurrently(ctx, concurrent_commands)
|
||||
|
||||
# We have to run license command sequentially because it modifies the same set of files as other commands.
|
||||
# If we ran it concurrently with language commands, we face race condition issues.
|
||||
command_results += await invoke_commands_sequentially(ctx, sequential_commands)
|
||||
failure = any([r.status is StepStatus.FAILURE for r in command_results])
|
||||
|
||||
log_options = LogOptions(list_errors=True)
|
||||
|
||||
log_command_results(ctx, command_results, logger, log_options)
|
||||
|
||||
return not failure
|
||||
|
||||
|
||||
@fix.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
@click_ignore_unused_kwargs
|
||||
async def java(ctx: ClickPipelineContext) -> CommandResult:
|
||||
"""Format java, groovy, and sql code via spotless."""
|
||||
dagger_client = await ctx.get_dagger_client(pipeline_name="Format java")
|
||||
container = format_java_container(dagger_client)
|
||||
format_commands = ["./gradlew spotlessApply --scan"]
|
||||
return await get_format_command_result(fix.commands["java"], container, format_commands)
|
||||
|
||||
|
||||
@fix.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
@click_ignore_unused_kwargs
|
||||
async def js(ctx: ClickPipelineContext) -> CommandResult:
|
||||
dagger_client = await ctx.get_dagger_client(pipeline_name="Format js")
|
||||
container = format_js_container(dagger_client)
|
||||
format_commands = ["prettier --write ."]
|
||||
return await get_format_command_result(fix.commands["js"], container, format_commands)
|
||||
|
||||
|
||||
@fix.command("license")
|
||||
@pass_pipeline_context
|
||||
@click_ignore_unused_kwargs
|
||||
async def license_fix(ctx: ClickPipelineContext) -> CommandResult:
|
||||
"""Add license to python and java code via addlicense."""
|
||||
license_file = "LICENSE_SHORT"
|
||||
dagger_client = await ctx.get_dagger_client(pipeline_name="Add license")
|
||||
container = format_license_container(dagger_client, license_file)
|
||||
format_commands = [f"addlicense -c 'Airbyte, Inc.' -l apache -v -f {license_file} ."]
|
||||
return await get_format_command_result(fix.commands["license"], container, format_commands)
|
||||
|
||||
|
||||
@fix.command(cls=DaggerPipelineCommand)
|
||||
@pass_pipeline_context
|
||||
@click_ignore_unused_kwargs
|
||||
async def python(ctx: ClickPipelineContext) -> CommandResult:
|
||||
"""Format python code via black and isort."""
|
||||
dagger_client = await ctx.get_dagger_client(pipeline_name="Format python")
|
||||
container = format_python_container(dagger_client)
|
||||
format_commands = [
|
||||
"poetry install --no-root",
|
||||
"poetry run isort --settings-file pyproject.toml .",
|
||||
"poetry run black --config pyproject.toml .",
|
||||
]
|
||||
return await get_format_command_result(fix.commands["python"], container, format_commands)
|
||||
@@ -68,7 +68,6 @@ class GradleTask(Step, ABC):
|
||||
"gradle.properties",
|
||||
"gradle",
|
||||
"gradlew",
|
||||
"LICENSE_SHORT",
|
||||
"settings.gradle",
|
||||
"build.gradle",
|
||||
"tools/gradle",
|
||||
@@ -76,7 +75,6 @@ class GradleTask(Step, ABC):
|
||||
"buildSrc",
|
||||
"tools/bin/build_image.sh",
|
||||
"tools/lib/lib.sh",
|
||||
"tools/gradle/codestyle",
|
||||
"pyproject.toml",
|
||||
] + self.build_include
|
||||
|
||||
@@ -84,8 +82,6 @@ class GradleTask(Step, ABC):
|
||||
"docker", # required by :integrationTestJava.
|
||||
"findutils", # gradle requires xargs, which is shipped in findutils.
|
||||
"jq", # required by :acceptance-test-harness to inspect docker images.
|
||||
"npm", # required by :format.
|
||||
"python3.11-pip", # required by :format.
|
||||
"rsync", # required for gradle cache synchronization.
|
||||
]
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ def display_welcome_message() -> None:
|
||||
│ │
|
||||
│ │
|
||||
╚─────────────────────────────────────────────────────────────────────────────────────────────────╝
|
||||
"""
|
||||
""" # noqa: W605
|
||||
)
|
||||
|
||||
|
||||
@@ -226,6 +226,7 @@ async def get_modified_files_str(ctx: click.Context):
|
||||
help="Airbyte CI top-level command group.",
|
||||
lazy_subcommands={
|
||||
"connectors": "pipelines.airbyte_ci.connectors.commands.connectors",
|
||||
"format": "pipelines.airbyte_ci.format.commands.format_code",
|
||||
"metadata": "pipelines.airbyte_ci.metadata.commands.metadata",
|
||||
"test": "pipelines.airbyte_ci.test.commands.test",
|
||||
},
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
import functools
|
||||
import inspect
|
||||
|
||||
@@ -13,14 +13,11 @@ LICENSE_SHORT_FILE_PATH = "LICENSE_SHORT"
|
||||
CONNECTOR_TESTING_REQUIREMENTS = [
|
||||
"pip==21.3.1",
|
||||
"mccabe==0.6.1",
|
||||
"flake8==4.0.1",
|
||||
"pyproject-flake8==0.0.1a2",
|
||||
"black==22.3.0",
|
||||
"isort==5.6.4",
|
||||
# "flake8==4.0.1",
|
||||
# "pyproject-flake8==0.0.1a2",
|
||||
"pytest==6.2.5",
|
||||
"coverage[toml]==6.3.1",
|
||||
"pytest-custom_exit_code",
|
||||
"licenseheaders==0.8.8",
|
||||
]
|
||||
|
||||
BUILD_PLATFORMS = [Platform("linux/amd64"), Platform("linux/arm64")]
|
||||
@@ -33,6 +30,9 @@ PLATFORM_MACHINE_TO_DAGGER_PLATFORM = {
|
||||
}
|
||||
LOCAL_BUILD_PLATFORM = PLATFORM_MACHINE_TO_DAGGER_PLATFORM[platform.machine()]
|
||||
AMAZONCORRETTO_IMAGE = "amazoncorretto:17.0.8-al2023"
|
||||
NODE_IMAGE = "node:18.18.0-slim"
|
||||
GO_IMAGE = "golang:1.17"
|
||||
PYTHON_3_10_IMAGE = "python:3.10.13-slim"
|
||||
DOCKER_VERSION = "24.0.2"
|
||||
DOCKER_DIND_IMAGE = f"docker:{DOCKER_VERSION}-dind"
|
||||
DOCKER_CLI_IMAGE = f"docker:{DOCKER_VERSION}-cli"
|
||||
|
||||
@@ -6,7 +6,6 @@ from dagger import CacheSharingMode, CacheVolume, Client, Container
|
||||
from pipelines.airbyte_ci.connectors.context import PipelineContext
|
||||
from pipelines.consts import (
|
||||
CONNECTOR_TESTING_REQUIREMENTS,
|
||||
LICENSE_SHORT_FILE_PATH,
|
||||
PIP_CACHE_PATH,
|
||||
PIP_CACHE_VOLUME_NAME,
|
||||
POETRY_CACHE_PATH,
|
||||
@@ -61,12 +60,9 @@ def with_testing_dependencies(context: PipelineContext) -> Container:
|
||||
"""
|
||||
python_environment: Container = with_python_base(context)
|
||||
pyproject_toml_file = context.get_repo_dir(".", include=[PYPROJECT_TOML_FILE_PATH]).file(PYPROJECT_TOML_FILE_PATH)
|
||||
license_short_file = context.get_repo_dir(".", include=[LICENSE_SHORT_FILE_PATH]).file(LICENSE_SHORT_FILE_PATH)
|
||||
|
||||
return (
|
||||
python_environment.with_exec(["pip", "install"] + CONNECTOR_TESTING_REQUIREMENTS)
|
||||
.with_file(f"/{PYPROJECT_TOML_FILE_PATH}", pyproject_toml_file)
|
||||
.with_file(f"/{LICENSE_SHORT_FILE_PATH}", license_short_file)
|
||||
return python_environment.with_exec(["pip", "install"] + CONNECTOR_TESTING_REQUIREMENTS).with_file(
|
||||
f"/{PYPROJECT_TOML_FILE_PATH}", pyproject_toml_file
|
||||
)
|
||||
|
||||
|
||||
|
||||
104
airbyte-ci/connectors/pipelines/pipelines/helpers/cli.py
Normal file
104
airbyte-ci/connectors/pipelines/pipelines/helpers/cli.py
Normal file
@@ -0,0 +1,104 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from dataclasses import dataclass
|
||||
from logging import Logger
|
||||
from typing import Any, List
|
||||
|
||||
import asyncclick as click
|
||||
import asyncer
|
||||
from jinja2 import Template
|
||||
from pipelines.models.steps import CommandResult, StepStatus
|
||||
|
||||
ALL_RESULTS_KEY = "_run_all_results"
|
||||
|
||||
SUMMARY_TEMPLATE_STR = """
|
||||
|
||||
Summary of commands results
|
||||
========================
|
||||
{% for command_name, success in results %}
|
||||
{{ '✅' if success else '❌' }} {{ command_prefix }} {{ command_name }}
|
||||
{% endfor %}
|
||||
"""
|
||||
|
||||
DETAILS_TEMPLATE_STR = """
|
||||
|
||||
Detailed Errors for failed commands
|
||||
=================================
|
||||
{% for command_name, error in failed_commands_details %}
|
||||
❌ {{ command_prefix }} {{ command_name }}
|
||||
|
||||
Error: {{ error }}
|
||||
{% endfor %}
|
||||
=================================
|
||||
|
||||
"""
|
||||
|
||||
|
||||
@dataclass
|
||||
class LogOptions:
|
||||
list_errors: bool = False
|
||||
help_message: str = None
|
||||
|
||||
|
||||
def log_command_results(ctx: click.Context, command_results: List[CommandResult], logger: Logger, options: LogOptions = LogOptions()):
|
||||
"""
|
||||
Log the output of the subcommands run by `run_all_subcommands`.
|
||||
"""
|
||||
command_path = ctx.command_path
|
||||
|
||||
summary_template = Template(SUMMARY_TEMPLATE_STR)
|
||||
results = [(r.command.name, r.status is StepStatus.SUCCESS) for r in command_results]
|
||||
summary_message = summary_template.render(results=results, command_prefix=command_path)
|
||||
logger.info(summary_message)
|
||||
|
||||
result_contains_failures = any([r.status is StepStatus.FAILURE for r in command_results])
|
||||
|
||||
if result_contains_failures:
|
||||
if options.list_errors:
|
||||
failed_commands_details = [
|
||||
(command_result.command.name, command_result.stderr)
|
||||
for command_result in command_results
|
||||
if command_result.status is StepStatus.FAILURE
|
||||
]
|
||||
if failed_commands_details:
|
||||
details_template = Template(DETAILS_TEMPLATE_STR)
|
||||
details_message = details_template.render(failed_commands_details=failed_commands_details, command_prefix=command_path)
|
||||
logger.info(details_message)
|
||||
else:
|
||||
logger.info(f"Run `{command_path} --list-errors` to see detailed error messages for failed checks.")
|
||||
|
||||
if options.help_message:
|
||||
logger.info(options.help_message)
|
||||
|
||||
|
||||
async def invoke_commands_concurrently(ctx: click.Context, commands: List[click.Command]) -> List[Any]:
|
||||
"""
|
||||
Run click commands concurrently and return a list of their return values.
|
||||
"""
|
||||
|
||||
soon_command_executions_results = []
|
||||
async with asyncer.create_task_group() as command_group:
|
||||
for command in commands:
|
||||
soon_command_execution_result = command_group.soonify(ctx.invoke)(command)
|
||||
soon_command_executions_results.append(soon_command_execution_result)
|
||||
return [r.value for r in soon_command_executions_results]
|
||||
|
||||
|
||||
async def invoke_commands_sequentially(ctx: click.Context, commands: List[click.Command]) -> List[Any]:
|
||||
"""
|
||||
Run click commands sequentially and return a list of their return values.
|
||||
"""
|
||||
command_executions_results = []
|
||||
for command in commands:
|
||||
command_executions_results.append(await ctx.invoke(command))
|
||||
return command_executions_results
|
||||
|
||||
|
||||
def get_all_sibling_commands(ctx: click.Context) -> List[click.Command]:
|
||||
"""
|
||||
Get all sibling commands of the current command.
|
||||
"""
|
||||
return [c for c in ctx.parent.command.commands.values() if c.name != ctx.command.name]
|
||||
@@ -1,4 +1,6 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
import sys
|
||||
from typing import Any, Callable, Optional
|
||||
@@ -24,6 +26,7 @@ class ClickPipelineContext(BaseModel, Singleton):
|
||||
dockerd_service: Optional[Container] = Field(default=None)
|
||||
_dagger_client: Optional[Client] = PrivateAttr(default=None)
|
||||
_click_context: Callable[[], Context] = PrivateAttr(default_factory=lambda: get_current_context)
|
||||
_og_click_context: Callable[[], Context] = PrivateAttr(default=None)
|
||||
|
||||
@property
|
||||
def params(self):
|
||||
@@ -66,6 +69,11 @@ class ClickPipelineContext(BaseModel, Singleton):
|
||||
super().__init__(**data)
|
||||
Singleton._initialized[ClickPipelineContext] = True
|
||||
|
||||
"""
|
||||
Note: Its important to hold onto the original click context object, as it is used to hold onto the Dagger client.
|
||||
"""
|
||||
self._og_click_context = self._click_context()
|
||||
|
||||
_dagger_client_lock: anyio.Lock = PrivateAttr(default_factory=anyio.Lock)
|
||||
|
||||
async def get_dagger_client(self, pipeline_name: Optional[str] = None) -> Client:
|
||||
@@ -84,7 +92,7 @@ class ClickPipelineContext(BaseModel, Singleton):
|
||||
Avoid using this client across multiple thread pools, as it can lead to errors.
|
||||
Cross-thread pool calls are generally considered an anti-pattern.
|
||||
"""
|
||||
self._dagger_client = await self._click_context().with_async_resource(connection) # type: ignore
|
||||
self._dagger_client = await self._og_click_context.with_async_resource(connection) # type: ignore
|
||||
|
||||
assert self._dagger_client, "Error initializing Dagger client"
|
||||
return self._dagger_client.pipeline(pipeline_name) if pipeline_name else self._dagger_client
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from typing import Any, Type
|
||||
|
||||
|
||||
@@ -5,26 +5,25 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import typing
|
||||
from abc import abstractmethod
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime, timedelta
|
||||
from enum import Enum
|
||||
from pathlib import Path
|
||||
from typing import Any, Optional
|
||||
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union
|
||||
|
||||
import anyio
|
||||
import asyncer
|
||||
import click
|
||||
from dagger import Container, DaggerError
|
||||
from pipelines import main_logger
|
||||
from pipelines.helpers import sentry_utils
|
||||
from pipelines.helpers.utils import format_duration, get_exec_result
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
if TYPE_CHECKING:
|
||||
from pipelines.models.contexts.pipeline_context import PipelineContext
|
||||
|
||||
from abc import ABC
|
||||
from typing import ClassVar
|
||||
|
||||
from rich.style import Style
|
||||
|
||||
@@ -62,7 +61,7 @@ class MountPath:
|
||||
class StepResult:
|
||||
"""A dataclass to capture the result of a step."""
|
||||
|
||||
step: Step
|
||||
step: Union[Step, click.command]
|
||||
status: StepStatus
|
||||
created_at: datetime = field(default_factory=datetime.utcnow)
|
||||
stderr: Optional[str] = None
|
||||
@@ -88,6 +87,24 @@ class StepResult:
|
||||
return value
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class CommandResult:
|
||||
"""A dataclass to capture the result of a command."""
|
||||
|
||||
command: click.command
|
||||
status: StepStatus
|
||||
created_at: datetime = field(default_factory=datetime.utcnow)
|
||||
stderr: Optional[str] = None
|
||||
stdout: Optional[str] = None
|
||||
exc_info: Optional[Exception] = None
|
||||
|
||||
def __repr__(self) -> str: # noqa D105
|
||||
return f"{self.command.name}: {self.status.value}"
|
||||
|
||||
def __str__(self) -> str: # noqa D105
|
||||
return f"{self.command.name}: {self.status.value}\n\nSTDOUT:\n{self.stdout}\n\nSTDERR:\n{self.stderr}"
|
||||
|
||||
|
||||
class StepStatus(Enum):
|
||||
"""An Enum to characterize the success, failure or skipping of a Step."""
|
||||
|
||||
|
||||
463
airbyte-ci/connectors/pipelines/poetry.lock
generated
463
airbyte-ci/connectors/pipelines/poetry.lock
generated
@@ -282,101 +282,101 @@ pycparser = "*"
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.3.1"
|
||||
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.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"},
|
||||
{file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"},
|
||||
{file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"},
|
||||
{file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"},
|
||||
{file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"},
|
||||
{file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"},
|
||||
{file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"},
|
||||
{file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"},
|
||||
{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]]
|
||||
@@ -443,7 +443,7 @@ url = "../common_utils"
|
||||
|
||||
[[package]]
|
||||
name = "connector-ops"
|
||||
version = "0.3.1"
|
||||
version = "0.3.2"
|
||||
description = "Packaged maintained by the connector operations team to perform CI for connectors"
|
||||
optional = false
|
||||
python-versions = "^3.10"
|
||||
@@ -698,13 +698,13 @@ test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre
|
||||
|
||||
[[package]]
|
||||
name = "google-api-core"
|
||||
version = "2.12.0"
|
||||
version = "2.14.0"
|
||||
description = "Google API client core library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"},
|
||||
{file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"},
|
||||
{file = "google-api-core-2.14.0.tar.gz", hash = "sha256:5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"},
|
||||
{file = "google_api_core-2.14.0-py3-none-any.whl", hash = "sha256:de2fb50ed34d47ddbb2bd2dcf680ee8fead46279f4ed6b16de362aca23a18952"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -720,13 +720,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"]
|
||||
|
||||
[[package]]
|
||||
name = "google-auth"
|
||||
version = "2.23.3"
|
||||
version = "2.23.4"
|
||||
description = "Google Authentication Library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "google-auth-2.23.3.tar.gz", hash = "sha256:6864247895eea5d13b9c57c9e03abb49cb94ce2dc7c58e91cba3248c7477c9e3"},
|
||||
{file = "google_auth-2.23.3-py2.py3-none-any.whl", hash = "sha256:a8f4608e65c244ead9e0538f181a96c6e11199ec114d41f1d7b1bffa96937bda"},
|
||||
{file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"},
|
||||
{file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -761,13 +761,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"]
|
||||
|
||||
[[package]]
|
||||
name = "google-cloud-storage"
|
||||
version = "2.12.0"
|
||||
version = "2.13.0"
|
||||
description = "Google Cloud Storage API client library"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "google-cloud-storage-2.12.0.tar.gz", hash = "sha256:57c0bcda2f5e11f008a155d8636d8381d5abab46b58e0cae0e46dd5e595e6b46"},
|
||||
{file = "google_cloud_storage-2.12.0-py2.py3-none-any.whl", hash = "sha256:bc52563439d42981b6e21b071a76da2791672776eda3ba99d13a8061ebbd6e5e"},
|
||||
{file = "google-cloud-storage-2.13.0.tar.gz", hash = "sha256:f62dc4c7b6cd4360d072e3deb28035fbdad491ac3d9b0b1815a12daea10f37c7"},
|
||||
{file = "google_cloud_storage-2.13.0-py2.py3-none-any.whl", hash = "sha256:ab0bf2e1780a1b74cf17fccb13788070b729f50c252f0c94ada2aae0ca95437d"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -946,39 +946,40 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "0.18.0"
|
||||
version = "1.0.1"
|
||||
description = "A minimal low-level HTTP client."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "httpcore-0.18.0-py3-none-any.whl", hash = "sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced"},
|
||||
{file = "httpcore-0.18.0.tar.gz", hash = "sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9"},
|
||||
{file = "httpcore-1.0.1-py3-none-any.whl", hash = "sha256:c5e97ef177dca2023d0b9aad98e49507ef5423e9f1d94ffe2cfe250aa28e63b0"},
|
||||
{file = "httpcore-1.0.1.tar.gz", hash = "sha256:fce1ddf9b606cfb98132ab58865c3728c52c8e4c3c46e2aabb3674464a186e92"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
anyio = ">=3.0,<5.0"
|
||||
certifi = "*"
|
||||
h11 = ">=0.13,<0.15"
|
||||
sniffio = "==1.*"
|
||||
|
||||
[package.extras]
|
||||
asyncio = ["anyio (>=4.0,<5.0)"]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
socks = ["socksio (==1.*)"]
|
||||
trio = ["trio (>=0.22.0,<0.23.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "httpx"
|
||||
version = "0.25.0"
|
||||
version = "0.25.1"
|
||||
description = "The next generation HTTP client."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "httpx-0.25.0-py3-none-any.whl", hash = "sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100"},
|
||||
{file = "httpx-0.25.0.tar.gz", hash = "sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875"},
|
||||
{file = "httpx-0.25.1-py3-none-any.whl", hash = "sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a"},
|
||||
{file = "httpx-0.25.1.tar.gz", hash = "sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
anyio = "*"
|
||||
certifi = "*"
|
||||
httpcore = ">=0.18.0,<0.19.0"
|
||||
httpcore = "*"
|
||||
idna = "*"
|
||||
sniffio = "*"
|
||||
|
||||
@@ -1414,24 +1415,22 @@ testing = ["pytest", "pytest-benchmark"]
|
||||
|
||||
[[package]]
|
||||
name = "protobuf"
|
||||
version = "4.24.4"
|
||||
version = "4.25.0"
|
||||
description = ""
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "protobuf-4.24.4-cp310-abi3-win32.whl", hash = "sha256:ec9912d5cb6714a5710e28e592ee1093d68c5ebfeda61983b3f40331da0b1ebb"},
|
||||
{file = "protobuf-4.24.4-cp310-abi3-win_amd64.whl", hash = "sha256:1badab72aa8a3a2b812eacfede5020472e16c6b2212d737cefd685884c191085"},
|
||||
{file = "protobuf-4.24.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e61a27f362369c2f33248a0ff6896c20dcd47b5d48239cb9720134bef6082e4"},
|
||||
{file = "protobuf-4.24.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:bffa46ad9612e6779d0e51ae586fde768339b791a50610d85eb162daeb23661e"},
|
||||
{file = "protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b493cb590960ff863743b9ff1452c413c2ee12b782f48beca77c8da3e2ffe9d9"},
|
||||
{file = "protobuf-4.24.4-cp37-cp37m-win32.whl", hash = "sha256:dbbed8a56e56cee8d9d522ce844a1379a72a70f453bde6243e3c86c30c2a3d46"},
|
||||
{file = "protobuf-4.24.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6b7d2e1c753715dcfe9d284a25a52d67818dd43c4932574307daf836f0071e37"},
|
||||
{file = "protobuf-4.24.4-cp38-cp38-win32.whl", hash = "sha256:02212557a76cd99574775a81fefeba8738d0f668d6abd0c6b1d3adcc75503dbe"},
|
||||
{file = "protobuf-4.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:2fa3886dfaae6b4c5ed2730d3bf47c7a38a72b3a1f0acb4d4caf68e6874b947b"},
|
||||
{file = "protobuf-4.24.4-cp39-cp39-win32.whl", hash = "sha256:b77272f3e28bb416e2071186cb39efd4abbf696d682cbb5dc731308ad37fa6dd"},
|
||||
{file = "protobuf-4.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:9fee5e8aa20ef1b84123bb9232b3f4a5114d9897ed89b4b8142d81924e05d79b"},
|
||||
{file = "protobuf-4.24.4-py3-none-any.whl", hash = "sha256:80797ce7424f8c8d2f2547e2d42bfbb6c08230ce5832d6c099a37335c9c90a92"},
|
||||
{file = "protobuf-4.24.4.tar.gz", hash = "sha256:5a70731910cd9104762161719c3d883c960151eea077134458503723b60e3667"},
|
||||
{file = "protobuf-4.25.0-cp310-abi3-win32.whl", hash = "sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395"},
|
||||
{file = "protobuf-4.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419"},
|
||||
{file = "protobuf-4.25.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4"},
|
||||
{file = "protobuf-4.25.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51"},
|
||||
{file = "protobuf-4.25.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054"},
|
||||
{file = "protobuf-4.25.0-cp38-cp38-win32.whl", hash = "sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575"},
|
||||
{file = "protobuf-4.25.0-cp38-cp38-win_amd64.whl", hash = "sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9"},
|
||||
{file = "protobuf-4.25.0-cp39-cp39-win32.whl", hash = "sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701"},
|
||||
{file = "protobuf-4.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f"},
|
||||
{file = "protobuf-4.25.0-py3-none-any.whl", hash = "sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a"},
|
||||
{file = "protobuf-4.25.0.tar.gz", hash = "sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1551,36 +1550,41 @@ dev = ["Sphinx", "black", "build", "coverage", "docformatter", "flake8", "flake8
|
||||
|
||||
[[package]]
|
||||
name = "pygit2"
|
||||
version = "1.13.1"
|
||||
version = "1.13.2"
|
||||
description = "Python bindings for libgit2."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "pygit2-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:30db67f73ef28b07864f2509978b7396d1ed3b72f6f252d301db12a4c9f90f5b"},
|
||||
{file = "pygit2-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825f22a1bbf73c7a11c69e53a29485d10b4df6a635ccd120cf2966e6535a5b52"},
|
||||
{file = "pygit2-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7356d4e41f122a066fa1cce3f5dbedf73c03781692f5eab3687bc355a083575"},
|
||||
{file = "pygit2-1.13.1-cp310-cp310-win32.whl", hash = "sha256:cf47de2e21cdeb5d8c35f0d1a381b56fdb365dac3dcd8ea7fa057b390ce83d40"},
|
||||
{file = "pygit2-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:6ede9700fdbf78a5a1513549f37884233f29d3343412272c0800cda40c4c2c56"},
|
||||
{file = "pygit2-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9c84eff2223e5fd442b746785b9cd21f98c1f53a0f3fe8d4ed06aee60a09ea35"},
|
||||
{file = "pygit2-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bd649b9ef17564b642f59e1a2751e30fdd07d3707b0642d8012062615651039"},
|
||||
{file = "pygit2-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:787ea717bb9fadb3ee2836ed32a9ed2110ef861862bfe6b693becda75a2eaa5c"},
|
||||
{file = "pygit2-1.13.1-cp311-cp311-win32.whl", hash = "sha256:d2dbf3d6976b0626fafd7d1c7363ae92dcacaa63789e8c432bc8caea86132235"},
|
||||
{file = "pygit2-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce8618e5876b4c54942587d72a0d84f6e6a5b0e69db5f8d06dc5f567abd07ed1"},
|
||||
{file = "pygit2-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8d2d97cfe2bf2abbb0ef5984771578d1b05053942bfe1b46d4ac48d19c5eda56"},
|
||||
{file = "pygit2-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a162db1afdc5bae608d739395a248a373165176f83c7fe57a1073e9168b459"},
|
||||
{file = "pygit2-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357c11b30d6c63ff58401a897df39b27903beffebb24842c8ce9ce77b90fe0b1"},
|
||||
{file = "pygit2-1.13.1-cp38-cp38-win32.whl", hash = "sha256:ed7fc70bc8f6db227c9919958d064cb49eaa68cc97f51c1f9de920a4500c6766"},
|
||||
{file = "pygit2-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:949ad31e0fab408449721cc5b582350f6c5c56ab068bfa10cd6d10c2830deaa9"},
|
||||
{file = "pygit2-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ea2b870675ef1a2bef3300dda725aae9f8c68265e633ed683fce85588cfb4d37"},
|
||||
{file = "pygit2-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74af678b98f6a08ef4315f5b64889011e05ad702e340cc6cde59926906650039"},
|
||||
{file = "pygit2-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33bbe4d7501a600be320147c63a8d1a966fb7424595e6eb53fdc30259b8921dc"},
|
||||
{file = "pygit2-1.13.1-cp39-cp39-win32.whl", hash = "sha256:697044df77c8b3849fec8d7dd454acd347b180212c6bc5526eeb9309eff63a65"},
|
||||
{file = "pygit2-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:8004244da8183fcefcf7c3d4d119806e9c705543bcf24045b97e3eddaa869aef"},
|
||||
{file = "pygit2-1.13.1.tar.gz", hash = "sha256:d8e6d540aad9ded1cf2c6bda31ba48b1e20c18525807dbd837317bef4dccb994"},
|
||||
{file = "pygit2-1.13.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:781aefab7efc464852e688965bf3b4acc7af951cebea174d69f86b213aa5d5fb"},
|
||||
{file = "pygit2-1.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3038b5ecef43e2c853e7cf405676241e0395bb37b37ae477ef3b73a91f12378"},
|
||||
{file = "pygit2-1.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c00927a2626325b64ebc9f860f024a3ae0b4c036663f6ada8d5de0e2393560ca"},
|
||||
{file = "pygit2-1.13.2-cp310-cp310-win32.whl", hash = "sha256:6988fc6cf99a3dbc03bd64060888c3b194ee27c810cb61624519ee3813f2da3d"},
|
||||
{file = "pygit2-1.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:aec3df351b722ec7cdf7a7e642e421e3a15f3f2e3a51e57380d62d4992acf36d"},
|
||||
{file = "pygit2-1.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0eb53cc5212fad90e36693c0cd2ffd0d470efaea2506ce1c0d04f8d7fcf6767c"},
|
||||
{file = "pygit2-1.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32803ec881cd8f7dba91e03927e1fb13857e795bbe85cd3ec156b4798b933294"},
|
||||
{file = "pygit2-1.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba7297204e72c5cfdcd7a0c0d318af9d654a1d79b1cfe6cc8330570c749bec1f"},
|
||||
{file = "pygit2-1.13.2-cp311-cp311-win32.whl", hash = "sha256:2291707e648f5bba5b5c5e7ed652bc4563bd520718eb31e19525ccaceba5503c"},
|
||||
{file = "pygit2-1.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:96e534e92e485c4c1d4c3e151ce960655fed38ab9a1d65e2b16650cf24b3e088"},
|
||||
{file = "pygit2-1.13.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75f3b6d754d91dbe47b27b53d5a4440d861906b2f476284e6fb7c46cafe244d7"},
|
||||
{file = "pygit2-1.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30e145730dc65a9b902a889efdca0126d6b274c0b14427ebb085e090b50f6470"},
|
||||
{file = "pygit2-1.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2311ca16e1d0b77bc3694407c367391c7f2f78e2f725dc858721a5d4e3635fdd"},
|
||||
{file = "pygit2-1.13.2-cp312-cp312-win32.whl", hash = "sha256:a027e06c44f987a217c6197970bb29de9fbc78524c81b1f37888711978a64ce2"},
|
||||
{file = "pygit2-1.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:9844fb5a38119a34b31012dddc9b439f81bb0411cbf4a4f8e92a044f6f3e7462"},
|
||||
{file = "pygit2-1.13.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2f3a5362c702a42e28c3bc84ff324b57676c8bfdbfab445c96f5e776873630a6"},
|
||||
{file = "pygit2-1.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7d5d1c3508b66e5e13883ff472b616d2d60feb7a4afea52d3b501e9f5ee5d08"},
|
||||
{file = "pygit2-1.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2507d99584c7e3976342566adf6bc48aca825c170b86f999fe7bd32f8aa1858e"},
|
||||
{file = "pygit2-1.13.2-cp38-cp38-win32.whl", hash = "sha256:acda61b726c33ada3639cac5ddc5898678f7bb7b8415e84e3ff07a2af94b1ac3"},
|
||||
{file = "pygit2-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:4a86c4cae2e717acdd9d7ff00d196395fafe1abfc5efab5ada63650b49d5d47f"},
|
||||
{file = "pygit2-1.13.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ae9a77be5c5df5f4c9e586fbd53f1095bced2bba86ec669ead92c4c1e02f8373"},
|
||||
{file = "pygit2-1.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ef1dcfb59e73f6a59491343393b6e843739cbc92e8088a551c73cd367a54d0"},
|
||||
{file = "pygit2-1.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b88d21ed961fe422275c9c20d2613e6ecff2fa8127ac7620a29aba1d001fc41"},
|
||||
{file = "pygit2-1.13.2-cp39-cp39-win32.whl", hash = "sha256:14b458af1e8c6b634d55110edeab055e3bd9075543792cb75d2fdb8b434c202a"},
|
||||
{file = "pygit2-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:565b311c783a07768b91382620ad2b474fe40778411cb18c576f667be43d1299"},
|
||||
{file = "pygit2-1.13.2.tar.gz", hash = "sha256:75c7eb86b47c70f6f1434bcf3b5eb41f4e8006a15cee6bef606651b97d23788c"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
cffi = ">=1.9.1"
|
||||
cffi = ">=1.16.0"
|
||||
|
||||
[[package]]
|
||||
name = "pygithub"
|
||||
@@ -1937,13 +1941,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "sentry-sdk"
|
||||
version = "1.32.0"
|
||||
version = "1.34.0"
|
||||
description = "Python client for Sentry (https://sentry.io)"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "sentry-sdk-1.32.0.tar.gz", hash = "sha256:935e8fbd7787a3702457393b74b13d89a5afb67185bc0af85c00cb27cbd42e7c"},
|
||||
{file = "sentry_sdk-1.32.0-py2.py3-none-any.whl", hash = "sha256:eeb0b3550536f3bbc05bb1c7e0feb3a78d74acb43b607159a606ed2ec0a33a4d"},
|
||||
{file = "sentry-sdk-1.34.0.tar.gz", hash = "sha256:e5d0d2b25931d88fa10986da59d941ac6037f742ab6ff2fce4143a27981d60c3"},
|
||||
{file = "sentry_sdk-1.34.0-py2.py3-none-any.whl", hash = "sha256:76dd087f38062ac6c1e30ed6feb533ee0037ff9e709974802db7b5dbf2e5db21"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -2102,13 +2106,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "wcwidth"
|
||||
version = "0.2.8"
|
||||
version = "0.2.9"
|
||||
description = "Measures the displayed width of unicode strings in a terminal"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"},
|
||||
{file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"},
|
||||
{file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"},
|
||||
{file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2129,86 +2133,81 @@ test = ["websockets"]
|
||||
|
||||
[[package]]
|
||||
name = "wrapt"
|
||||
version = "1.15.0"
|
||||
version = "1.16.0"
|
||||
description = "Module for decorators, wrappers and monkey patching."
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"},
|
||||
{file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"},
|
||||
{file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"},
|
||||
{file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"},
|
||||
{file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"},
|
||||
{file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"},
|
||||
{file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"},
|
||||
{file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"},
|
||||
{file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"},
|
||||
{file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"},
|
||||
{file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"},
|
||||
{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"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2301,4 +2300,4 @@ multidict = ">=4.0"
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "~3.10"
|
||||
content-hash = "cf81e8fa302ee7329d6fc89906bc14fb6ef11d3bd4a90abe2a09cc907b73b3d0"
|
||||
content-hash = "9e99c86b95e7aefd35f67c0da45d99201a5f3043fd63d66b33ec05511f9dc322"
|
||||
|
||||
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry]
|
||||
name = "pipelines"
|
||||
version = "2.5.9"
|
||||
version = "2.6.0"
|
||||
description = "Packaged maintained by the connector operations team to perform CI for connectors' pipelines"
|
||||
authors = ["Airbyte <contact@airbyte.io>"]
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
import asyncclick as click
|
||||
import pytest
|
||||
|
||||
@@ -51,13 +51,7 @@ tasks.named('check').configure {
|
||||
'tidb',
|
||||
'duckdb',
|
||||
].each {destinationName ->
|
||||
def integrationTestPython = tasks.named('integrationTestPython')
|
||||
integrationTestPython.configure {
|
||||
dependsOn project(":airbyte-integrations:connectors:destination-$destinationName").tasks.named('assemble')
|
||||
}
|
||||
// Not really sure what this task does differently from customIntegrationTestPython,
|
||||
// but it seems to also run integration tests and as such it depends on the docker images.
|
||||
integrationTestPython.configure {
|
||||
tasks.matching { it.name == 'integrationTestPython' }.configureEach {
|
||||
dependsOn project(":airbyte-integrations:connectors:destination-$destinationName").tasks.named('assemble')
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import logging
|
||||
from contextlib import contextmanager
|
||||
from io import IOBase
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
from source_azure_blob_storage.legacy_config_transformer import LegacyConfigTransformer
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import os
|
||||
|
||||
os.environ["REQUEST_CACHE_PATH"] = "REQUEST_CACHE_PATH"
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
#
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from source_intercom import SourceIntercom
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
|
||||
class KlaviyoBackoffError(Exception):
|
||||
"""An exception which is raised when 'retry-after' time is longer than 'max_time' specified"""
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import os
|
||||
|
||||
os.environ["REQUEST_CACHE_PATH"] = "REQUEST_CACHE_PATH"
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
from airbyte_cdk.entrypoint import launch
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import io
|
||||
import struct
|
||||
import zipfile
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import datetime
|
||||
import io
|
||||
import struct
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import os
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
||||
|
||||
import os
|
||||
|
||||
os.environ["REQUEST_CACHE_PATH"] = "REQUEST_CACHE_PATH"
|
||||
|
||||
220
build.gradle
220
build.gradle
@@ -1,7 +1,4 @@
|
||||
import com.github.spotbugs.snom.SpotBugsTask
|
||||
import ru.vyarus.gradle.plugin.python.task.PythonTask
|
||||
import com.hierynomus.gradle.license.tasks.LicenseCheck
|
||||
import com.hierynomus.gradle.license.tasks.LicenseFormat
|
||||
|
||||
// The buildscript block defines dependencies in order for .gradle file evaluation.
|
||||
// This is separate from application dependencies.
|
||||
@@ -9,7 +6,6 @@ import com.hierynomus.gradle.license.tasks.LicenseFormat
|
||||
buildscript {
|
||||
dependencies {
|
||||
classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.20.0'
|
||||
classpath 'gradle.plugin.com.hierynomus.gradle.plugins:license-gradle-plugin:0.16.1'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,57 +63,7 @@ allprojects {
|
||||
version = rootProject.ext.version
|
||||
}
|
||||
|
||||
// License generation logic.
|
||||
def createLicenseWith = { File license, String startComment, String endComment, String lineComment, boolean isPython ->
|
||||
/*
|
||||
In java, we don't have a second linter/styling tool other than spotless so it doesn't really
|
||||
matter if we write a newline or not for startComment/endComment.
|
||||
|
||||
However, in python, we are using black that double-checks and reformats the code.
|
||||
Thus, writing an extra empty newline (not removed by trimTrailingWhitespace() is actually a
|
||||
big deal and would be reformatted (removed) because of black's specs.
|
||||
*/
|
||||
def tmp = File.createTempFile('tmp', '.tmp')
|
||||
tmp.withWriter {
|
||||
def w = it
|
||||
if (startComment.length() > 0 || !isPython) {
|
||||
w.writeLine(startComment)
|
||||
}
|
||||
license.eachLine {
|
||||
w << lineComment
|
||||
w.writeLine(it)
|
||||
}
|
||||
if (endComment.length() > 0 || !isPython) {
|
||||
w.writeLine(endComment)
|
||||
}
|
||||
w.writeLine("")
|
||||
if (isPython) {
|
||||
w.writeLine("")
|
||||
}
|
||||
}
|
||||
return tmp
|
||||
}
|
||||
def createPythonLicenseWith = { license ->
|
||||
return createLicenseWith(license, '', '', '', true)
|
||||
}
|
||||
def createJavaLicenseWith = { license ->
|
||||
return createLicenseWith(license, '/*', ' */', ' * ', false)
|
||||
}
|
||||
|
||||
// node is required by the root project to apply the prettier formatter repo-wide.
|
||||
node {
|
||||
download = true
|
||||
version = '18.18.0'
|
||||
npmVersion = '10.1.0'
|
||||
// When setting both these directories, npm and node will be in separate directories.
|
||||
workDir = file("${buildDir}/nodejs")
|
||||
npmWorkDir = file("${buildDir}/npm")
|
||||
// Do not declare the repository.
|
||||
distBaseUrl = null
|
||||
|
||||
}
|
||||
|
||||
// python is required by the root project to apply python formatters like isort or black.
|
||||
// python is required by the root project to run CAT tests for connectors
|
||||
python {
|
||||
envPath = '.venv'
|
||||
minPythonVersion = '3.10' // should be 3.10 for local development
|
||||
@@ -149,12 +95,10 @@ python {
|
||||
|
||||
scope = 'VIRTUALENV'
|
||||
installVirtualenv = true
|
||||
// black and isort are required for formatting
|
||||
pip 'black:22.3.0'
|
||||
pip 'isort:5.6.4'
|
||||
// poetry is required for installing and running airbyte-ci
|
||||
pip 'poetry:1.5.1'
|
||||
}
|
||||
|
||||
def cleanPythonVenv = rootProject.tasks.register('cleanPythonVenv', Exec) {
|
||||
commandLine 'rm'
|
||||
args '-rf', "${rootProject.projectDir.absolutePath}/.venv"
|
||||
@@ -167,56 +111,10 @@ rootProject.tasks.named('clean').configure {
|
||||
allprojects {
|
||||
|
||||
def createFormatTarget = { pattern ->
|
||||
// We are the spotless exclusions rules using file tree. It seems the excludeTarget option is super finicky in a
|
||||
// monorepo setup and it doesn't actually exclude directories reliably.
|
||||
// This code makes the behavior predictable.
|
||||
ArrayList<String> excludes = [
|
||||
'.gradle',
|
||||
'node_modules',
|
||||
'.eggs',
|
||||
'.mypy_cache',
|
||||
'.venv',
|
||||
'*.egg-info',
|
||||
'build',
|
||||
'dbt-project-template',
|
||||
'dbt-project-template-mssql',
|
||||
'dbt-project-template-mysql',
|
||||
'dbt-project-template-oracle',
|
||||
'dbt-project-template-clickhouse',
|
||||
'dbt-project-template-snowflake',
|
||||
'dbt-project-template-tidb',
|
||||
'dbt-project-template-duckdb',
|
||||
'dbt_test_config',
|
||||
'normalization_test_output',
|
||||
'tools',
|
||||
'secrets',
|
||||
'charts', // Helm charts often have injected template strings that will fail general linting. Helm linting is done separately.
|
||||
'resources/seed/*_catalog.json', // Do not remove - this is also necessary to prevent diffs in our github workflows
|
||||
'resources/seed/*_registry.json', // Do not remove - this is also necessary to prevent diffs in our github workflows
|
||||
'resources/seed/specs_secrets_mask.yaml', // Downloaded externally.
|
||||
'resources/examples/airflow/superset/docker/pythonpath_dev/superset_config.py',
|
||||
'source-amplitude/unit_tests/api_data/zipped.json', // Zipped file presents as non-UTF-8 making spotless sad
|
||||
'airbyte-connector-builder-server/connector_builder/generated', // autogenerated code doesn't need to be formatted
|
||||
'airbyte-ci/connectors/metadata_service/lib/tests/fixtures/**/invalid', // These are deliberately invalid and unformattable.
|
||||
'__init__.py',
|
||||
'declarative_component_schema.py',
|
||||
'source-stock-ticker-api-tutorial/source.py',
|
||||
'tools/git_hooks/tests/test_spec_linter.py',
|
||||
'tools/schema_generator/schema_generator/infer_schemas.py',
|
||||
'**/build', // Ignore new build files as well as the ones ignored when running this through airbyte-ci
|
||||
'.gradle' // Ignore the gradle version that is downloaded in the container
|
||||
]
|
||||
// Ensure that the excludes work when we're already partly in their path.
|
||||
excludes.addAll excludes.collectMany {
|
||||
it.startsWith("${project.name}/") ? [it, it.substring("${project.name}/".length())] : [it]
|
||||
}
|
||||
// Prefix everything with double-globs because we only care about path suffixes.
|
||||
excludes = excludes.collect { "**/${it}" }
|
||||
// Remove whatever's covered by the project's subprojects, so that each file is targeted by at most one task.
|
||||
def currentProject = project
|
||||
project.subprojects {
|
||||
if (it.parent.projectDir == currentProject.projectDir) {
|
||||
excludes.add "${it.projectDir}/**"
|
||||
}
|
||||
}
|
||||
// Build the FileTree.
|
||||
return fileTree(dir: projectDir, include: pattern, exclude: excludes)
|
||||
}
|
||||
@@ -230,7 +128,6 @@ allprojects {
|
||||
target javaTarget
|
||||
importOrder()
|
||||
eclipse('4.21').configFile(rootProject.file('tools/gradle/codestyle/java-google-style.xml'))
|
||||
licenseHeaderFile createJavaLicenseWith(rootProject.file('LICENSE_SHORT'))
|
||||
removeUnusedImports()
|
||||
trimTrailingWhitespace()
|
||||
}
|
||||
@@ -241,118 +138,17 @@ allprojects {
|
||||
target groovyGradleTarget
|
||||
}
|
||||
}
|
||||
def sqlTarget = createFormatTarget('**/*.sql')
|
||||
if (!sqlTarget.isEmpty()) {
|
||||
sql {
|
||||
target sqlTarget
|
||||
dbeaver().configFile(rootProject.file('tools/gradle/codestyle/sql-dbeaver.properties'))
|
||||
}
|
||||
}
|
||||
def stylingTarget = createFormatTarget(['**/*.yaml', '**/*.yml', '**/*.json'])
|
||||
if (!stylingTarget.isEmpty()) {
|
||||
format 'styling', {
|
||||
target stylingTarget
|
||||
def npmPath = "${rootProject.tasks.named('npmSetup').get().npmDir.get()}/bin/npm"
|
||||
def nodePath = "${rootProject.tasks.named('nodeSetup').get().nodeDir.get()}/bin/node"
|
||||
prettier().npmExecutable(npmPath).nodeExecutable(nodePath)
|
||||
}
|
||||
}
|
||||
}
|
||||
tasks.matching { it.name =~ /spotless.*/ }.configureEach {
|
||||
dependsOn tasks.matching { it.name == 'generate' }
|
||||
}
|
||||
tasks.matching { it.name =~ /spotlessStyling.*/ }.configureEach {
|
||||
dependsOn rootProject.tasks.named('nodeSetup')
|
||||
dependsOn rootProject.tasks.named('npmSetup')
|
||||
}
|
||||
// TODO: remove this once the CI routinely enforces formatting checks.
|
||||
tasks.matching { it.name =~ /spotless.*Check/ }.configureEach {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
// python license header generation is part of 'format'
|
||||
def pythonTarget = createFormatTarget('**/*.py')
|
||||
if (!project.name.endsWith('source-stock-ticker-api-tutorial') && !pythonTarget.isEmpty()) {
|
||||
|
||||
apply plugin: 'com.github.hierynomus.license'
|
||||
|
||||
license {
|
||||
header rootProject.file("LICENSE_SHORT")
|
||||
}
|
||||
|
||||
// Disable auto-generated java tasks, we rely on spotless there.
|
||||
tasks.matching { it.name =~ /license.*/ }.configureEach {
|
||||
if (rootProject.ext.skipSlowTests) {
|
||||
// Format checks should be run via airbyte-ci.
|
||||
tasks.matching { it.name =~ /spotless.*Check/ }.configureEach {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
def licensePythonCheck = tasks.register('licensePythonCheck', LicenseCheck) {
|
||||
header = createPythonLicenseWith(rootProject.file('LICENSE_SHORT'))
|
||||
source = pythonTarget
|
||||
strictCheck = true
|
||||
}
|
||||
licensePythonCheck.configure {
|
||||
dependsOn tasks.matching { it.name == 'generate' }
|
||||
}
|
||||
def licensePythonFormat = tasks.register('licensePythonFormat', LicenseFormat) {
|
||||
header = createPythonLicenseWith(rootProject.file('LICENSE_SHORT'))
|
||||
source = pythonTarget
|
||||
strictCheck = true
|
||||
}
|
||||
licensePythonFormat.configure {
|
||||
dependsOn tasks.matching { it.name == 'generate' }
|
||||
}
|
||||
|
||||
def registerPythonFormatTask = {
|
||||
String taskName, String moduleName, String settingsFileFlagName, String... extraArgs ->
|
||||
def task = tasks.register(taskName, Exec) {
|
||||
workingDir projectDir
|
||||
commandLine rootProject.file('.venv/bin/python')
|
||||
args "-m", moduleName, settingsFileFlagName, rootProject.file('pyproject.toml').absolutePath
|
||||
args extraArgs
|
||||
pythonTarget.getFiles().forEach {
|
||||
args projectDir.relativePath(it)
|
||||
}
|
||||
}
|
||||
task.configure {
|
||||
dependsOn rootProject.tasks.named('pipInstall')
|
||||
dependsOn tasks.matching { it.name == 'generate' }
|
||||
}
|
||||
return task
|
||||
}
|
||||
|
||||
def isortPythonCheck = registerPythonFormatTask('isortPythonCheck', 'isort', '--settings-file', '--check-only')
|
||||
isortPythonCheck.configure {
|
||||
dependsOn licensePythonCheck
|
||||
}
|
||||
def isortPythonFormat = registerPythonFormatTask('isortPythonFormat', 'isort', '--settings-file')
|
||||
isortPythonFormat.configure {
|
||||
dependsOn licensePythonFormat
|
||||
}
|
||||
|
||||
def blackPythonCheck = registerPythonFormatTask('blackPythonCheck', 'black', '--config', '--check')
|
||||
blackPythonCheck.configure {
|
||||
dependsOn licensePythonCheck
|
||||
dependsOn isortPythonCheck
|
||||
}
|
||||
def blackPythonFormat = registerPythonFormatTask('blackPythonFormat', 'black', '--config')
|
||||
blackPythonFormat.configure {
|
||||
dependsOn licensePythonFormat
|
||||
dependsOn isortPythonFormat
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register('format') {
|
||||
dependsOn tasks.matching { it.name == 'generate' }
|
||||
dependsOn tasks.matching { it.name =~ /spotless.*Apply/ }
|
||||
dependsOn tasks.matching { it.name =~ /.*PythonFormat/ }
|
||||
}
|
||||
tasks.named('check').configure {
|
||||
dependsOn tasks.matching { it.name == 'licensePythonCheck' }
|
||||
dependsOn tasks.matching { it.name == 'isortPythonCheck' }
|
||||
dependsOn tasks.matching { it.name == 'blackPythonCheck' }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def getCDKTargetVersion() {
|
||||
def props = new Properties()
|
||||
file("airbyte-cdk/java/airbyte-cdk/src/main/resources/version.properties").withInputStream { props.load(it) }
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
|
||||
|
||||
plugins {
|
||||
id "org.openapi.generator" version "5.3.1"
|
||||
id 'airbyte-python'
|
||||
id 'airbyte-docker-legacy'
|
||||
}
|
||||
|
||||
def generateApiClient = tasks.register('generateApiClient', GenerateTask) {
|
||||
inputSpec = "$rootDir.absolutePath/airbyte-cdk/java/airbyte-cdk/airbyte-api/src/main/openapi/config.yaml"
|
||||
outputDir = "$buildDir/airbyte_api_client"
|
||||
|
||||
generatorName = "python"
|
||||
packageName = "airbyte_api_client"
|
||||
}
|
||||
tasks.register('generate').configure {
|
||||
dependsOn generateApiClient
|
||||
}
|
||||
|
||||
tasks.named('installReqs').configure {
|
||||
dependsOn generateApiClient
|
||||
}
|
||||
140
poetry.lock
generated
Normal file
140
poetry.lock
generated
Normal file
@@ -0,0 +1,140 @@
|
||||
# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "black"
|
||||
version = "22.3.0"
|
||||
description = "The uncompromising code formatter."
|
||||
optional = false
|
||||
python-versions = ">=3.6.2"
|
||||
files = [
|
||||
{file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"},
|
||||
{file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"},
|
||||
{file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"},
|
||||
{file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"},
|
||||
{file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"},
|
||||
{file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"},
|
||||
{file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"},
|
||||
{file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"},
|
||||
{file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"},
|
||||
{file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"},
|
||||
{file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"},
|
||||
{file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"},
|
||||
{file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"},
|
||||
{file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"},
|
||||
{file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"},
|
||||
{file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"},
|
||||
{file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"},
|
||||
{file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"},
|
||||
{file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"},
|
||||
{file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"},
|
||||
{file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"},
|
||||
{file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
|
||||
{file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
click = ">=8.0.0"
|
||||
mypy-extensions = ">=0.4.3"
|
||||
pathspec = ">=0.9.0"
|
||||
platformdirs = ">=2"
|
||||
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
||||
|
||||
[package.extras]
|
||||
colorama = ["colorama (>=0.4.3)"]
|
||||
d = ["aiohttp (>=3.7.4)"]
|
||||
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||
uvloop = ["uvloop (>=0.15.2)"]
|
||||
|
||||
[[package]]
|
||||
name = "click"
|
||||
version = "8.1.7"
|
||||
description = "Composable command line interface toolkit"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
|
||||
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
version = "0.4.6"
|
||||
description = "Cross-platform colored terminal text."
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
|
||||
files = [
|
||||
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
|
||||
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "isort"
|
||||
version = "5.6.4"
|
||||
description = "A Python utility / library to sort Python imports."
|
||||
optional = false
|
||||
python-versions = ">=3.6,<4.0"
|
||||
files = [
|
||||
{file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"},
|
||||
{file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
colors = ["colorama (>=0.4.3,<0.5.0)"]
|
||||
pipfile-deprecated-finder = ["pipreqs", "requirementslib"]
|
||||
requirements-deprecated-finder = ["pip-api", "pipreqs"]
|
||||
|
||||
[[package]]
|
||||
name = "mypy-extensions"
|
||||
version = "1.0.0"
|
||||
description = "Type system extensions for programs checked with the mypy type checker."
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
files = [
|
||||
{file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
|
||||
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pathspec"
|
||||
version = "0.11.2"
|
||||
description = "Utility library for gitignore style pattern matching of file paths."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"},
|
||||
{file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "3.11.0"
|
||||
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"},
|
||||
{file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "tomli"
|
||||
version = "2.0.1"
|
||||
description = "A lil' TOML parser"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
|
||||
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
|
||||
]
|
||||
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "~3.10"
|
||||
content-hash = "352be223e781ec8ab7dc7326b50ba69733b74792f65832f00f185a102785caf4"
|
||||
@@ -1,3 +1,16 @@
|
||||
[tool.poetry]
|
||||
name = "airbyte"
|
||||
version = "0.1.0"
|
||||
description = "Airbyte open source connector code"
|
||||
authors = ["Airbyte <contact@airbyte.io>"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "~3.10"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
isort = "5.6.4"
|
||||
black = "~22.3.0"
|
||||
|
||||
[tool.black]
|
||||
line-length = 140
|
||||
target-version = ["py37"]
|
||||
|
||||
@@ -160,7 +160,6 @@ if (isCiServer || isAirbyteCI) {
|
||||
rootProject.name = 'airbyte'
|
||||
|
||||
include ':tools:code-generator'
|
||||
include ':octavia-cli'
|
||||
|
||||
include ':airbyte-cdk:python'
|
||||
include ':airbyte-cdk:java:airbyte-cdk'
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# case of the keywords (UPPER, LOWER or ORIGINAL)
|
||||
sql.formatter.keyword.case=UPPER
|
||||
# Statement delimiter
|
||||
sql.formatter.statement.delimiter=;
|
||||
# Indentation style (space or tab)
|
||||
sql.formatter.indent.type=space
|
||||
# Number of identation characters
|
||||
sql.formatter.indent.size=4
|
||||
Reference in New Issue
Block a user