From bcaad115d6dd063cf864850462d9a3d52c91e9cc Mon Sep 17 00:00:00 2001 From: Hynek Schlawack Date: Sat, 6 Aug 2022 10:04:05 +0200 Subject: [PATCH] Revert to setup.py b/c we can't have nice things --- MANIFEST.in | 24 ++++++++++ pyproject.toml | 114 ++++---------------------------------------- setup.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ tox.ini | 11 +---- 4 files changed, 160 insertions(+), 116 deletions(-) create mode 100644 MANIFEST.in create mode 100644 setup.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..6dbe985e7 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,24 @@ +include LICENSE *.rst *.toml *.yml *.yaml *.ini CITATION.cff +graft .github + +# Stubs +recursive-include src *.pyi +recursive-include src py.typed + +# Tests +include tox.ini conftest.py +recursive-include tests *.py +recursive-include tests *.yml + +# Documentation +include docs/Makefile docs/docutils.conf +recursive-include docs *.png +recursive-include docs *.svg +recursive-include docs *.py +recursive-include docs *.rst +prune docs/_build + +# Just to keep check-manifest happy; on releases those files are gone. +# Last rule wins! +exclude changelog.d/*.rst +include changelog.d/towncrier_template.rst diff --git a/pyproject.toml b/pyproject.toml index d3c5054dc..097646f23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,112 +1,15 @@ # SPDX-License-Identifier: MIT [build-system] -requires = ["hatchling", "hatch-fancy-pypi-readme"] -build-backend = "hatchling.build" +requires = ["setuptools>=40.6.0", "wheel"] +build-backend = "setuptools.build_meta" -[project] -name = "attrs" -version = "22.2.0.dev0" -authors = [{ name = "Hynek Schlawack", email = "hs@ox.cx" }] -requires-python = ">=3.6" -description = "Classes Without Boilerplate" -keywords = ["class", "attribute", "boilerplate"] -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Natural Language :: English", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "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 :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Software Development :: Libraries :: Python Modules", -] -dependencies = ["importlib_metadata;python_version<'3.8'"] -dynamic = ["readme"] - -[project.optional-dependencies] -tests_no_zope = [ - # For regression test to ensure cloudpickle compat doesn't break. - 'cloudpickle; python_implementation == "CPython"', - # 5.0 introduced toml; parallel was broken until 5.0.2 - "coverage[toml]>=5.0.2", - "hypothesis", - "pympler", - # 4.3.0 dropped last use of `convert` - "pytest>=4.3.0", - # Since the mypy error messages keep changing, we have to keep updating this - # pin. - 'mypy>=0.971; python_implementation == "CPython"', - 'pytest-mypy-plugins; python_implementation == "CPython"', -] -tests = ["attrs[tests_no_zope]", "zope.interface"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -dev = ["attrs[tests,docs]", "pre-commit"] - -[project.urls] -Documentation = "https://www.attrs.org/" -Changelog = "https://www.attrs.org/en/stable/changelog.html" -"Bug Tracker" = "https://github.com/python-attrs/attrs/issues" -"Source Code" = "https://github.com/python-attrs/attrs" -Funding = "https://github.com/sponsors/hynek" -Tidelift = "https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi" -Ko-fi = "https://ko-fi.com/the_hynek" - - -[tool.hatch.build.targets.wheel] -packages = ["src/attr", "src/attrs"] - - -[tool.hatch.metadata.hooks.fancy-pypi-readme] -content-type = "text/x-rst" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -text = """ -.. image:: https://www.attrs.org/en/stable/_static/attrs_logo.png - :alt: attrs logo - :align: center -""" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -path = "README.rst" -start-after = ".. teaser-begin" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -text = """ - - -Release Information -=================== - - -""" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -path = "CHANGELOG.rst" -pattern = ".. towncrier release notes start\n\n(.*?)\n----\n" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -text = """ - -`Full changelog `_ - - - -""" - - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -path = "AUTHORS.rst" - +[tool.pytest.ini_options] +addopts = ["-ra", "--strict-markers", "--strict-config"] +xfail_strict = true +testpaths = "tests" +filterwarnings = ["once::Warning", "ignore:::pympler[.*]"] [tool.coverage.run] parallel = true @@ -145,8 +48,7 @@ profile = "attrs" [tool.towncrier] -package = "attr" -package_dir = "src" +name = "attrs" filename = "CHANGELOG.rst" template = "changelog.d/towncrier_template.rst" issue_format = "`#{issue} `_" diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..656120d81 --- /dev/null +++ b/setup.py @@ -0,0 +1,127 @@ +# SPDX-License-Identifier: MIT + +import codecs +import os +import re + +from setuptools import find_packages, setup + + +############################################################################### + +NAME = "attrs" +URL = "https://www.attrs.org/" +PACKAGES = find_packages(where="src") +KEYWORDS = ["class", "attribute", "boilerplate"] +PROJECT_URLS = { + "Documentation": "https://www.attrs.org/", + "Changelog": "https://www.attrs.org/en/stable/changelog.html", + "Bug Tracker": "https://github.com/python-attrs/attrs/issues", + "Source Code": "https://github.com/python-attrs/attrs", + "Funding": "https://github.com/sponsors/hynek", + "Tidelift": "https://tidelift.com/subscription/pkg/pypi-attrs?" + "utm_source=pypi-attrs&utm_medium=pypi", + "Ko-fi": "https://ko-fi.com/the_hynek", +} +CLASSIFIERS = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Natural Language :: English", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "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 :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Software Development :: Libraries :: Python Modules", +] +INSTALL_REQUIRES = ["importlib_metadata;python_version<'3.8'"] +EXTRAS_REQUIRE = { + "docs": ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"], + "tests_no_zope": [ + # For regression test to ensure cloudpickle compat doesn't break. + 'cloudpickle; python_implementation == "CPython"', + # 5.0 introduced toml; parallel was broken until 5.0.2 + "coverage[toml]>=5.0.2", + "hypothesis", + "pympler", + # 4.3.0 dropped last use of `convert` + "pytest>=4.3.0", + # Since the mypy error messages keep changing, we have to keep updating + # this pin. + "mypy>=0.971; python_implementation == 'CPython'", + "pytest-mypy-plugins; python_implementation == 'CPython'", + ], + "tests": [ + "attrs[tests_no_zope]", + "zope.interface", + ], + "dev": ["attrs[docs,tests]", "pre-commit"], +} + +############################################################################### + +HERE = os.path.abspath(os.path.dirname(__file__)) + + +def read(*parts): + """ + Build an absolute path from *parts* and return the contents of the + resulting file. Assume UTF-8 encoding. + """ + with codecs.open(os.path.join(HERE, *parts), "rb", "utf-8") as f: + return f.read() + + +LOGO = """ +.. image:: https://www.attrs.org/en/stable/_static/attrs_logo.png + :alt: attrs logo + :align: center +""" + +LONG = ( + LOGO + + read("README.rst").split(".. teaser-begin")[1] + + "\n\n" + + "Release Information\n" + + "===================\n\n" + + re.search( + r"(\d+.\d.\d \(.*?\)\r?\n.*?)\r?\n\r?\n\r?\n----\r?\n\r?\n\r?\n", + read("CHANGELOG.rst"), + re.S, + ).group(1) + + "\n\n`Full changelog " + + f"<{URL}en/stable/changelog.html>`_.\n\n" + + read("AUTHORS.rst") +) + + +if __name__ == "__main__": + setup( + name=NAME, + description="Classes Without Boilerplate", + license="MIT", + url=URL, + project_urls=PROJECT_URLS, + version="22.2.0.dev0", + author="Hynek Schlawack", + author_email="hs@ox.cx", + keywords=KEYWORDS, + long_description=LONG, + long_description_content_type="text/x-rst", + packages=PACKAGES, + package_dir={"": "src"}, + python_requires=">=3.6", + zip_safe=False, + classifiers=CLASSIFIERS, + install_requires=INSTALL_REQUIRES, + extras_require=EXTRAS_REQUIRE, + include_package_data=True, + options={"bdist_wheel": {"universal": "1"}}, + ) diff --git a/tox.ini b/tox.ini index 15b2d3e4c..2d692d046 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,3 @@ -[pytest] -addopts = -ra -testpaths = tests -xfail_strict = true -filterwarnings = - once::Warning - ignore:::pympler[.*] - - # Keep docs in sync with docs env and .readthedocs.yml. [gh-actions] python = @@ -97,7 +88,7 @@ commands = basepython = python3.8 deps = towncrier skip_install = true -commands = towncrier build --name attrs --version in-dev --draft +commands = towncrier build --version UNRELEASED --draft [testenv:typing]