Introduce poetry (#1628)

This commit is contained in:
Robbe Sneyders
2023-02-07 20:17:38 +01:00
committed by GitHub
parent 022bb8f34a
commit 15e985e864
18 changed files with 123 additions and 188 deletions

View File

@@ -1,6 +0,0 @@
# Save as .codeclimate.yml (note leading .) in project root directory
languages:
Python: true
exclude_paths:
- "tests/*"
- "connexion/swagger-ui/*"

View File

@@ -19,7 +19,7 @@ jobs:
- name: Install dependencies
run: |
pip install --upgrade pip
pip install "tox<4" "tox-gh-actions<3" "setuptools<58" "coveralls<4"
pip install "poetry<2" "tox<4" "tox-gh-actions<3" "coveralls<4"
- name: Test with tox
run: tox
- name: Coveralls

View File

@@ -19,13 +19,12 @@ jobs:
python-version: 3.9
- name: Update version
run: sed -i "s/__version__ = .*/__version__ = '${{github.ref_name}}'/" */__init__.py
run: sed -i "s/^version = .*/version = '${{github.ref_name}}'/" pyproject.toml
- name: Build a binary wheel and a source tarball
run: |
pip install --upgrade pip
pip install wheel
python setup.py sdist bdist_wheel
pip install poetry
poetry build
- name: Publish distribution 📦 to Test PyPI
if: github.event_name == 'push'

1
.gitignore vendored
View File

@@ -16,3 +16,4 @@ venv/
.venv/
src/
*.un~
poetry.lock

View File

@@ -11,7 +11,7 @@ repos:
- flake8-rst-docstrings==0.2.3
- repo: https://github.com/PyCQA/isort
rev: 5.10.1
rev: 5.12.0
hooks:
- id: isort
name: isort

View File

@@ -1,5 +0,0 @@
João Santos <joao.santos@zalando.de>
Henning Jacobs <henning.jacobs@zalando.de>
Daniel Grossmann-Kavanagh <me@danielgk.com>
Ruwan Lambrichts <ruwan.lambrichts@ml6.eu>
Robbe Sneyders <robbe.sneyders@ml6.eu>

View File

@@ -1,3 +0,0 @@
include *.txt
include *.rst
recursive-include connexion/resources *.json

View File

@@ -583,12 +583,12 @@ Contributing to Connexion/TODOs
We welcome your ideas, issues, and pull requests. Just follow the
usual/standard GitHub practices.
For easy development, install connexion in editable mode with the :code:`tests` extra, and
For easy development, install connexion using poetry with all extras, and
install the pre-commit hooks to automatically run black formatting and static analysis checks.
.. code-block:: bash
pip install -e .[tests]
poetry install --all-extras
pre-commit install
You can find out more about how Connexion works and where to apply your changes by having a look

View File

@@ -1,8 +0,0 @@
We acknowledge that every line of code that we write may potentially contain security issues.
We are trying to deal with it responsibly and provide patches as quickly as possible.
We host our bug bounty program on HackerOne, it is currently private, therefore if you would like to report a vulnerability and get rewarded for it, please ask to join our program by filling this form:
https://corporate.zalando.com/en/services-and-contact#security-form
You can also send your report via this form if you do not want to join our bug bounty program and just want to report a vulnerability or security issue.

View File

@@ -1,2 +0,0 @@
skips:
- "B101" # https://docs.openstack.org/bandit/latest/plugins/b101_assert_used.html

View File

@@ -31,6 +31,3 @@ from connexion.middleware import ConnexionMiddleware
App = FlaskApp
Api = FlaskApi
# This version is replaced during release process.
__version__ = "3.0.dev0"

View File

@@ -8,6 +8,7 @@ import sys
from os import path
import click
import importlib_metadata
from clickclick import AliasedGroup, fatal_error
import connexion
@@ -47,7 +48,7 @@ def validate_server_requirements(ctx, param, value):
def print_version(ctx, param, value):
if not value or ctx.resilient_parsing:
return
click.echo(f"Connexion {connexion.__version__}")
click.echo(f"Connexion {importlib_metadata.version('connexion')}")
ctx.exit()

95
pyproject.toml Normal file
View File

@@ -0,0 +1,95 @@
[tool.poetry]
name = "connexion"
version = "3.0.dev0"
description = "Connexion - API first applications with OpenAPI/Swagger"
readme = "README.rst"
keywords = ["api", "swagger", "openapi"]
license = "Apache-2.0"
authors = [
"Daniel Grossmann-Kavanagh <me@danielgk.com>",
"Henning Jacobs <henning.jacobs@zalando.de>",
"João Santos <joao.santos@zalando.de>",
"Robbe Sneyders <robbe.sneyders@gmail.com>",
"Ruwan Lambrichts <ruwan.lambrichts@ml6.eu>",
]
maintainers = [
"Robbe Sneyders <robbe.sneyders@gmail.com>",
"Ruwan Lambrichts <ruwan.lambrichts@ml6.eu>",
]
repository = "https://github.com/spec-first/connexion"
include = ["*.txt", "*.rst"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Topic :: Internet",
"Topic :: Internet :: WWW/HTTP",
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
"Topic :: Software Development",
"Topic :: Software Development :: Libraries",
"Topic :: Software Development :: Libraries :: Python Modules",
"Typing :: Typed",
]
[tool.poetry.scripts]
connexion = 'connexion.cli:main'
[tool.poetry.dependencies]
python = '^3.7'
clickclick = ">= 1.2, < 21"
httpx = "^0.15"
importlib_metadata = { version = "^6.0.0", python = "<3.8" }
inflection = ">= 0.3.1, < 0.6"
jsonschema = "^4.0.1"
Jinja2 = "^3.0.0"
python-multipart = "~0.0.5"
PyYAML = ">= 5.1, < 7"
requests = "^2.27"
starlette = "^0.19"
typing-extensions = "^4"
werkzeug = "^2.2.1"
a2wsgi = { version = "^1.4", optional = true }
flask = { version = "^2.2", extras = ["async"], optional = true }
py-swagger-ui = { version = "^1.1.0", optional = true }
uvicorn = { version = "^0.17.6", extras = ["standard"], optional = true }
[tool.poetry.extras]
flask = ["a2wsgi", "flask"]
swagger-ui = ["py-swagger-ui"]
uvicorn = ["uvicorn"]
[tool.poetry.group.tests.dependencies]
pre-commit = "~2.21.0"
pytest = "7.2.1"
pytest-asyncio = "~0.18.3"
pytest-cov = "~2.12.1"
[tool.poetry.group.docs.dependencies]
sphinx-autoapi = "1.8.1"
[build-system]
requires = ["poetry-core>=1.2.0"]
build-backend = "poetry.core.masonry.api"
[tool.distutils.bdist_wheel]
universal = true
[tool.pytest.ini_options]
filterwarnings = [
"ignore::DeprecationWarning:connexion.*:",
"ignore::FutureWarning:connexion.*:",
]
asyncio_mode = "auto"
[tool.isort]
profile = "black"

View File

@@ -1,5 +0,0 @@
[pytest]
filterwarnings =
ignore::DeprecationWarning:connexion.*:
ignore::FutureWarning:connexion.*:
asyncio_mode = auto

View File

@@ -1,2 +0,0 @@
[bdist_wheel]
universal=1

126
setup.py
View File

@@ -1,126 +0,0 @@
#!/usr/bin/env python3
import inspect
import os
import sys
from setuptools import find_packages, setup
from setuptools.command.test import test as TestCommand
__location__ = os.path.join(os.getcwd(), os.path.dirname(inspect.getfile(inspect.currentframe())))
def read_version(package):
with open(os.path.join(package, '__init__.py')) as fd:
for line in fd:
if line.startswith('__version__ = '):
return line.split()[-1].strip().strip("'")
version = read_version('connexion')
install_requires = [
'clickclick>=1.2,<21',
'jsonschema>=4.0.1,<5',
'PyYAML>=5.1,<7',
'requests>=2.27,<3',
'inflection>=0.3.1,<0.6',
'werkzeug>=2.2.1,<3',
'starlette>=0.19,<1',
'httpx>=0.15,<1',
'typing-extensions>=4,<5',
'python-multipart>=0.0.5',
]
swagger_ui_require = 'py-swagger-ui>=1.1.0,<2'
flask_require = [
'flask[async]>=2.2,<3',
'a2wsgi>=1.4,<2',
]
tests_require = [
'pytest>=6,<7',
'pytest-asyncio>=0.18,<0.19',
'pre-commit>=2,<3',
'pytest-cov>=2,<3',
*flask_require,
swagger_ui_require
]
docs_require = [
'sphinx-autoapi==1.8.1'
]
uvicorn_requires = [
'uvicorn[standard]>=0.17.6'
]
class PyTest(TestCommand):
user_options = [('cov-html=', None, 'Generate junit html report')]
def initialize_options(self):
TestCommand.initialize_options(self)
self.cov = None
self.pytest_args = ['--cov', 'connexion', '--cov-report', 'term-missing', '-v', "--asyncio-mode", "auto"]
self.cov_html = False
def finalize_options(self):
TestCommand.finalize_options(self)
if self.cov_html:
self.pytest_args.extend(['--cov-report', 'html'])
self.pytest_args.extend(['tests'])
def run_tests(self):
import pytest
errno = pytest.main(self.pytest_args)
sys.exit(errno)
def readme():
try:
return open('README.rst', encoding='utf-8').read()
except TypeError:
return open('README.rst').read()
setup(
name='connexion',
packages=find_packages(),
version=version,
description='Connexion - API first applications with OpenAPI/Swagger and Flask',
long_description=readme(),
author='Zalando SE',
url='https://github.com/spec-first/connexion',
keywords='openapi oai swagger rest api oauth flask microservice framework',
license='Apache License Version 2.0',
python_requires=">=3.6",
install_requires=install_requires + flask_require,
tests_require=tests_require,
extras_require={
'tests': tests_require,
'flask': flask_require,
'swagger-ui': swagger_ui_require,
'docs': docs_require,
'uvicorn': uvicorn_requires,
},
cmdclass={'test': PyTest},
test_suite='tests',
classifiers=[
'Programming Language :: Python',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
'Topic :: Software Development :: Libraries :: Application Frameworks'
],
include_package_data=True, # needed to include swagger-ui (see MANIFEST.in)
entry_points={'console_scripts': ['connexion = connexion.cli:main']}
)

View File

@@ -2,6 +2,7 @@ import logging
from unittest.mock import MagicMock
import connexion
import importlib_metadata
import pytest
from click.testing import CliRunner
from connexion.cli import main
@@ -51,7 +52,7 @@ def spec_file():
def test_print_version():
runner = CliRunner()
result = runner.invoke(main, ["--version"], catch_exceptions=False)
assert f"Connexion {connexion.__version__}" in result.output
assert f"Connexion {importlib_metadata.version('connexion')}" in result.output
def test_run_missing_spec():

34
tox.ini
View File

@@ -6,37 +6,35 @@ rst-roles=class,mod,obj
max-line-length=137
extend-ignore=E203
[isort]
profile = black
[tox]
isolated_build = True
envlist =
{py37}-{min,pypi,dev}
{py38}-{min,pypi,dev}
{py39}-{min,pypi,dev}
{py310}-{min,pypi,dev}
{py37,py38,py39,py310}-{min,pypi}
pre-commit
mypy
[gh-actions]
python =
3.7: py37-min,py37-pypi
3.8: py38-min,py38-pypi
3.9: py39-min,py39-pypi
3.10: py310-min,py310-pypi,pre-commit,mypy
3.10: py310-min,py310-pypi,pre-commit
[testenv]
setenv=PYTHONPATH = {toxinidir}:{toxinidir}
deps=pytest
deps=
poetry
allowlist_externals=
cp
sed
mv
commands=
pip install Requirements-Builder
min: requirements-builder --level=min -o {toxworkdir}/requirements-min.txt setup.py
min: pip install --upgrade -r {toxworkdir}/requirements-min.txt
pypi: requirements-builder --level=pypi -o {toxworkdir}/requirements-pypi.txt setup.py
pypi: pip install --upgrade -r {toxworkdir}/requirements-pypi.txt
dev: requirements-builder --level=dev --req=requirements-devel.txt -o {toxworkdir}/requirements-dev.txt setup.py
dev: pip install --upgrade -r {toxworkdir}/requirements-dev.txt
python setup.py test
min: cp pyproject.toml .pyproject.toml
min: sed -i -E 's/"(\^|~|>=)([ 0-9])/"==\2/' pyproject.toml
poetry lock
poetry install --all-extras --with tests
poetry show
poetry run python -m pytest tests --cov connexion --cov-report term-missing
min: mv -f .pyproject.toml pyproject.toml
[testenv:pre-commit]
deps=pre-commit