diff --git a/.dockerignore b/.dockerignore index 2e8e40bc6..2245fd0d9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,9 +6,8 @@ !karapace !go !requirements/*.txt -!setup.py -!version.py !README.rst +!pyproject.toml !container/start.sh !container/healthcheck.py diff --git a/.github/workflows/container-smoke-test.yml b/.github/workflows/container-smoke-test.yml index d0eeb8dfe..e17aa2641 100644 --- a/.github/workflows/container-smoke-test.yml +++ b/.github/workflows/container-smoke-test.yml @@ -13,11 +13,22 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v3 + # Need fetch-depth 0 to fetch tags, see https://github.com/actions/checkout/issues/701 + with: + fetch-depth: 0 - - name: Build karapace/version.py - run: python version.py + - name: Install requirements + run: pip install . - - name: Build and start services + - name: Resolve Karapace version + run: | + KARAPACE_VERSION=$(python -c "from karapace import version; print(version.__version__)") + echo KARAPACE_VERSION=$KARAPACE_VERSION >> $GITHUB_ENV + + - name: Build container + run: docker build --build-arg KARAPACE_VERSION=${{ env.KARAPACE_VERSION }} --file=container/Dockerfile . + + - name: Run container run: docker compose --file=container/compose.yml up --build --wait --detach - name: Smoke test registry diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d029ff9f2..ed98fc671 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,8 +26,6 @@ jobs: python-version: '3.12' - name: Install libsnappy-dev run: sudo apt install libsnappy-dev - # required for pylint - - run: make karapace/version.py - run: pip install pre-commit - uses: actions/cache@v3 with: @@ -45,6 +43,6 @@ jobs: python-version: '3.12' - name: Install libsnappy-dev run: sudo apt install libsnappy-dev - - run: pip install -r requirements/requirements.txt -r requirements/requirements-typing.txt - - run: make karapace/version.py + - name: Install requirements and typing requirements + run: pip install .[typing] - run: mypy diff --git a/.github/workflows/schema.yml b/.github/workflows/schema.yml index 6665ab235..851ed47f1 100644 --- a/.github/workflows/schema.yml +++ b/.github/workflows/schema.yml @@ -21,7 +21,8 @@ jobs: requirements.txt - name: Install libsnappy-dev run: sudo apt install libsnappy-dev - - run: make install + - name: Install requirements + - run: pip install . # Compare with latest release when running on main. - run: make schema against=$(git describe --abbrev=0 --tags) if: github.ref == 'refs/heads/main' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1df7f9ca8..5322b4d7e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -40,7 +40,7 @@ jobs: with: go-version: '1.21.0' - - run: make install version + - run: make install - run: make unit-tests env: COVERAGE_FILE: ".coverage.${{ matrix.python-version }}" @@ -73,6 +73,8 @@ jobs: steps: - uses: actions/checkout@v4 + - run: make install + - name: Download coverage id: download_coverage uses: actions/download-artifact@v4 @@ -80,8 +82,6 @@ jobs: pattern: coverage-* merge-multiple: true - - run: make karapace/version.py - - name: Post coverage comment id: post_coverage_comment uses: py-cov-action/python-coverage-comment-action@v3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c2a42844..c2aafcf1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,8 +19,8 @@ There is very little you need to get started coding for Karapace: ```python python -m venv source /bin/activate -pip install -r ./requirements/requirements-dev.txt -pip install -e . +pip install . +pip install -e .[dev,typing] ``` ## Website @@ -55,7 +55,6 @@ To run the tests use the binary `pytest` available in the virtualenv. It will do used in the tests for you: ```sh -make karapace/version.py pytest tests/unit pytest tests/integration ``` diff --git a/GNUmakefile b/GNUmakefile index 9d5c53a06..522e481e1 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -11,6 +11,14 @@ endif PYTHON_VERSION ?= 3.8 +define PIN_VERSIONS_COMMAND +pip install pip-tools && \ + python -m piptools compile -o /karapace/requirements/requirements.txt /karapace/pyproject.toml && \ + python -m piptools compile --extra dev -o /karapace/requirements/requirements-dev.txt /karapace/pyproject.toml && \ + python -m piptools compile --extra typing -o /karapace/requirements/requirements-typing.txt /karapace/pyproject.toml +endef + + export PATH := $(VENV_DIR)/bin:$(PATH) export PS4 := \e[0m\e[32m==> \e[0m export LC_ALL := C @@ -40,31 +48,23 @@ venv/.deps: requirements/requirements-dev.txt requirements/requirements.txt | ve source ./bin/get-protoc source ./bin/get-snappy set -x - $(PIP) install --use-pep517 -r '$(<)' - $(PIP) install --use-pep517 . + $(PIP) install --use-pep517 . .[dev] $(PIP) check touch '$(@)' - -karapace/version.py: - $(PYTHON) version.py - -.PHONY: version -version: venv/.make | karapace/version.py - .PHONY: test tests: unit-tests integration-tests .PHONY: unit-tests unit-tests: export PYTEST_ARGS ?= -unit-tests: karapace/version.py venv/.deps +unit-tests: venv/.deps rm -fr runtime/* $(PYTHON) -m pytest -s -vvv $(PYTEST_ARGS) tests/unit/ rm -fr runtime/* .PHONY: integration-tests unit-tests: export PYTEST_ARGS ?= -integration-tests: karapace/version.py venv/.deps +integration-tests: venv/.deps rm -fr runtime/* $(PYTHON) -m pytest -s -vvv $(PYTEST_ARGS) tests/integration/ rm -fr runtime/* @@ -84,12 +84,14 @@ cleanest: cleaner .PHONY: requirements requirements: export CUSTOM_COMPILE_COMMAND='make requirements' requirements: - pip install --upgrade pip setuptools pip-tools - cd requirements && pip-compile --upgrade --resolver=backtracking requirements.in -o requirements.txt - cd requirements && pip-compile --upgrade --resolver=backtracking requirements-dev.in -o requirements-dev.txt - cd requirements && pip-compile --upgrade --resolver=backtracking requirements-typing.in -o requirements-typing.txt + $(PIP) install --upgrade pip setuptools pip-tools + $(PIP) install .[dev,typing] .PHONY: schema schema: against := origin/main schema: - python3 -m karapace.backup.backends.v3.schema_tool --against=$(against) + $(PYTHON) -m karapace.backup.backends.v3.schema_tool --against=$(against) + +.PHONY: pin-requirements +pin-requirements: + docker run -e CUSTOM_COMPILE_COMMAND='make pin-requirements' -it -v .:/karapace --security-opt label=disable python:$(PYTHON_VERSION)-bullseye /bin/bash -c "$(PIN_VERSIONS_COMMAND)" diff --git a/MANIFEST.in b/MANIFEST.in index 0b55e5636..9a9525ac0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,9 +4,7 @@ include karapace.unit include tests/*.py include scripts/* include README.rst -include version.py -include setup.py -include setup.cfg +include pyproject.toml include LICENSE include MANIFEST.in include *.so diff --git a/README.rst b/README.rst index 650b17165..4d8992d0d 100644 --- a/README.rst +++ b/README.rst @@ -88,7 +88,7 @@ Source install Alternatively you can do a source install using:: - python setup.py install + pip install . Quickstart ========== @@ -651,7 +651,7 @@ If you don't need or want to have the Karapace images around you can now proceed Installed from Sources ---------------------- -If you installed Karapace from the sources via ``python setup.py install``, it can be uninstalled with the following ``pip`` command:: +Karapace is installed ``pip install .``, it can be uninstalled with the following ``pip`` command:: pip uninstall karapace @@ -695,11 +695,8 @@ targets that correctly clean the ``runtime`` directory without deleting it, but keep this in mind whenever you are not using ``make`` (e.g. running tests from your IDE). -Note that the pre-commit checks are currently not working with the default -Python version. This is because isort dropped Python 3.7 support. You have to -use at least Python 3.8 for the pre-commit checks. Use ``pipx`` or ``brew`` or -… to install pre-commit and use the global installation, there is also no -dependency on it. +Use ``pipx`` or ``brew`` to install ``pre-commit`` and use the global installation, +there is also no dependency on it. License ======= diff --git a/container/Dockerfile b/container/Dockerfile index 4fe2a46a5..efa862dff 100644 --- a/container/Dockerfile +++ b/container/Dockerfile @@ -26,8 +26,14 @@ RUN --mount=type=cache,target=/root/.cache/pip \ python3 -m pip install -r /build/requirements.txt COPY . /build/karapace-repo +WORKDIR /build/karapace-repo RUN --mount=type=cache,target=/root/.cache/pip \ - python3 -m pip install /build/karapace-repo + if [ -z "${KARAPACE_VERSION}" ]; then \ + PRETEND_VERSION="$(python -c 'from karapace import version; print(version.__version__)')"; \ + else \ + PRETEND_VERSION=$KARAPACE_VERSION; \ + fi; \ + SETUPTOOLS_SCM_PRETEND_VERSION=$PRETEND_VERSION python3 -m pip install --no-deps . # Karapace image, i.e. production. FROM python:3.10.11-slim-bullseye AS karapace diff --git a/pyproject.toml b/pyproject.toml index 7244d92f5..1ba1edcbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,114 @@ +[build-system] +requires = ["setuptools > 64", "setuptools-scm", "setuptools-golang"] +build-backend = "setuptools.build_meta" + +[project] +name = "karapace" +requires-python = ">= 3.8" +dynamic = ["version"] +readme = "README.rst" +license = {file = "LICENSE"} +dependencies = [ + "accept-types < 1", + "aiohttp < 4", + "aiokafka == 0.10.0", + "cachetools == 5.3.3", + "confluent-kafka == 2.4.0", + "isodate < 1", + "jsonschema < 5", + "lz4", + "networkx < 4", + "protobuf < 4", + "pyjwt >= 2.4.0 , < 3", + "python-dateutil < 3", + "python-snappy", + "rich ~= 13.7.1", + "tenacity < 10", + "typing-extensions", + "ujson < 6", + "watchfiles < 1", + "xxhash ~= 3.3", + "zstandard", + "prometheus-client == 0.20.0", + "yarl == 1.12.1", + + # Patched dependencies + # + # Note: It is important to use commits to reference patched dependencies. This + # has two advantages: + # - Reproducible builds + # - The contents of the file change, which invalidates the existing docker + # images and forces a new image generation. + # + "avro @ https://github.com/aiven/avro/archive/5a82d57f2a650fd87c819a30e433f1abb2c76ca2.tar.gz#subdirectory=lang/py", +] + +classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: Information Technology", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Database :: Database Engines/Servers", + "Topic :: Software Development :: Libraries", +] + +[project.scripts] +karapace = "karapace.karapace_all:main" +karapace_schema_backup = "karapace.backup.cli:main" +karapace_mkpasswd = "karapace.auth:main" + +[project.urls] +Homepage = "https://karapace.io" +Repository = "https://github.com/Aiven-Open/karapace/" +Issues = "https://github.com/Aiven-Open/karapace/issues" + +[project.optional-dependencies] +sentry-sdk = ["sentry-sdk>=1.6.0"] +ujson = ["ujson"] +dev = [ + # Developer QoL + "pdbpp", + + # testing + "filelock", + "hypothesis", + "psutil", + "pytest", + "pytest-cov", + "pytest-random-order", + "pytest-timeout", + "pytest-xdist[psutil]", + "requests", + + # performance test + "locust", + + # Sentry SDK + "sentry-sdk" +] +typing = [ + "mypy", + "sentry-sdk", + "types-cachetools", + "types-jsonschema", + "types-protobuf < 4" +] + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +include = ["karapace"] + +[tool.setuptools_scm] +version_file = "karapace/version.py" + [tool.black] target-version = ["py38"] line-length = 125 diff --git a/requirements/requirements-dev.in b/requirements/requirements-dev.in deleted file mode 100644 index b11b729cb..000000000 --- a/requirements/requirements-dev.in +++ /dev/null @@ -1,25 +0,0 @@ -# runtime requirements --r requirements.txt - -# Developer QoL -pdbpp - -# testing -filelock -pytest -pytest-cov -pytest-xdist[psutil] -pytest-timeout -pytest-random-order -psutil -requests -hypothesis - -# performance test -locust - -# Sentry SDK -sentry-sdk - -# Golang -setuptools-golang diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index 8a7f8ac58..849f7c38f 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -2,47 +2,39 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# 'make requirements' +# make pin-requirements # accept-types==0.4.1 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) aiohappyeyeballs==2.4.0 - # via - # -r requirements.txt - # aiohttp + # via aiohttp aiohttp==3.10.5 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) aiokafka==0.10.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) aiosignal==1.3.1 - # via - # -r requirements.txt - # aiohttp + # via aiohttp anyio==4.4.0 - # via - # -r requirements.txt - # watchfiles + # via watchfiles async-timeout==4.0.3 # via - # -r requirements.txt # aiohttp # aiokafka attrs==24.2.0 # via - # -r requirements.txt # aiohttp # hypothesis # jsonschema # referencing # wmctrl avro @ https://github.com/aiven/avro/archive/5a82d57f2a650fd87c819a30e433f1abb2c76ca2.tar.gz#subdirectory=lang/py - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) blinker==1.8.2 # via flask brotli==1.1.0 # via geventhttpclient cachetools==5.3.3 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) certifi==2024.7.4 # via # geventhttpclient @@ -55,16 +47,13 @@ click==8.1.7 configargparse==1.7 # via locust confluent-kafka==2.4.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) coverage[toml]==7.6.1 # via pytest-cov cramjam==2.8.3 - # via - # -r requirements.txt - # python-snappy + # via python-snappy exceptiongroup==1.2.2 # via - # -r requirements.txt # anyio # hypothesis # pytest @@ -73,7 +62,7 @@ execnet==2.1.1 fancycompleter==0.9.1 # via pdbpp filelock==3.15.4 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) flask==3.0.3 # via # flask-cors @@ -85,7 +74,6 @@ flask-login==0.6.3 # via locust frozenlist==1.4.1 # via - # -r requirements.txt # aiohttp # aiosignal gevent==24.2.1 @@ -97,10 +85,9 @@ geventhttpclient==2.0.12 greenlet==3.0.3 # via gevent hypothesis==6.111.2 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) idna==3.8 # via - # -r requirements.txt # anyio # requests # yarl @@ -108,136 +95,117 @@ importlib-metadata==8.4.0 # via flask importlib-resources==6.4.4 # via - # -r requirements.txt # jsonschema # jsonschema-specifications iniconfig==2.0.0 # via pytest isodate==0.6.1 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) itsdangerous==2.2.0 # via flask jinja2==3.1.4 # via flask jsonschema==4.23.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) jsonschema-specifications==2023.12.1 - # via - # -r requirements.txt - # jsonschema + # via jsonschema locust==2.25.0 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) lz4==4.3.3 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) markdown-it-py==3.0.0 - # via - # -r requirements.txt - # rich + # via rich markupsafe==2.1.5 # via # jinja2 # werkzeug mdurl==0.1.2 - # via - # -r requirements.txt - # markdown-it-py + # via markdown-it-py msgpack==1.0.8 # via locust multidict==6.0.5 # via - # -r requirements.txt # aiohttp # yarl networkx==3.1 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) packaging==24.1 # via - # -r requirements.txt # aiokafka # pytest pdbpp==0.10.3 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) pkgutil-resolve-name==1.3.10 - # via - # -r requirements.txt - # jsonschema + # via jsonschema pluggy==1.5.0 # via pytest prometheus-client==0.20.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) protobuf==3.20.3 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) psutil==6.0.0 # via - # -r requirements-dev.in + # karapace (/karapace/pyproject.toml) # locust # pytest-xdist pygments==2.18.0 # via - # -r requirements.txt # pdbpp # rich pyjwt==2.9.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) pyrepl==0.9.0 # via fancycompleter pytest==8.3.2 # via - # -r requirements-dev.in + # karapace (/karapace/pyproject.toml) # pytest-cov # pytest-random-order # pytest-timeout # pytest-xdist pytest-cov==5.0.0 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) pytest-random-order==1.1.1 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) pytest-timeout==2.3.1 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) pytest-xdist[psutil]==3.6.1 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) python-dateutil==2.9.0.post0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) python-snappy==0.7.2 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) pyzmq==26.2.0 # via locust referencing==0.35.1 # via - # -r requirements.txt # jsonschema # jsonschema-specifications requests==2.32.3 # via - # -r requirements-dev.in + # karapace (/karapace/pyproject.toml) # locust rich==13.7.1 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) roundrobin==0.0.4 # via locust rpds-py==0.20.0 # via - # -r requirements.txt # jsonschema # referencing sentry-sdk==2.13.0 - # via -r requirements-dev.in -setuptools-golang==2.9.0 - # via -r requirements-dev.in + # via karapace (/karapace/pyproject.toml) six==1.16.0 # via - # -r requirements.txt # geventhttpclient # isodate # python-dateutil sniffio==1.3.1 - # via - # -r requirements.txt - # anyio + # via anyio sortedcontainers==2.4.0 # via hypothesis tenacity==9.0.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) tomli==2.0.1 # via # coverage @@ -245,17 +213,17 @@ tomli==2.0.1 # pytest typing-extensions==4.12.2 # via - # -r requirements.txt # anyio + # karapace (/karapace/pyproject.toml) # rich ujson==5.10.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) urllib3==2.2.2 # via # requests # sentry-sdk watchfiles==0.23.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) werkzeug==3.0.4 # via # flask @@ -264,14 +232,13 @@ werkzeug==3.0.4 wmctrl==0.5 # via pdbpp xxhash==3.5.0 - # via -r requirements.txt -yarl==1.9.4 + # via karapace (/karapace/pyproject.toml) +yarl==1.12.1 # via - # -r requirements.txt # aiohttp + # karapace (/karapace/pyproject.toml) zipp==3.20.1 # via - # -r requirements.txt # importlib-metadata # importlib-resources zope-event==5.0 @@ -279,7 +246,7 @@ zope-event==5.0 zope-interface==7.0.2 # via gevent zstandard==0.23.0 - # via -r requirements.txt + # via karapace (/karapace/pyproject.toml) # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/requirements-typing.in b/requirements/requirements-typing.in deleted file mode 100644 index b0179da71..000000000 --- a/requirements/requirements-typing.in +++ /dev/null @@ -1,8 +0,0 @@ --c requirements.txt --c requirements-dev.txt - -mypy -types-jsonschema -sentry-sdk -types-cachetools -types-protobuf<4 diff --git a/requirements/requirements-typing.txt b/requirements/requirements-typing.txt index 7b064f425..503061bea 100644 --- a/requirements/requirements-typing.txt +++ b/requirements/requirements-typing.txt @@ -2,51 +2,140 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# 'make requirements' +# make pin-requirements # +accept-types==0.4.1 + # via karapace (/karapace/pyproject.toml) +aiohappyeyeballs==2.4.0 + # via aiohttp +aiohttp==3.10.6 + # via karapace (/karapace/pyproject.toml) +aiokafka==0.10.0 + # via karapace (/karapace/pyproject.toml) +aiosignal==1.3.1 + # via aiohttp +anyio==4.5.0 + # via watchfiles +async-timeout==4.0.3 + # via + # aiohttp + # aiokafka attrs==24.2.0 # via - # -c requirements-dev.txt - # -c requirements.txt + # aiohttp + # jsonschema # referencing +avro @ https://github.com/aiven/avro/archive/5a82d57f2a650fd87c819a30e433f1abb2c76ca2.tar.gz#subdirectory=lang/py + # via karapace (/karapace/pyproject.toml) +cachetools==5.3.3 + # via karapace (/karapace/pyproject.toml) certifi==2024.7.4 + # via sentry-sdk +confluent-kafka==2.4.0 + # via karapace (/karapace/pyproject.toml) +cramjam==2.8.4 + # via python-snappy +exceptiongroup==1.2.2 + # via anyio +frozenlist==1.4.1 + # via + # aiohttp + # aiosignal +idna==3.10 + # via + # anyio + # yarl +importlib-resources==6.4.5 + # via + # jsonschema + # jsonschema-specifications +isodate==0.6.1 + # via karapace (/karapace/pyproject.toml) +jsonschema==4.23.0 + # via karapace (/karapace/pyproject.toml) +jsonschema-specifications==2023.12.1 + # via jsonschema +lz4==4.3.3 + # via karapace (/karapace/pyproject.toml) +markdown-it-py==3.0.0 + # via rich +mdurl==0.1.2 + # via markdown-it-py +multidict==6.1.0 # via - # -c requirements-dev.txt - # sentry-sdk + # aiohttp + # yarl mypy==1.11.2 - # via -r requirements-typing.in + # via karapace (/karapace/pyproject.toml) mypy-extensions==1.0.0 # via mypy +networkx==3.1 + # via karapace (/karapace/pyproject.toml) +packaging==24.1 + # via aiokafka +pkgutil-resolve-name==1.3.10 + # via jsonschema +prometheus-client==0.20.0 + # via karapace (/karapace/pyproject.toml) +protobuf==3.20.3 + # via karapace (/karapace/pyproject.toml) +pygments==2.18.0 + # via rich +pyjwt==2.9.0 + # via karapace (/karapace/pyproject.toml) +python-dateutil==2.9.0.post0 + # via karapace (/karapace/pyproject.toml) +python-snappy==0.7.3 + # via karapace (/karapace/pyproject.toml) referencing==0.35.1 # via - # -c requirements-dev.txt - # -c requirements.txt + # jsonschema + # jsonschema-specifications # types-jsonschema +rich==13.7.1 + # via karapace (/karapace/pyproject.toml) rpds-py==0.20.0 # via - # -c requirements-dev.txt - # -c requirements.txt + # jsonschema # referencing sentry-sdk==2.13.0 + # via karapace (/karapace/pyproject.toml) +six==1.16.0 # via - # -c requirements-dev.txt - # -r requirements-typing.in + # isodate + # python-dateutil +sniffio==1.3.1 + # via anyio +tenacity==9.0.0 + # via karapace (/karapace/pyproject.toml) tomli==2.0.1 - # via - # -c requirements-dev.txt - # mypy + # via mypy types-cachetools==5.5.0.20240820 - # via -r requirements-typing.in + # via karapace (/karapace/pyproject.toml) types-jsonschema==4.23.0.20240813 - # via -r requirements-typing.in + # via karapace (/karapace/pyproject.toml) types-protobuf==3.20.4.6 - # via -r requirements-typing.in + # via karapace (/karapace/pyproject.toml) typing-extensions==4.12.2 # via - # -c requirements-dev.txt - # -c requirements.txt + # anyio + # karapace (/karapace/pyproject.toml) + # multidict # mypy + # rich +ujson==5.10.0 + # via karapace (/karapace/pyproject.toml) urllib3==2.2.2 + # via sentry-sdk +watchfiles==0.24.0 + # via karapace (/karapace/pyproject.toml) +xxhash==3.5.0 + # via karapace (/karapace/pyproject.toml) +yarl==1.12.1 # via - # -c requirements-dev.txt - # sentry-sdk + # aiohttp + # karapace (/karapace/pyproject.toml) +zipp==3.20.2 + # via importlib-resources +zstandard==0.23.0 + # via karapace (/karapace/pyproject.toml) diff --git a/requirements/requirements.in b/requirements/requirements.in deleted file mode 100644 index fa61d5d54..000000000 --- a/requirements/requirements.in +++ /dev/null @@ -1,32 +0,0 @@ -# PyPI dependencies -accept-types<1 -aiohttp<4 -aiokafka==0.10.0 -cachetools==5.3.3 -confluent-kafka==2.4.0 -isodate<1 -jsonschema<5 -lz4 -networkx==3.1 -protobuf<4 -pyjwt>=2.4.0,<3 -python-dateutil<3 -python-snappy -rich~=13.7.1 -tenacity<10 -typing-extensions -ujson<6 -watchfiles<1 -xxhash~=3.3 -zstandard -prometheus-client==0.20.0 - -# Patched dependencies -# -# Note: It is important to use commits to reference patched dependencies. This -# has two advantages: -# - Reproducible builds -# - The contents of the file change, which invalidates the existing docker -# images and forces a new image generation. -# -https://github.com/aiven/avro/archive/5a82d57f2a650fd87c819a30e433f1abb2c76ca2.tar.gz#subdirectory=lang/py diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 368ffb097..d7803e46e 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -2,16 +2,16 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# 'make requirements' +# make pin-requirements # accept-types==0.4.1 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) aiohappyeyeballs==2.4.0 # via aiohttp aiohttp==3.10.5 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) aiokafka==0.10.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) aiosignal==1.3.1 # via aiohttp anyio==4.4.0 @@ -26,11 +26,11 @@ attrs==24.2.0 # jsonschema # referencing avro @ https://github.com/aiven/avro/archive/5a82d57f2a650fd87c819a30e433f1abb2c76ca2.tar.gz#subdirectory=lang/py - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) cachetools==5.3.3 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) confluent-kafka==2.4.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) cramjam==2.8.3 # via python-snappy exceptiongroup==1.2.2 @@ -48,13 +48,13 @@ importlib-resources==6.4.4 # jsonschema # jsonschema-specifications isodate==0.6.1 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) jsonschema==4.23.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) jsonschema-specifications==2023.12.1 # via jsonschema lz4==4.3.3 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) markdown-it-py==3.0.0 # via rich mdurl==0.1.2 @@ -64,29 +64,29 @@ multidict==6.0.5 # aiohttp # yarl networkx==3.1 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) packaging==24.1 # via aiokafka pkgutil-resolve-name==1.3.10 # via jsonschema prometheus-client==0.20.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) protobuf==3.20.3 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) pygments==2.18.0 # via rich pyjwt==2.9.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) python-dateutil==2.9.0.post0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) python-snappy==0.7.2 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) referencing==0.35.1 # via # jsonschema # jsonschema-specifications rich==13.7.1 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) rpds-py==0.20.0 # via # jsonschema @@ -98,21 +98,23 @@ six==1.16.0 sniffio==1.3.1 # via anyio tenacity==9.0.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) typing-extensions==4.12.2 # via - # -r requirements.in # anyio + # karapace (/karapace/pyproject.toml) # rich ujson==5.10.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) watchfiles==0.23.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) xxhash==3.5.0 - # via -r requirements.in -yarl==1.9.4 - # via aiohttp + # via karapace (/karapace/pyproject.toml) +yarl==1.12.1 + # via + # aiohttp + # karapace (/karapace/pyproject.toml) zipp==3.20.1 # via importlib-resources zstandard==0.23.0 - # via -r requirements.in + # via karapace (/karapace/pyproject.toml) diff --git a/setup.py b/setup.py index cd8bac10e..ad992e355 100644 --- a/setup.py +++ b/setup.py @@ -1,77 +1,12 @@ """ karapace - setup - Copyright (c) 2023 Aiven Ltd See LICENSE for details """ -from setuptools import Extension, find_packages, setup - -import os -import version - -readme_path = os.path.join(os.path.dirname(__file__), "README.rst") -with open(readme_path, encoding="utf8") as fp: - readme_text = fp.read() - -version_for_setup_py = version.get_project_version() -version_for_setup_py = ".dev".join(version_for_setup_py.split("-", 2)[:2]) +from setuptools import Extension, setup setup( - name="karapace", - version=version_for_setup_py, - zip_safe=False, - packages=find_packages(exclude=["test"]), setup_requires=["setuptools-golang"], - install_requires=[ - "accept-types", - "aiohttp", - "aiokafka", - "avro", - "jsonschema", - "networkx", - "protobuf", - "pyjwt", - "python-dateutil", - # compression algorithms supported by confluent-kafka-python - "lz4", - "python-snappy", - "zstandard", - ], - extras_require={ - "sentry-sdk": ["sentry-sdk>=1.6.0"], - "ujson": ["ujson"], - }, - dependency_links=[], - package_data={}, - entry_points={ - "console_scripts": [ - "karapace = karapace.karapace_all:main", - "karapace_schema_backup = karapace.backup.cli:main", - "karapace_mkpasswd = karapace.auth:main", - ], - }, - author="Hannu Valtonen", - author_email="opensource@aiven.io", - license="Apache 2.0", - platforms=["POSIX", "MacOS"], - description="Karapace", - long_description=readme_text, - url="https://github.com/aiven/karapace/", - python_requires=">=3.8", - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "Intended Audience :: System Administrators", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Topic :: Database :: Database Engines/Servers", - "Topic :: Software Development :: Libraries", - ], - include_package_data=True, ext_modules=[ Extension( "protopacelib", diff --git a/version.py b/version.py deleted file mode 100644 index 64a193286..000000000 --- a/version.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -karapace - version - -Copyright (c) 2023 Aiven Ltd -See LICENSE for details -""" -from __future__ import annotations - -from typing import Final - -import os -import pathlib -import subprocess - -version_file: Final = pathlib.Path(__file__).parent.resolve() / "karapace/version.py" - - -def save_version(new_ver, old_ver): - if not new_ver: - return False - if not old_ver or new_ver != old_ver: - version_file.write_text(f'"""{__doc__}"""\n__version__ = "{new_ver}"\n') - return True - - -def from_version_file() -> str | None: - try: - import karapace.version - except ImportError: - return None - return karapace.version.__version__ - - -def get_project_version() -> str: - file_ver = from_version_file() - - version = os.getenv("KARAPACE_VERSION") - if version is None: - os.chdir(os.path.dirname(__file__) or ".") - try: - git_out = subprocess.check_output( - ["git", "describe", "--always", "--tags"], stderr=getattr(subprocess, "DEVNULL", None) - ) - except (OSError, subprocess.CalledProcessError): - pass - else: - git_ver = git_out.splitlines()[0].strip().decode("utf-8") - if "." not in git_ver: - git_ver = f"0.0.1-0-unknown-{git_ver}" - version = git_ver - - if save_version(version, file_ver): - return version - - if not file_ver: - raise RuntimeError(f"version not available from git or from file {str(version_file)!r}") - - return file_ver - - -if __name__ == "__main__": - get_project_version() diff --git a/website/source/install.rst b/website/source/install.rst index 39ca4e15d..2779668a2 100644 --- a/website/source/install.rst +++ b/website/source/install.rst @@ -37,4 +37,4 @@ Source install Alternatively you can do a source install using:: - python setup.py install + pip install .