Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
26 changes: 26 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3.9 per the changes

authors = [
{name = "Yury Selivanov", email="[email protected]"},
]
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"
88 changes: 5 additions & 83 deletions setup.py
Original file line number Diff line number Diff line change
@@ -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')
Expand All @@ -15,26 +17,18 @@

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,
'Use the system provided http-parser, instead of the bundled one'),
]

boolean_options = build_ext.boolean_options + [
'cython-always',
'cython-annotate',
'use-system-llhttp',
'use-system-http-parser',
]
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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__ ='):
Expand All @@ -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='[email protected]',
license='MIT',
packages=['httptools', 'httptools.parser'],
cmdclass={
'build_ext': httptools_build_ext,
},
ext_modules=[
ext_modules=cythonize([
Extension(
"httptools.parser.parser",
sources=[
Expand All @@ -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',
Expand Down