diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..d46fb755 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,37 @@ +name: main + +on: + push: + branches: [main, test-me-*] + tags: '*' + pull_request: + +jobs: + main-windows: + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 + with: + env: '["py39"]' + os: windows-latest + arch: '["x64", "x86"]' + wheel-tags: true + submodules: true + main-macos: + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 + with: + env: '["py39"]' + os: macos-latest + wheel-tags: true + submodules: true + main-macos-intel: + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 + with: + env: '["py39"]' + os: macos-13 + wheel-tags: true + submodules: true + main-linux: + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 + with: + env: '["py39", "py310", "py311"]' + os: ubuntu-latest + submodules: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bf5f87c2..1d263e33 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -9,27 +9,30 @@ repos: - id: double-quote-string-fixer - id: name-tests-test - id: requirements-txt-fixer -- repo: https://github.com/asottile/reorder_python_imports - rev: v3.8.5 +- repo: https://github.com/asottile/setup-cfg-fmt + rev: v2.8.0 + hooks: + - id: setup-cfg-fmt +- repo: https://github.com/asottile/reorder-python-imports + rev: v3.15.0 hooks: - id: reorder-python-imports - args: [--py36-plus] + args: [--py39-plus] - repo: https://github.com/asottile/add-trailing-comma - rev: v2.3.0 + rev: v3.2.0 hooks: - id: add-trailing-comma - args: [--py36-plus] - repo: https://github.com/asottile/pyupgrade - rev: v3.1.0 + rev: v3.20.0 hooks: - id: pyupgrade - args: [--py36-plus] -- repo: https://github.com/pre-commit/mirrors-autopep8 - rev: v1.7.0 + args: [--py39-plus] +- repo: https://github.com/hhatto/autopep8 + rev: v2.3.2 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 5.0.4 + rev: 7.3.0 hooks: - id: flake8 exclude: ^docs/conf.py diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 101beec7..37c4e077 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -23,10 +23,10 @@ Tests - All code patches should contain one or more unit tests or regression tests. - All code patches have to successfully run tests on every Python version we aim to support. tox_ would help. -- All commits will be tested by `Azure Pipelines`_ (Linux and Windows). +- All commits will be tested by `GitHub Actions`_ (Linux and Windows). .. _tox: https://tox.readthedocs.io/ -.. _`Azure Pipelines`: https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main +.. _`GitHub Actions`: https://github.com/sass/libsass-python/actions Maintainer's guide @@ -50,10 +50,9 @@ Here's a brief check list for releasing a new version: - Make a source distribution and upload it to PyPI (``python3 setup.py sdist upload``). If it's successful the new version must appear on PyPI_. -- `Azure Pipelines`_ automatically makes binary wheels for Windows, but each +- `GitHub Actions`_ automatically makes binary wheels for Windows, but each CI build takes a while. These wheels are not automatically uploaded, - but there's ``./bin/download-windows-wheels`` script that downloads built - wheels. Then upload them with ``twine``. + you can retreive them from the build's artifacts. - Run ``./bin/build-manylinux-wheels`` to build linux wheels and upload them to PyPI (takes ~5 minutes). - The `docs website`__ also has to be updated. diff --git a/README.rst b/README.rst index 27ab487b..593c78f1 100644 --- a/README.rst +++ b/README.rst @@ -5,27 +5,21 @@ libsass-python: Sass_/SCSS for Python :alt: PyPI :target: https://pypi.org/pypi/libsass/ -.. image:: https://dev.azure.com/asottile/asottile/_apis/build/status/sass.libsass-python?branchName=main - :target: https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main +.. image:: https://github.com/sass/libsass-python/actions/workflows/main.yml/badge.svg + :target: https://github.com/sass/libsass-python/actions/workflows/main.yml :alt: Build Status -.. image:: https://img.shields.io/azure-devops/coverage/asottile/asottile/22/main.svg - :target: https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main - :alt: Coverage Status - .. image:: https://results.pre-commit.ci/badge/github/sass/libsass-python/main.svg :target: https://results.pre-commit.ci/latest/github/sass/libsass-python/main :alt: pre-commit.ci status This package provides a simple Python extension module ``sass`` which is binding LibSass_ (written in C/C++ by Hampton Catlin and Aaron Leung). -It's very straightforward and there isn't any headache related Python +It's very straightforward and there isn't any headache related to Python distribution/deployment. That means you can add just ``libsass`` into your ``setup.py``'s ``install_requires`` list or ``requirements.txt`` file. No need for Ruby nor Node.js. -It currently supports CPython 3.6+, and PyPy 3! - .. _Sass: https://sass-lang.com/ .. _LibSass: https://github.com/sass/libsass diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 79917318..00000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,33 +0,0 @@ -trigger: - branches: - include: [main, test-me-*] - tags: - include: ['*'] - -resources: - repositories: - - repository: self - checkoutOptions: - submodules: true - - repository: asottile - type: github - endpoint: github - name: asottile/azure-pipeline-templates - ref: refs/tags/v2.4.0 - -jobs: -- template: job--python-tox.yml@asottile - parameters: - toxenvs: [py37] - os: macos - wheel_tags: true -- template: job--python-tox.yml@asottile - parameters: - toxenvs: [py37] - os: windows - architectures: [x64, x86] - wheel_tags: true -- template: job--python-tox.yml@asottile - parameters: - toxenvs: [pypy3, py36, py37, py38, py39] - os: linux diff --git a/bin/build-manylinux-wheels b/bin/build-manylinux-wheels index 70958b43..233c5afc 100755 --- a/bin/build-manylinux-wheels +++ b/bin/build-manylinux-wheels @@ -21,21 +21,20 @@ def check_call(*cmd): def main(): os.makedirs('dist', exist_ok=True) - for python in ('cp27-cp27mu', 'cp36-cp36m'): - with tempfile.TemporaryDirectory() as work: - pip = f'/opt/python/{python}/bin/pip' - check_call( - 'docker', 'run', '-ti', - # Use this so the files are not owned by root - '--user', f'{os.getuid()}:{os.getgid()}', - # We'll do building in /work and copy results to /dist - '-v', f'{work}:/work:rw', - '-v', '{}:/dist:rw'.format(os.path.abspath('dist')), - 'quay.io/pypa/manylinux1_x86_64:latest', - 'bash', '-exc', - '{} wheel --verbose --wheel-dir /work --no-deps libsass && ' - 'auditwheel repair --wheel-dir /dist /work/*.whl'.format(pip), - ) + with tempfile.TemporaryDirectory() as work: + pip = '/opt/python/cp39-cp39/bin/pip' + check_call( + 'docker', 'run', '-ti', + # Use this so the files are not owned by root + '--user', f'{os.getuid()}:{os.getgid()}', + # We'll do building in /work and copy results to /dist + '-v', f'{work}:/work:rw', + '-v', '{}:/dist:rw'.format(os.path.abspath('dist')), + 'quay.io/pypa/manylinux1_x86_64:latest', + 'bash', '-exc', + '{} wheel --verbose --wheel-dir /work --no-deps libsass && ' + 'auditwheel repair --wheel-dir /dist /work/*.whl'.format(pip), + ) return 0 diff --git a/bin/download-windows-wheels b/bin/download-windows-wheels deleted file mode 100755 index dee25a26..00000000 --- a/bin/download-windows-wheels +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import io -import json -import os.path -import re -import urllib.request -import zipfile - -DEFINITION_RE = re.compile( - r'https://dev.azure.com/(?P[^/]+)/(?P[^/]+)' - r'/_build/latest\?definitionId=(?P\d+)', -) -BUILDS = 'https://dev.azure.com/{org}/{project}/_apis/build/builds?api-version=5.0&definitions={definition}&$top=5' # noqa: E501 -ARTIFACTS = 'https://dev.azure.com/{org}/{project}/_apis/build/builds/{build}/artifacts?api-version=5.0' # noqa: E501 - - -def main() -> int: - parser = argparse.ArgumentParser() - parser.add_argument('tag') - parser.add_argument('--dest', default='dist') - args = parser.parse_args() - - with open('README.rst') as f: - match = DEFINITION_RE.search(f.read()) - assert match - - builds_resp = urllib.request.urlopen(BUILDS.format(**match.groupdict())) - builds_json = json.load(builds_resp) - - build_id = next( - iter([ - build['id'] for build in builds_json['value'] - if build['status'] == 'completed' - if build['result'] == 'succeeded' - if build['sourceBranch'] == f'refs/tags/{args.tag}' - ]), - ) - - artifacts_url = ARTIFACTS.format(build=build_id, **match.groupdict()) - artifacts_resp = urllib.request.urlopen(artifacts_url) - artifacts_json = json.load(artifacts_resp) - - os.makedirs(args.dest, exist_ok=True) - for artifact in artifacts_json['value']: - if artifact['name'].startswith('wheel_'): - print(f'artifact: {artifact["name"]}') - resp = urllib.request.urlopen(artifact['resource']['downloadUrl']) - bio = io.BytesIO(resp.read()) - with zipfile.ZipFile(bio) as zipf: - for info in zipf.infolist(): - if info.filename.endswith('.whl'): - info.filename = os.path.basename(info.filename) - zipf.extract(info, path=args.dest) - return 0 - - -if __name__ == '__main__': - raise SystemExit(main()) diff --git a/docs/changes.rst b/docs/changes.rst index 0cc472e9..cf4b4b8e 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -1,6 +1,16 @@ Changelog ========= +Version 0.23.0 +-------------- + +Released on January 6, 2024. + +- Follow up the libsass upstream: 3.6.6 --- See the release notes of LibSass + 3.6.6__. [:issue:`452` by Anthony Sottile] + +__ https://github.com/sass/libsass/releases/tag/3.6.6 + Version 0.22.0 -------------- diff --git a/docs/conf.py b/docs/conf.py index d6f6b1dc..46964c23 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -42,7 +42,7 @@ source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -64,37 +64,37 @@ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -#language = None +# language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- @@ -106,26 +106,26 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -134,44 +134,44 @@ # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'libsassdoc' @@ -201,23 +201,23 @@ # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output -------------------------------------------- @@ -232,7 +232,7 @@ ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ @@ -249,13 +249,13 @@ ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # Example configuration for intersphinx: refer to the Python standard library. @@ -267,11 +267,11 @@ extlinks = { - 'issue': ('https://github.com/sass/libsass-python/issues/%s', '#'), + 'issue': ('https://github.com/sass/libsass-python/issues/%s', '#%s'), 'branch': ( 'https://github.com/sass/libsass-python/compare/main...%s', - '', + '%s', ), - 'commit': ('https://github.com/sass/libsass-python/commit/%s', ''), - 'upcommit': ('https://github.com/sass/libsass/commit/%s', ''), + 'commit': ('https://github.com/sass/libsass-python/commit/%s', '%s'), + 'upcommit': ('https://github.com/sass/libsass/commit/%s', '%s'), } diff --git a/docs/index.rst b/docs/index.rst index 69775ba4..be2ee3f0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,13 +3,11 @@ libsass-python: Sass_/SCSS for Python This package provides a simple Python extension module :mod:`sass` which is binding LibSass_ (written in C/C++ by Hampton Catlin and Aaron Leung). -It's very straightforward and there isn't any headache related Python +It's very straightforward and there isn't any headache related to Python distribution/deployment. That means you can add just ``libsass`` into your :file:`setup.py`'s ``install_requires`` list or :file:`requirements.txt` file. -It currently supports CPython 3.6+ and PyPy 3! - .. _Sass: https://sass-lang.com/ .. _LibSass: https://github.com/sass/libsass @@ -132,20 +130,12 @@ Open source GitHub (Git repository + issues) https://github.com/sass/libsass-python -Azure Pipelines CI (linux + windows) - https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main +GitHub Actions (linux + macos + windows) - .. image:: https://dev.azure.com/asottile/asottile/_apis/build/status/sass.libsass-python?branchName=main - :target: https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main + .. image:: https://github.com/sass/libsass-python/actions/workflows/main.yml/badge.svg + :target: https://github.com/sass/libsass-python/actions/workflows/main.yml :alt: Build Status -Azure Pipelines Coverage (Test coverage) - https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main - - .. image:: https://img.shields.io/azure-devops/coverage/asottile/asottile/22/main.svg - :target: https://dev.azure.com/asottile/asottile/_build/latest?definitionId=22&branchName=main - :alt: Coverage Status - PyPI https://pypi.org/pypi/libsass/ diff --git a/libsass b/libsass index f6afdbb9..7037f03f 160000 --- a/libsass +++ b/libsass @@ -1 +1 @@ -Subproject commit f6afdbb9288d20d1257122e71d88e53348a53af3 +Subproject commit 7037f03fabeb2b18b5efa84403f5a6d7a990f460 diff --git a/sass.py b/sass.py index 4e660883..055221fb 100644 --- a/sass.py +++ b/sass.py @@ -24,7 +24,7 @@ 'SassError', 'SassFunction', 'SassList', 'SassMap', 'SassNumber', 'SassWarning', 'and_join', 'compile', 'libsass_version', ) -__version__ = '0.22.0' +__version__ = '0.23.0' libsass_version = _sass.libsass_version diff --git a/setup.cfg b/setup.cfg index 8d0ca2bb..406413ca 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,9 +1,50 @@ +[metadata] +name = libsass +version = attr: sass.__version__ +description = Sass for Python: A straightforward binding of libsass for Python. +long_description = file: README.rst +long_description_content_type = text/x-rst +url = https://sass.github.io/libsass-python/ +author = Hong Minhee +author_email = minhee@dahlia.kr +license = MIT +license_files = LICENSE +classifiers = + Development Status :: 5 - Production/Stable + Environment :: Web Environment + Intended Audience :: Developers + Operating System :: OS Independent + Programming Language :: C + Programming Language :: C++ + Programming Language :: Python :: 3 + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: Implementation :: CPython + Programming Language :: Python :: Implementation :: PyPy + Programming Language :: Python :: Implementation :: Stackless + Topic :: Internet :: WWW/HTTP + Topic :: Internet :: WWW/HTTP :: Dynamic Content + Topic :: Software Development :: Code Generators + Topic :: Software Development :: Compilers + +[options] +packages = sassutils +py_modules = + pysassc + sass + sasstests +python_requires = >=3.9 + +[options.entry_points] +console_scripts = + pysassc = pysassc:main +distutils.commands = + build_sass = sassutils.distutils:build_sass +distutils.setup_keywords = + sass_manifests = sassutils.distutils:validate_manifests + [aliases] upload_doc = build_sphinx upload_doc release = sdist upload build_sphinx upload_doc [flake8] exclude = .tox,build,dist,docs,ez_setup.py - -[metadata] -license_file = LICENSE diff --git a/setup.py b/setup.py index a3719a95..d877c2af 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,3 @@ -import ast import atexit import os.path import platform @@ -97,26 +96,7 @@ def customize_compiler(compiler): elif filename.endswith('.h'): headers.append(filename) - if sys.platform == 'win32': - from distutils.msvc9compiler import get_build_version - vscomntools_env = 'VS{}{}COMNTOOLS'.format( - int(get_build_version()), - int(get_build_version() * 10) % 10, - ) - try: - os.environ[vscomntools_env] = os.environ['VS140COMNTOOLS'] - except KeyError: - distutils.log.warn( - 'You probably need Visual Studio 2015 (14.0) ' - 'or higher', - ) - from distutils import msvccompiler, msvc9compiler - if msvccompiler.get_build_version() < 14.0: - msvccompiler.get_build_version = lambda: 14.0 - if get_build_version() < 14.0: - msvc9compiler.get_build_version = lambda: 14.0 - msvc9compiler.VERSION = 14.0 - elif platform.system() in {'Darwin', 'FreeBSD', 'OpenBSD'}: + if platform.system() in {'Darwin', 'FreeBSD', 'OpenBSD'}: # Dirty workaround to avoid link error... # Python distutils doesn't provide any way # to configure different flags for each cc and c++. @@ -169,24 +149,6 @@ def restore_cencode(): ) -def version(sass_filename='sass.py'): - with open(sass_filename) as f: - tree = ast.parse(f.read(), sass_filename) - for node in tree.body: - if isinstance(node, ast.Assign) and len(node.targets) == 1: - target, = node.targets - if isinstance(target, ast.Name) and target.id == '__version__': - return node.value.s - - -def readme(): - try: - with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f: - return f.read() - except OSError: - pass - - class upload_doc(distutils.cmd.Command): """Uploads the documentation to GitHub pages.""" @@ -237,57 +199,6 @@ def finalize_options(self): setup( - name='libsass', - description='Sass for Python: ' - 'A straightforward binding of libsass for Python.', - long_description=readme(), - version=version(), ext_modules=[sass_extension], - packages=['sassutils'], - py_modules=['pysassc', 'sass', 'sasstests'], - package_data={ - '': [ - 'README.rst', - 'test/*.sass', - ], - }, - license='MIT License', - author='Hong Minhee', - author_email='minhee' '@' 'dahlia.kr', - url='https://sass.github.io/libsass-python/', - download_url='https://github.com/sass/libsass-python/releases', - entry_points={ - 'distutils.commands': [ - 'build_sass = sassutils.distutils:build_sass', - ], - 'distutils.setup_keywords': [ - 'sass_manifests = sassutils.distutils:validate_manifests', - ], - 'console_scripts': [ - ['pysassc = pysassc:main'], - ], - }, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: C', - 'Programming Language :: C++', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: Implementation :: CPython', - 'Programming Language :: Python :: Implementation :: PyPy', - 'Programming Language :: Python :: Implementation :: Stackless', - 'Topic :: Internet :: WWW/HTTP', - 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', - 'Topic :: Software Development :: Code Generators', - 'Topic :: Software Development :: Compilers', - ], - python_requires='>=3.6', cmdclass=cmdclass, ) diff --git a/tox.ini b/tox.ini index f4b84ad0..457919de 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = pypy3,py36,py37,py38,py39,pre-commit +envlist = py,pypy3,pre-commit [testenv] usedevelop = true pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy