diff --git a/Dockerfile b/Dockerfile index 25859f5..574d75b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.9-bookworm AS build COPY . /src WORKDIR /src/python -RUN python3 setup.py bdist_wheel +RUN pip install --no-cache-dir build==1.2.2 && python3 -m build FROM python:3.9-slim-bookworm ARG TZ diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 0000000..32197fa --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,75 @@ +[build-system] +requires = ["setuptools>=72", "wheel", "setuptools_scm[toml]>=8"] + +[project] +name = "etos_api" +dynamic = ["version"] +description = "ETOS API" +authors = [{name = "Tobias Persson", email = "tobias.persson@axis.com"}] +license = { text = "Apache License, Version 2.0" } +readme = "README.rst" +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: Apache Software License" +] +dependencies = [ + "etos_lib==4.3.1", + "etcd3gw~=2.3", + "uvicorn~=0.22", + "fastapi~=0.109.1", + "aiohttp[speedups]~=3.8", + "gql[requests]~=3.4", + "httpx~=0.24", + "kubernetes~=26.1", + "sse-starlette~=1.6", + "opentelemetry-api~=1.21", + "opentelemetry-exporter-otlp~=1.21", + "opentelemetry-instrumentation-fastapi==0.46b0", + "opentelemetry-sdk~=1.21", + "jsontas~=1.4", + "packageurl-python~=0.11", + "cryptography>=42.0.4,<43.0.0", + "setuptools_scm~=8.0" +] + +[options] +zip_safe = false +include_package_data = true +python_requires = ">=3.4" + +[options.packages.find] +where = "src" +exclude = ["tests"] + +[project.urls] +Documentation = "https://etos.readthedocs.io/" +Homepage = "https://github.com/eiffel-community/etos-api" +Repository = "https://github.com/eiffel-community/etos-api" + +[project.scripts] + +[project.optional-dependencies] +testing = ["pytest", "pytest-cov"] + +[test] +extras = true + +[tool.build_sphinx] +source_dir = "docs" +build_dir = "build/sphinx" + +[tool.devpi.upload] +no-vcs = 1 +formats = "bdist_wheel" + +[tool.flake8] +exclude = [".tox", "build", "dist", ".eggs", "docs/conf.py"] + +[tool.pytest.ini_options] +addopts = "--cov etos_api --cov-report term-missing --verbose" +norecursedirs = ["dist", "build", ".tox"] +testpaths = ["tests"] + +[tool.setuptools_scm] +root = ".." \ No newline at end of file diff --git a/python/requirements.txt b/python/requirements.txt deleted file mode 100644 index 4ef8864..0000000 --- a/python/requirements.txt +++ /dev/null @@ -1,31 +0,0 @@ -# ============================================================================= -# DEPRECATION WARNING: -# -# The file `requirements.txt` does not influence the package dependencies and -# will not be automatically created in the next version of PyScaffold (v4.x). -# -# Please have look at the docs for better alternatives -# (`Dependency Management` section). -# ============================================================================= -# -# Add your pinned requirements so that they can be easily installed with: -# pip install -r requirements.txt -# Remember to also add them in setup.cfg but unpinned. - -etos_lib==4.3.1 -etcd3gw~=2.3 -pyscaffold~=4.4 -uvicorn~=0.22 -fastapi~=0.109.1 -aiohttp[speedups]~=3.8 -gql[requests]~=3.4 -httpx~=0.24 -kubernetes~=26.1 -sse-starlette~=1.6 -opentelemetry-api~=1.21 -opentelemetry-exporter-otlp~=1.21 -opentelemetry-instrumentation-fastapi==0.46b0 -opentelemetry-sdk~=1.21 -jsontas~=1.4 -packageurl-python~=0.11 -cryptography>=42.0.4,<43.0.0 diff --git a/python/setup.cfg b/python/setup.cfg deleted file mode 100644 index 7dab435..0000000 --- a/python/setup.cfg +++ /dev/null @@ -1,103 +0,0 @@ -[metadata] -name = etos_api -description = ETOS API -author = Tobias Persson -author-email = tobias.persson@axis.com -license = Apache License, Version 2.0 -long-description = file: README.rst -long-description-content-type = text/x-rst; charset=UTF-8 -url = https://github.com/eiffel-community/etos-api -project-urls = - Documentation = https://etos.readthedocs.io/ -platforms = Linux -classifiers = - Development Status :: 4 - Beta - Programming Language :: Python :: 3 - License:: OSI Approved :: Apache Software License - -[options] -zip_safe = False -packages = find: -include_package_data = True -package_dir = - =src -# DON'T CHANGE THE FOLLOWING LINE! IT WILL BE UPDATED BY PYSCAFFOLD! -setup_requires = pyscaffold>=3.2a0,<3.3a0 -install_requires = - etos_lib==4.3.1 - etcd3gw~=2.3 - pyscaffold~=4.4 - uvicorn~=0.22 - fastapi~=0.109.1 - aiohttp[speedups]~=3.8 - gql[requests]~=3.4 - httpx~=0.24 - kubernetes~=26.1 - sse-starlette~=1.6 - opentelemetry-api~=1.21 - opentelemetry-exporter-otlp~=1.21 - opentelemetry-instrumentation-fastapi==0.46b0 - opentelemetry-sdk~=1.21 - jsontas~=1.4 - packageurl-python~=0.11 - cryptography>=42.0.4,<43.0.0 - -# Require a specific Python version, e.g. Python 2.7 or >= 3.4 -python_requires = >=3.4 - -[options.packages.find] -where = src -exclude = - tests - -[options.extras_require] -testing = - pytest - pytest-cov - -[options.entry_points] - -[test] -extras = True - -[tool:pytest] -addopts = - --cov etos_api --cov-report term-missing - --verbose -norecursedirs = - dist - build - .tox -testpaths = tests - -[aliases] -dists = bdist_wheel - -[bdist_wheel] -# Use this option if your package is pure-python -universal = 1 - -[build_sphinx] -source_dir = docs -build_dir = build/sphinx - -[devpi:upload] -# Options for the devpi: PyPI server and packaging tool -# VCS export must be deactivated since we are using setuptools-scm -no-vcs = 1 -formats = bdist_wheel - -[flake8] -# Some sane defaults for the code style checker flake8 -exclude = - .tox - build - dist - .eggs - docs/conf.py - -[pyscaffold] -# PyScaffold's parameters when the project was created. -# This will be used when updating. Do not change! -version = 3.2.3 -package = etos_api diff --git a/python/setup.py b/python/setup.py index 5ee1b39..d67fb4d 100644 --- a/python/setup.py +++ b/python/setup.py @@ -1,23 +1,42 @@ # -*- coding: utf-8 -*- -"""Setup file for etos_api. +"""Setup file for etos-api.""" +from setuptools import setup +from setuptools_scm.version import get_local_dirty_tag -Use setup.cfg to configure your project. -This file was generated with PyScaffold 3.2.3. -PyScaffold helps you to put up the scaffold of your new Python project. -Learn more under: https://pyscaffold.org/ -""" -import sys +def version_scheme(version) -> str: + """Get version component for the current commit. -from pkg_resources import VersionConflict, require -from setuptools import setup + Used by setuptools_scm. + """ + if version.tag and version.distance == 0: + # If the current commit has a tag, use the tag as version, regardless of branch. + # Note: Github CI creates releases from detached HEAD, not from a particular branch. + return f"{version.tag}" + elif version.branch == "main" and version.tag and version.distance > 0: + # For untagged commits on the release branch always add a distance like ".post3" + return f"{version.tag}.post{version.distance}" + else: + # For non-release branches, mark the version as dev and distance: + return f"{version.tag}.dev{version.distance}" + + +def local_scheme(version) -> str: + """Get local version component for the current Git commit. + + Used by setuptools_scm. + """ + # If current version is dirty, always add dirty suffix, regardless of branch. + dirty_tag = get_local_dirty_tag(version) if version.dirty else "" + if dirty_tag: + return f"{dirty_tag}.{version.node}" -try: - require("setuptools>=38.3") -except VersionConflict: - print("Error: version of setuptools is too old (<38.3)!") - sys.exit(1) + if version.distance == 0: + # If the current commit has a tag, do not add a local component, regardless of branch. + return "" + # For all other cases, always add the git reference (like "g7839952") + return f"+{version.node}" if __name__ == "__main__": - setup(use_pyscaffold=True) + setup(use_scm_version={"local_scheme": local_scheme, "version_scheme": version_scheme})