diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index a2ad4da69..000000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,37 +0,0 @@ -[bumpversion] -current_version = 1.7.0a1 -parse = (?P[\d]+) # major version number - \.(?P[\d]+) # minor version number - \.(?P[\d]+) # patch version number - (?P # optional pre-release - ex: a1, b2, rc25 - (?Pa|b|rc) # pre-release type - (?P[\d]+) # pre-release version number - )? - ( # optional nightly release indicator - \.(?Pdev[0-9]+) # ex: .dev02142023 - )? # expected matches: `1.15.0`, `1.5.0a11`, `1.5.0a1.dev123`, `1.5.0.dev123457`, expected failures: `1`, `1.5`, `1.5.2-a1`, `text1.5.0` -serialize = - {major}.{minor}.{patch}{prekind}{num}.{nightly} - {major}.{minor}.{patch}.{nightly} - {major}.{minor}.{patch}{prekind}{num} - {major}.{minor}.{patch} -commit = False -tag = False - -[bumpversion:part:prekind] -first_value = a -optional_value = final -values = - a - b - rc - final - -[bumpversion:part:num] -first_value = 1 - -[bumpversion:part:nightly] - -[bumpversion:file:setup.py] - -[bumpversion:file:dbt/adapters/snowflake/__version__.py] diff --git a/.flake8 b/.flake8 deleted file mode 100644 index b08ffcd53..000000000 --- a/.flake8 +++ /dev/null @@ -1,16 +0,0 @@ -[flake8] -select = - E - W - F -ignore = - # makes Flake8 work like black - W503, - W504, - # makes Flake8 work like black - E203, - E741, - E501, -exclude = test -per-file-ignores = - */__init__.py: F401 diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 866c20b07..c551af119 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -89,7 +89,6 @@ jobs: snowflake: - 'dbt/**' - 'tests/**' - - 'dev-requirements.txt' - name: Generate integration test matrix id: generate-matrix uses: actions/github-script@v6 @@ -155,7 +154,7 @@ jobs: - name: Install python dependencies run: | python -m pip install --user --upgrade pip - python -m pip install tox + python -m pip install ".[test]" python -m pip --version tox --version diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a0d1ba6cb..e2e6d9b03 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,7 +55,7 @@ jobs: - name: Install python dependencies run: | python -m pip install --user --upgrade pip - python -m pip install -r dev-requirements.txt + python -m pip install ".[dev]" python -m pip --version pre-commit --version mypy --version @@ -92,7 +92,7 @@ jobs: - name: Install python dependencies run: | python -m pip install --user --upgrade pip - python -m pip install tox + python -m pip install ".[test]" python -m pip --version tox --version @@ -132,7 +132,6 @@ jobs: - name: Install python dependencies run: | python -m pip install --user --upgrade pip - python -m pip install --upgrade setuptools wheel twine check-wheel-contents python -m pip --version - name: Build distributions @@ -185,7 +184,6 @@ jobs: - name: Install python dependencies run: | python -m pip install --user --upgrade pip - python -m pip install --upgrade wheel python -m pip --version - uses: actions/download-artifact@v3 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3d80b955c..866605a97 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,63 +1,32 @@ -# For more on configuring pre-commit hooks (see https://pre-commit.com/) - -# Force all unspecified python hooks to run python 3.8 default_language_version: - python: python3 + python: python3 repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 - hooks: - - id: check-yaml - args: [--unsafe] - - id: check-json - - id: end-of-file-fixer - - id: trailing-whitespace - - id: check-case-conflict -- repo: https://github.com/psf/black - rev: 23.1.0 - hooks: - - id: black - additional_dependencies: ['click~=8.1'] - args: - - "--line-length=99" - - "--target-version=py38" - - id: black - alias: black-check - stages: [manual] - additional_dependencies: ['click~=8.1'] - args: - - "--line-length=99" - - "--target-version=py38" - - "--check" - - "--diff" -- repo: https://github.com/pycqa/flake8 - rev: 6.0.0 - hooks: - - id: flake8 - - id: flake8 - alias: flake8-check - stages: [manual] -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.1.1 - hooks: - - id: mypy - # N.B.: Mypy is... a bit fragile. - # - # By using `language: system` we run this hook in the local - # environment instead of a pre-commit isolated one. This is needed - # to ensure mypy correctly parses the project. - - # It may cause trouble in that it adds environmental variables out - # of our control to the mix. Unfortunately, there's nothing we can - # do about per pre-commit's author. - # See https://github.com/pre-commit/pre-commit/issues/730 for details. - args: [--show-error-codes, --ignore-missing-imports, --explicit-package-bases] - files: ^dbt/adapters/.* - language: system - - id: mypy - alias: mypy-check - stages: [manual] - args: [--show-error-codes, --pretty, --ignore-missing-imports, --explicit-package-bases] - files: ^dbt/adapters - language: system +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-yaml + args: [--unsafe] + - id: check-json + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-case-conflict +- repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + args: [--line-length=99, --target-version=py38, -v] +- repo: https://github.com/pycqa/flake8 + rev: 6.1.0 + hooks: + - id: flake8 +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.4.1 + hooks: + - id: mypy + args: [--show-error-codes, --ignore-missing-imports, --explicit-package-bases, --pretty] + # By using `language: system` we run this hook in the local + # environment instead of a pre-commit isolated one. + # This is needed to ensure mypy correctly parses the project. + # See https://github.com/pre-commit/pre-commit/issues/730 for details. + language: system diff --git a/Makefile b/Makefile index c8f682a1c..2a948ec28 100644 --- a/Makefile +++ b/Makefile @@ -2,65 +2,33 @@ .PHONY: dev dev: ## Installs adapter in develop mode along with development dependencies - @\ - pip install -e . -r dev-requirements.txt && pre-commit install + @pip install -e ".[dev,test]" && pre-commit install .PHONY: dev-uninstall dev-uninstall: ## Uninstalls all packages while maintaining the virtual environment - ## Useful when updating versions, or if you accidentally installed into the system interpreter - pip freeze | grep -v "^-e" | cut -d "@" -f1 | xargs pip uninstall -y - pip uninstall -y dbt-snowflake - -.PHONY: mypy -mypy: ## Runs mypy against staged changes for static type checking. - @\ - pre-commit run --hook-stage manual mypy-check | grep -v "INFO" - -.PHONY: flake8 -flake8: ## Runs flake8 against staged changes to enforce style guide. - @\ - pre-commit run --hook-stage manual flake8-check | grep -v "INFO" - -.PHONY: black -black: ## Runs black against staged changes to enforce style guide. - @\ - pre-commit run --hook-stage manual black-check -v | grep -v "INFO" + @pip freeze | grep -v "^-e" | cut -d "@" -f1 | xargs pip uninstall -y + @pip uninstall -y dbt-snowflake .PHONY: lint -lint: ## Runs flake8 and mypy code checks against staged changes. - @\ - pre-commit run flake8-check --hook-stage manual | grep -v "INFO"; \ - pre-commit run mypy-check --hook-stage manual | grep -v "INFO" - -.PHONY: linecheck -linecheck: ## Checks for all Python lines 100 characters or more - @\ - find dbt -type f -name "*.py" -exec grep -I -r -n '.\{100\}' {} \; +lint: ## Runs flake8 and mypy code checks against staged changes + @pre-commit run black | grep -v "INFO" + @pre-commit run flake8 | grep -v "INFO" + @pre-commit run mypy | grep -v "INFO" .PHONY: unit -unit: ## Runs unit tests with py38. - @\ - tox -e py38 - -.PHONY: test -test: ## Runs unit tests with py38 and code checks against staged changes. - @\ - tox -p -e py38; \ - pre-commit run black-check --hook-stage manual | grep -v "INFO"; \ - pre-commit run flake8-check --hook-stage manual | grep -v "INFO"; \ - pre-commit run mypy-check --hook-stage manual | grep -v "INFO" +unit: ## Runs unit tests with py38 + @tox -e py38 .PHONY: integration -integration: ## Runs snowflake integration tests with py38. - @\ - tox -e py38-snowflake -- +integration: ## Runs snowflake integration tests with py38 + @tox -e py38-snowflake -- .PHONY: clean - @echo "cleaning repo" - @git clean -f -X +clean: ## Remove all untracked files, but keep the credentials file + @git clean -X -n --exclude="!test.env" .PHONY: help -help: ## Show this help message. +help: ## Show this help message @echo 'usage: make [target]' @echo @echo 'targets:' @@ -68,30 +36,20 @@ help: ## Show this help message. .PHONY: ubuntu-py38 ubuntu-py38: - docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py38 . --build-arg version=3.8 - docker run --rm -it --name dbt-snowflake-ubuntu-py38 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py38 + @docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py38 . --build-arg version=3.8 + @docker run --rm -it --name dbt-snowflake-ubuntu-py38 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py38 .PHONY: ubuntu-py39 ubuntu-py39: - docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py39 . --build-arg version=3.9 - docker run --rm -it --name dbt-snowflake-ubuntu-py39 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py39 + @docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py39 . --build-arg version=3.9 + @docker run --rm -it --name dbt-snowflake-ubuntu-py39 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py39 .PHONY: ubuntu-py310 ubuntu-py310: - docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py310 . --build-arg version=3.10 - docker run --rm -it --name dbt-snowflake-ubuntu-py310 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py310 + @docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py310 . --build-arg version=3.10 + @docker run --rm -it --name dbt-snowflake-ubuntu-py310 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py310 .PHONY: ubuntu-py311 ubuntu-py311: - docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py311 . --build-arg version=3.11 - docker run --rm -it --name dbt-snowflake-ubuntu-py311 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py311 - -.PHONY: debian-py38 -debian-py38: - docker build -f docker/debian-py38.Dockerfile -t dbt-snowflake-debian-py38 . --build-arg version=3.8.15 - docker run --rm -it --name dbt-snowflake-debian-py38 -v $(shell pwd):/opt/code dbt-snowflake-debian-py38 - -.PHONY: dev-env-default -dev-env-default: - docker build -f docker/dev-env-default.Dockerfile -t dbt-snowflake-dev-env-default . - docker run --rm -it --name dbt-snowflake-dev-env-default -v $(shell pwd):/opt/code dbt-snowflake-dev-env-default + @docker build -f docker_dev/ubuntu.Dockerfile -t dbt-snowflake-ubuntu-py311 . --build-arg version=3.11 + @docker run --rm -it --name dbt-snowflake-ubuntu-py311 -v $(shell pwd):/opt/code dbt-snowflake-ubuntu-py311 diff --git a/dbt/adapters/snowflake/__version__.py b/dbt/adapters/snowflake/__version__.py deleted file mode 100644 index 874bd74c8..000000000 --- a/dbt/adapters/snowflake/__version__.py +++ /dev/null @@ -1 +0,0 @@ -version = "1.7.0a1" diff --git a/dev-requirements.txt b/dev-requirements.txt deleted file mode 100644 index 7307379ec..000000000 --- a/dev-requirements.txt +++ /dev/null @@ -1,30 +0,0 @@ -# install latest changes in dbt-core -# TODO: how to automate switching from develop to version branches? -git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-core&subdirectory=core -git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-tests-adapter&subdirectory=tests/adapter - -# if version 1.x or greater -> pin to major version -# if version 0.x -> pin to minor -black~=23.7 -bumpversion~=0.6.0 -click~=8.1 -ddtrace~=1.17 -flake8~=6.1 -flaky~=3.7 -freezegun~=1.2 -ipdb~=0.13.13 -mypy==1.4.1 # patch updates have historically introduced breaking changes -pip-tools~=7.2 -pre-commit~=3.3 -pre-commit-hooks~=4.4 -pytest~=7.4 -pytest-csv~=3.0 -pytest-dotenv~=0.5.2 -pytest-logbook~=1.2 -pytest-xdist~=3.3 -pytz~=2023.3 -tox~=4.6 -types-pytz~=2023.3 -types-requests~=2.31 -twine~=4.0 -wheel~=0.41 diff --git a/docker_dev/debian.Dockerfile b/docker_dev/debian.Dockerfile deleted file mode 100644 index 9c3415be5..000000000 --- a/docker_dev/debian.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM debian:latest - -# default to py3.11.1, this can be overridden at build, e.g. `docker build ... --build-arg version=3.10.8` -ARG version=3.11.1 - -# install python dependencies -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - build-essential \ - zlib1g-dev \ - libncurses5-dev \ - libgdbm-dev \ - libnss3-dev \ - libssl-dev \ - libreadline-dev \ - libffi-dev \ - libsqlite3-dev \ - wget \ - libbz2-dev \ - git-all - -# download, extract, and install python -RUN wget https://www.python.org/ftp/python/$version/Python-$version.tgz && \ - tar -xvf Python-$version.tgz && \ - cd Python-$version && \ - ./configure --enable-optimizations && \ - make -j $(shell nproc) && \ - make altinstall - -# clean up -RUN apt-get clean && \ - rm -rf \ - /var/lib/apt/lists/* \ - /tmp/* \ - /var/tmp/* \ - /Python-$version.tgz - -# add this installation to the path and update the default system interpreter to the newly installed version -RUN export PATH="/Python-$version:$PATH" && \ - update-alternatives --install /usr/bin/python3 python3 /Python-$version/python 1 - -# update python build tools -RUN python3 -m pip install --upgrade pip setuptools wheel --no-cache-dir - -# setup mount for our code -WORKDIR /opt/code -VOLUME /opt/code - -ENV PYTHONUNBUFFERED=1 diff --git a/docker_dev/dev-env-default.Dockerfile b/docker_dev/dev-env-default.Dockerfile deleted file mode 100644 index ed90889a7..000000000 --- a/docker_dev/dev-env-default.Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM docker/dev-environments-default:latest - -# install python and git (for installing dbt-core) -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - python3-pip \ - python3-wheel \ - build-essential - -# clean up -RUN apt-get clean && \ - rm -rf \ - /var/lib/apt/lists/* \ - /tmp/* \ - /var/tmp/* - -# update python build tools -RUN python3 -m pip install --upgrade pip setuptools wheel --no-cache-dir - -# setup mount for our code -WORKDIR /opt/code -VOLUME /opt/code - -# send stdout/stderr to terminal -ENV PYTHONUNBUFFERED=1 diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index b6e603581..000000000 --- a/mypy.ini +++ /dev/null @@ -1,2 +0,0 @@ -[mypy] -namespace_packages = True diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..b98019fdf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,87 @@ +[build-system] +requires = [ + "check-wheel-contents", + "setuptools", + "twine", + "wheel", +] +build-backend = "setuptools.build_meta" + +[project] +name = "dbt-snowflake" +version = "1.7.0a1" +description = "The Snowflake adapter plugin for dbt" +readme = "README.md" +requires-python = ">=3.8" +license = {file = "LICENSE.md"} +authors = [{name = "dbt Labs", email = "info@dbtlabs.com" }] +classifiers = [ # Optional + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: Apache Software License", + "Operating System :: Microsoft :: Windows", + "Operating System :: MacOS :: MacOS X", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", +] +urls.Homepage = "https://github.com/dbt-labs/dbt-snowflake" +urls."Bug Reports" = "https://github.com/dbt-labs/dbt-snowflake/issues" +urls.Docs = "https://docs.getdbt.com/docs/core/connect-data-platform/snowflake-setup" +dependencies = [ + "dbt-core~=1.7.0a1", + "snowflake-connector-python[secure-local-storage]~=3.0", + # installed via dbt-core but referenced directly; don't pin to avoid version conflicts with dbt-core + "agate", +] +optional-dependencies.dev = [ + "dbt-core@git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-core&subdirectory=core", + "dbt-tests-adapter@git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-tests-adapter&subdirectory=tests/adapter", + "black~=23.1.0", + "click", + "flake8", + "flaky", + "ipdb", + "mypy~=1.0", + "pip-tools", + "pre-commit", + "pre-commit-hooks", + "pytz", + "types-pytz", + "types-requests", +] +optional-dependencies.test = [ + "dbt-core@git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-core&subdirectory=core", + "dbt-tests-adapter@git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-tests-adapter&subdirectory=tests/adapter", + "ddtrace", + "freezegun", + "pytest", + "pytest-csv", + "pytest-dotenv", + "pytest-logbook", + "pytest-xdist", + "tox~=4.0", +] + +[tool.black] +line-length = 99 +target-version = ["py38"] + +[tool.mypy] +explicit_package_bases = true +ignore_missing_imports = true +pretty = true +show_error_codes = true + +[tool.pytest] +filterwarnings = [ + "ignore:.*'soft_unicode' has been renamed to 'soft_str'*:DeprecationWarning", + "ignore:unclosed file .*:ResourceWarning", +] +env_files = "test.env" +testpaths = ["tests/unit", "tests/functional"] +addopts = "-v -n4 --color=yes" + +[tool.setuptools.packages.find] +include = ["dbt", "dbt.*"] diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index b04a6ccf3..000000000 --- a/pytest.ini +++ /dev/null @@ -1,10 +0,0 @@ -[pytest] -filterwarnings = - ignore:.*'soft_unicode' has been renamed to 'soft_str'*:DeprecationWarning - ignore:unclosed file .*:ResourceWarning -env_files = - test.env -testpaths = - tests/unit - tests/integration - tests/functional diff --git a/tox.ini b/setup.cfg similarity index 51% rename from tox.ini rename to setup.cfg index bbea5b254..d45c2e803 100644 --- a/tox.ini +++ b/setup.cfg @@ -1,29 +1,47 @@ -[tox] +[flake8] +select = + E + W + F +ignore = + # makes Flake8 work like black + W503, + W504, + # makes Flake8 work like black + E203, + E741, + E501, +exclude = test +per-file-ignores = + */__init__.py: F401 + + +[tox:tox] skipsdist = True envlist = py38,py39,py310,py311 [testenv:{unit,py38,py39,py310,py311,py}] description = unit testing -skip_install = true +# skip_install = true +use_develop = true +download = true passenv = DBT_* PYTEST_ADDOPTS commands = {envpython} -m pytest {posargs} tests/unit -deps = - -rdev-requirements.txt - -e. +extras = test [testenv:{integration,py38,py39,py310,py311,py}-{snowflake}] -description = adapter plugin integration testing -skip_install = true +description = integration testing +# skip_install = true +use_develop = true +download = true passenv = DBT_* - SNOWFLAKE_TEST_* PYTEST_ADDOPTS + SNOWFLAKE_TEST_* DD_SERVICE DD_ENV commands = snowflake: {envpython} -m pytest {posargs} tests/functional -deps = - -rdev-requirements.txt - -e. +extras = test diff --git a/setup.py b/setup.py deleted file mode 100644 index ffa9264c3..000000000 --- a/setup.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -import os -import sys -import re - -# require python 3.8 or newer -if sys.version_info < (3, 8): - print("Error: dbt does not support this version of Python.") - print("Please upgrade to Python 3.8 or higher.") - sys.exit(1) - - -# require version of setuptools that supports find_namespace_packages -from setuptools import setup - -try: - from setuptools import find_namespace_packages -except ImportError: - # the user has a downlevel version of setuptools. - print("Error: dbt requires setuptools v40.1.0 or higher.") - print('Please upgrade setuptools with "pip install --upgrade setuptools" ' "and try again") - sys.exit(1) - - -# pull long description from README -this_directory = os.path.abspath(os.path.dirname(__file__)) -with open(os.path.join(this_directory, "README.md")) as f: - long_description = f.read() - - -# get this package's version from dbt/adapters//__version__.py -def _get_plugin_version_dict(): - _version_path = os.path.join(this_directory, "dbt", "adapters", "snowflake", "__version__.py") - _semver = r"""(?P\d+)\.(?P\d+)\.(?P\d+)""" - _pre = r"""((?Pa|b|rc)(?P
\d+))?"""
-    _nightly = r"""(\.(?P[a-z0-9]+)?)?"""
-    _version_pattern = rf"""version\s*=\s*["']{_semver}{_pre}{_nightly}["']"""
-    with open(_version_path) as f:
-        match = re.search(_version_pattern, f.read().strip())
-        if match is None:
-            raise ValueError(f"invalid version at {_version_path}")
-        return match.groupdict()
-
-
-# require a compatible minor version (~=), prerelease if this is a prerelease
-def _get_dbt_core_version():
-    parts = _get_plugin_version_dict()
-    minor = "{major}.{minor}.0".format(**parts)
-    pre = parts["prekind"] + "1" if parts["prekind"] else ""
-    return f"{minor}{pre}"
-
-
-package_name = "dbt-snowflake"
-package_version = "1.7.0a1"
-dbt_core_version = _get_dbt_core_version()
-description = """The Snowflake adapter plugin for dbt"""
-
-setup(
-    name=package_name,
-    version=package_version,
-    description=description,
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    author="dbt Labs",
-    author_email="info@dbtlabs.com",
-    url="https://github.com/dbt-labs/dbt-snowflake",
-    packages=find_namespace_packages(include=["dbt", "dbt.*"]),
-    include_package_data=True,
-    install_requires=[
-        "dbt-core~={}".format(dbt_core_version),
-        "snowflake-connector-python[secure-local-storage]~=3.0",
-        # installed via dbt-core but referenced directly; don't pin to avoid version conflicts with dbt-core
-        "agate",
-    ],
-    zip_safe=False,
-    classifiers=[
-        "Development Status :: 5 - Production/Stable",
-        "License :: OSI Approved :: Apache Software License",
-        "Operating System :: Microsoft :: Windows",
-        "Operating System :: MacOS :: MacOS X",
-        "Operating System :: POSIX :: Linux",
-        "Programming Language :: Python :: 3.8",
-        "Programming Language :: Python :: 3.8",
-        "Programming Language :: Python :: 3.9",
-        "Programming Language :: Python :: 3.10",
-        "Programming Language :: Python :: 3.11",
-    ],
-    python_requires=">=3.8",
-)