diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7c85de3..d08ce7c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] os: [windows-latest, ubuntu-latest, macos-latest] env: @@ -46,5 +46,6 @@ jobs: if: steps.release.outputs.version == 0 run: | python -m pip install -U pip setuptools wheel - python -m pip install -e .[test] - python -m unittest -v tests.suite + python -m pip install .[test] + cd tests + python -m unittest -v diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..bb88f12 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +build-backend = "setuptools.build_meta" +requires = ["setuptools", "cython"] + +[project] +name = "httptools" +dynamic = ["version", "optional-dependencies"] +classifiers = [ + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Operating System :: POSIX", + "Operating System :: MacOS :: MacOS X", + "Environment :: Web Environment", + "Development Status :: 5 - Production/Stable", +] +requires-python = ">=3.8" +authors = [ + {name = "Yury Selivanov", email="yury@magic.io"}, +] +license = "MIT" +license-files = ["LICENSE"] +description = "A collection of framework independent HTTP protocol utils." +readme = "README.md" + +[project.urls] +Homepage = "https://github.com/MagicStack/httptools" diff --git a/setup.py b/setup.py index adca1f8..7f5a923 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,7 @@ import sys +from Cython.Build import cythonize + vi = sys.version_info if vi < (3, 8): raise RuntimeError('httptools require Python 3.8 or greater') @@ -15,17 +17,11 @@ ROOT = pathlib.Path(__file__).parent -CYTHON_DEPENDENCY = 'Cython>=0.29.24' +CYTHON_DEPENDENCY = 'Cython>=3.1.0' class httptools_build_ext(build_ext): user_options = build_ext.user_options + [ - ('cython-always', None, - 'run cythonize() even if .c files are present'), - ('cython-annotate', None, - 'Produce a colorized HTML version of the Cython source.'), - ('cython-directives=', None, - 'Cythion compiler directives'), ('use-system-llhttp', None, 'Use the system provided llhttp, instead of the bundled one'), ('use-system-http-parser', None, @@ -33,8 +29,6 @@ class httptools_build_ext(build_ext): ] boolean_options = build_ext.boolean_options + [ - 'cython-always', - 'cython-annotate', 'use-system-llhttp', 'use-system-http-parser', ] @@ -49,9 +43,6 @@ def initialize_options(self): super().initialize_options() self.use_system_llhttp = False self.use_system_http_parser = False - self.cython_always = False - self.cython_annotate = None - self.cython_directives = None def finalize_options(self): # finalize_options() may be called multiple times on the @@ -60,53 +51,6 @@ def finalize_options(self): if getattr(self, '_initialized', False): return - need_cythonize = self.cython_always - cfiles = {} - - for extension in self.distribution.ext_modules: - for i, sfile in enumerate(extension.sources): - if sfile.endswith('.pyx'): - prefix, ext = os.path.splitext(sfile) - cfile = prefix + '.c' - - if os.path.exists(cfile) and not self.cython_always: - extension.sources[i] = cfile - else: - if os.path.exists(cfile): - cfiles[cfile] = os.path.getmtime(cfile) - else: - cfiles[cfile] = 0 - need_cythonize = True - - if need_cythonize: - try: - import Cython - except ImportError: - raise RuntimeError( - 'please install Cython to compile httptools from source') - - if Cython.__version__ < '0.29': - raise RuntimeError( - 'httptools requires Cython version 0.29 or greater') - - from Cython.Build import cythonize - - directives = {} - if self.cython_directives: - for directive in self.cython_directives.split(','): - k, _, v = directive.partition('=') - if v.lower() == 'false': - v = False - if v.lower() == 'true': - v = True - - directives[k] = v - - self.distribution.ext_modules[:] = cythonize( - self.distribution.ext_modules, - compiler_directives=directives, - annotate=self.cython_annotate) - super().finalize_options() self._initialized = True @@ -145,10 +89,6 @@ def build_extensions(self): super().build_extensions() -with open(str(ROOT / 'README.md')) as f: - long_description = f.read() - - with open(str(ROOT / 'httptools' / '_version.py')) as f: for line in f: if line.startswith('__version__ ='): @@ -169,32 +109,14 @@ def build_extensions(self): setup( - name='httptools', version=VERSION, - description='A collection of framework independent HTTP protocol utils.', - long_description=long_description, - long_description_content_type='text/markdown', - url='https://github.com/MagicStack/httptools', - classifiers=[ - 'License :: OSI Approved :: MIT License', - 'Intended Audience :: Developers', - 'Programming Language :: Python :: 3', - 'Operating System :: POSIX', - 'Operating System :: MacOS :: MacOS X', - 'Environment :: Web Environment', - 'Development Status :: 5 - Production/Stable', - ], platforms=['macOS', 'POSIX', 'Windows'], - python_requires='>=3.8.0', zip_safe=False, - author='Yury Selivanov', - author_email='yury@magic.io', - license='MIT', packages=['httptools', 'httptools.parser'], cmdclass={ 'build_ext': httptools_build_ext, }, - ext_modules=[ + ext_modules=cythonize([ Extension( "httptools.parser.parser", sources=[ @@ -209,7 +131,7 @@ def build_extensions(self): ], extra_compile_args=CFLAGS, ), - ], + ]), include_package_data=True, exclude_package_data={"": ["*.c", "*.h"]}, test_suite='tests.suite',