Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-extension-helpers for openSUSE:Factory checked in at 2022-04-06 21:51:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-extension-helpers (Old) and /work/SRC/openSUSE:Factory/.python-extension-helpers.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-extension-helpers" Wed Apr 6 21:51:37 2022 rev:3 rq:967131 version:1.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-extension-helpers/python-extension-helpers.changes 2021-02-21 22:14:24.530105495 +0100 +++ /work/SRC/openSUSE:Factory/.python-extension-helpers.new.1900/python-extension-helpers.changes 2022-04-06 21:51:59.391225882 +0200 @@ -1,0 +2,12 @@ +Tue Apr 5 15:57:58 UTC 2022 - Ben Greiner <c...@bnavigator.de> + +- Update to 1.0 + * Added support for coverage>=5 for the extension-helpers test + suite. [#24] + * Removed any direct usage of distutils. [#34] + * Remove support for the undocumented --compiler argument to + setup.py. [#36] + * Added support for enabling extension-helpers from setup.cfg. + [#33] + +------------------------------------------------------------------- Old: ---- extension-helpers-0.1.tar.gz New: ---- extension-helpers-1.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-extension-helpers.spec ++++++ --- /var/tmp/diff_new_pack.a8isIL/_old 2022-04-06 21:52:00.071218123 +0200 +++ /var/tmp/diff_new_pack.a8isIL/_new 2022-04-06 21:52:00.075218077 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-extension-helpers # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,23 +19,26 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-extension-helpers -Version: 0.1 +Version: 1.0.0 Release: 0 Summary: Utilities for building and installing packages in the Astropy ecosystem License: BSD-3-Clause URL: https://github.com/astropy/extension-helpers Source: https://files.pythonhosted.org/packages/source/e/extension-helpers/extension-helpers-%{version}.tar.gz Source100: python-extension-helpers-rpmlintrc -BuildRequires: %{python_module setuptools_scm} -BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module pip} +BuildRequires: %{python_module setuptools >= 43} +BuildRequires: %{python_module setuptools_scm >= 6.2} +BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros # SECTION test requirements BuildRequires: %{python_module devel} +BuildRequires: %{python_module numpy-devel} BuildRequires: %{python_module pytest} -BuildRequires: %{python_module numpy-devel if (%python-base without python36-base)} +BuildRequires: %{python_module wheel} # /SECTION -Requires: python-setuptools +Requires: python-setuptools >= 40.2 BuildArch: noarch %python_subpackages @@ -53,10 +56,10 @@ %setup -q -n extension-helpers-%{version} %build -%python_build +%pyproject_wheel %install -%python_install +%pyproject_install %python_expand %fdupes %{buildroot}%{$python_sitelib} %check @@ -67,6 +70,6 @@ %doc CHANGES.rst README.rst %license LICENSE.rst licenses/LICENSE_ASTROSCRAPPY.rst %{python_sitelib}/extension_helpers -%{python_sitelib}/extension_helpers-%{version}-py*.egg-info +%{python_sitelib}/extension_helpers-%{version}*-info %changelog ++++++ extension-helpers-0.1.tar.gz -> extension-helpers-1.0.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/.circleci/config.yml new/extension-helpers-1.0.0/.circleci/config.yml --- old/extension-helpers-0.1/.circleci/config.yml 2019-12-16 21:50:17.000000000 +0100 +++ new/extension-helpers-1.0.0/.circleci/config.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,39 +0,0 @@ -version: 2 - -jobs: - html-docs: - docker: - - image: circleci/python:3.6 - steps: - - checkout - - run: - name: Install Python dependencies - command: | - python3 -m venv venv - . venv/bin/activate - pip install .[docs] - - run: - name: Build Documentation - command: | - . venv/bin/activate - cd docs - make html - make linkcheck - - - store_artifacts: - path: docs/_build/html - - - run: - name: "Built documentation is available at:" - command: DOCS_URL="${CIRCLE_BUILD_URL}/artifacts/${CIRCLE_NODE_INDEX}/${CIRCLE_WORKING_DIRECTORY/#\~/$HOME}/docs/_build/html/index.html"; echo $DOCS_URL - - -workflows: - version: 2 - tests_and_docs: - jobs: - - html-docs - -notify: - webhooks: - - url: https://giles.cadair.com/circleci diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/.coveragerc new/extension-helpers-1.0.0/.coveragerc --- old/extension-helpers-0.1/.coveragerc 2019-12-16 21:50:17.000000000 +0100 +++ new/extension-helpers-1.0.0/.coveragerc 1970-01-01 01:00:00.000000000 +0100 @@ -1,32 +0,0 @@ -[run] - -source = extension_helpers - -omit = - extension_helpers/*/setup_package.py - extension_helpers/tests/* - extension_helpers/conftest.py - -[report] - -omit = - extension_helpers/*/setup_package.py - extension_helpers/tests/* - extension_helpers/conftest.py - -exclude_lines = - # Have to re-enable the standard pragma - pragma: no cover - - # Don't complain about packages we have installed - except ImportError - - # Don't complain if tests don't hit assertions - raise AssertionError - raise NotImplementedError - - # Don't complain about script hooks - def main\(.*\): - - # Ignore branches that don't pertain to this version of Python - pragma: py{ignore_python_version} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/.github/workflows/main.yml new/extension-helpers-1.0.0/.github/workflows/main.yml --- old/extension-helpers-0.1/.github/workflows/main.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/extension-helpers-1.0.0/.github/workflows/main.yml 2022-03-16 22:44:31.000000000 +0100 @@ -0,0 +1,41 @@ +name: CI + +on: + push: + pull_request: + +jobs: + tests: + uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1 + with: + posargs: --openmp-expected=True + coverage: codecov + envs: | + # Code style + - linux: style + # Docs + - linux: build_docs + # Standard tests + - linux: py36-test-oldestdeps + - linux: py37-test + - linux: py38-test + - linux: py38-test-dev + - macos: py38-test-dev + posargs: --openmp-expected=False + - windows: py36-test + runs-on: windows-2019 + - windows: py38-test-dev + runs-on: windows-2019 + # Test with more compilers, for the OpenMP helpers + - macos: py38-test-osxclang-conda + - linux: py38-test-linuxgcc-conda + # Test downstream packages + - linux: py39-downstream + publish: + needs: tests + uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@v1 + with: + test_extras: test + test_command: pytest --pyargs extension_helpers + secrets: + pypi_token: ${{ secrets.PYPI_TOKEN }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/.gitignore new/extension-helpers-1.0.0/.gitignore --- old/extension-helpers-0.1/.gitignore 2019-12-16 21:50:17.000000000 +0100 +++ new/extension-helpers-1.0.0/.gitignore 2022-03-16 22:44:31.000000000 +0100 @@ -53,3 +53,6 @@ # PyCharm .idea + +# Hypothesis +.hypothesis diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/CHANGES.rst new/extension-helpers-1.0.0/CHANGES.rst --- old/extension-helpers-0.1/CHANGES.rst 2019-12-18 13:28:02.000000000 +0100 +++ new/extension-helpers-1.0.0/CHANGES.rst 2022-03-16 22:44:31.000000000 +0100 @@ -1,4 +1,15 @@ +1.0.0 (2022-03-16) +------------------ + +* Added support for coverage>=5 for the extension-helpers test suite. [#24] + +* Removed any direct usage of distutils. [#34] + +* Remove support for the undocumented --compiler argument to setup.py. [#36] + +* Added support for enabling extension-helpers from setup.cfg. [#33] + 0.1 (2019-12-18) ---------------- -Initial release of extension-helpers, which was forked from astropy-helpers 4.0. +* Initial release of extension-helpers, which was forked from astropy-helpers 4.0. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/CONTRIBUTING.md new/extension-helpers-1.0.0/CONTRIBUTING.md --- old/extension-helpers-0.1/CONTRIBUTING.md 2019-12-16 21:50:17.000000000 +0100 +++ new/extension-helpers-1.0.0/CONTRIBUTING.md 2022-03-16 22:44:31.000000000 +0100 @@ -3,18 +3,7 @@ The guidelines for contributing to ``extension-helpers`` are generally the same as the [contributing guidelines for the astropy core -package](http://github.com/astropy/astropy/blob/master/CONTRIBUTING.md). +package](http://github.com/astropy/astropy/blob/main/CONTRIBUTING.md). Basically, report relevant issues in the ``extension-helpers`` issue tracker, and we welcome pull requests that broadly follow the [Astropy coding guidelines](http://docs.astropy.org/en/latest/development/codeguide.html). - -The key subtlety lies in understanding the relationship between ``astropy`` and -``extension-helpers``. This package contains the build, installation, and -documentation tools used by astropy. It also includes support for the -``setup.py test`` command, though Astropy is still required for this to -function (it does not currently include the full Astropy test runner). So -issues or improvements to that functionality should be addressed in this -package. Any other aspect of the [astropy core -package](http://github.com/astropy/astropy) (or any other package that uses -``extension-helpers``) should be addressed in the github repository for that -package. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/PKG-INFO new/extension-helpers-1.0.0/PKG-INFO --- old/extension-helpers-0.1/PKG-INFO 2019-12-18 13:29:05.164452600 +0100 +++ new/extension-helpers-1.0.0/PKG-INFO 2022-03-16 22:44:51.766397000 +0100 @@ -1,27 +1,11 @@ Metadata-Version: 2.1 Name: extension-helpers -Version: 0.1 -Summary: Utilities for building and installing packages in the Astropy ecosystem -Home-page: https://github.com/astropy/astropy-helpers +Version: 1.0.0 +Summary: Utilities for building and installing packages with compiled extensions +Home-page: https://github.com/astropy/extension-helpers Author: The Astropy Developers Author-email: astropy.t...@gmail.com License: BSD 3-Clause License -Description: extension-helpers - ================= - - .. image:: https://dev.azure.com/astropy-project/extension-helpers/_apis/build/status/astropy.extension-helpers?branchName=master - :target: https://dev.azure.com/astropy-project/extension-helpers/_build/latest?definitionId=4&branchName=master - - .. image:: https://codecov.io/gh/astropy/extension-helpers/branch/master/graph/badge.svg - :target: https://codecov.io/gh/astropy/extension-helpers - - The **extension-helpers** package includes convenience helpers to assist with - building Python packages with compiled C/Cython extensions. It is developed by - the Astropy project but is intended to be general and usable by any Python - package. - - For more information, see the documentation at http://extension-helpers.readthedocs.io - Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -37,3 +21,26 @@ Requires-Python: >=3.6 Provides-Extra: test Provides-Extra: docs +License-File: LICENSE.rst + +extension-helpers +================= + +.. image:: https://github.com/astropy/extension-helpers/actions/workflows/main.yml/badge.svg + :target: https://github.com/astropy/extension-helpers/actions/workflows/main.yml + +.. image:: https://codecov.io/gh/astropy/extension-helpers/branch/main/graph/badge.svg + :target: https://codecov.io/gh/astropy/extension-helpers + +.. image:: https://readthedocs.org/projects/extension-helpers/badge/?version=latest + :target: https://extension-helpers.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +The **extension-helpers** package includes convenience helpers to assist with +building Python packages with compiled C/Cython extensions. It is developed by +the Astropy project but is intended to be general and usable by any Python +package. + +For more information, see the documentation at http://extension-helpers.readthedocs.io + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/README.rst new/extension-helpers-1.0.0/README.rst --- old/extension-helpers-0.1/README.rst 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/README.rst 2022-03-16 22:44:31.000000000 +0100 @@ -1,12 +1,16 @@ extension-helpers ================= -.. image:: https://dev.azure.com/astropy-project/extension-helpers/_apis/build/status/astropy.extension-helpers?branchName=master - :target: https://dev.azure.com/astropy-project/extension-helpers/_build/latest?definitionId=4&branchName=master +.. image:: https://github.com/astropy/extension-helpers/actions/workflows/main.yml/badge.svg + :target: https://github.com/astropy/extension-helpers/actions/workflows/main.yml -.. image:: https://codecov.io/gh/astropy/extension-helpers/branch/master/graph/badge.svg +.. image:: https://codecov.io/gh/astropy/extension-helpers/branch/main/graph/badge.svg :target: https://codecov.io/gh/astropy/extension-helpers +.. image:: https://readthedocs.org/projects/extension-helpers/badge/?version=latest + :target: https://extension-helpers.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + The **extension-helpers** package includes convenience helpers to assist with building Python packages with compiled C/Cython extensions. It is developed by the Astropy project but is intended to be general and usable by any Python diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/azure-pipelines.yml new/extension-helpers-1.0.0/azure-pipelines.yml --- old/extension-helpers-0.1/azure-pipelines.yml 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/azure-pipelines.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,33 +0,0 @@ -resources: - repositories: - - repository: OpenAstronomy - type: github - endpoint: astropy - name: OpenAstronomy/azure-pipelines-templates - ref: master - -jobs: -- template: run-tox-env.yml@OpenAstronomy - parameters: - posargs: --openmp-expected=True - coverage: codecov - envs: - # Code style - - linux: style - # Docs - - linux: build_docs - # Standard tests - - linux: py36-test - - linux: py37-test - - linux: py38-test - - linux: py38-test-dev - - macos: py36-test - posargs: --openmp-expected=False - - macos: py38-test-dev - posargs: --openmp-expected=False - - windows: py36-test - - windows: py38-test-dev - # Test with more compilers, for the OpenMP helpers - - macos: py38-test-osxgcc-conda - - macos: py38-test-osxclang-conda - - linux: py38-test-linuxgcc-conda diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/docs/using.rst new/extension-helpers-1.0.0/docs/using.rst --- old/extension-helpers-0.1/docs/using.rst 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/docs/using.rst 2022-03-16 22:44:31.000000000 +0100 @@ -39,3 +39,9 @@ Note that if you use this, extension-helpers will also we create a ``packagename.compiler_version`` submodule that contain information about the compilers used. + +It is also possible to enable extension-helpers in ``setup.cfg`` instead of +``setup.py`` by adding the following configuration to the ``setup.cfg`` file:: + + [extension-helpers] + use_extension_helpers = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/__init__.py new/extension-helpers-1.0.0/extension_helpers/__init__.py --- old/extension-helpers-0.1/extension_helpers/__init__.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/__init__.py 2022-03-16 22:44:31.000000000 +0100 @@ -1,5 +1,21 @@ -from ._distutils_helpers import get_compiler +from configparser import ConfigParser + from ._openmp_helpers import add_openmp_flags_if_available -from ._setup_helpers import get_extensions, pkg_config +from ._setup_helpers import get_compiler, get_extensions, pkg_config from ._utils import import_file, write_if_different from .version import version as __version__ + + +def _finalize_distribution_hook(distribution): + """ + Entry point for setuptools which allows extension-helpers to be enabled + from setup.cfg without the need for setup.py. + """ + config_files = distribution.find_config_files() + if len(config_files) == 0: + return + cfg = ConfigParser() + cfg.read(config_files[0]) + if (cfg.has_option("extension-helpers", "use_extension_helpers") and + cfg.get("extension-helpers", "use_extension_helpers").lower() == 'true'): + distribution.ext_modules = get_extensions() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/_distutils_helpers.py new/extension-helpers-1.0.0/extension_helpers/_distutils_helpers.py --- old/extension-helpers-0.1/extension_helpers/_distutils_helpers.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/_distutils_helpers.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,115 +0,0 @@ -""" -This module contains various utilities for introspecting the distutils -module and the setup process. - -Some of these utilities require the -`extension_helpers.setup_helpers.register_commands` function to be called first, -as it will affect introspection of setuptools command-line arguments. Other -utilities in this module do not have that restriction. -""" - -import os -import sys -from distutils import ccompiler -from distutils.dist import Distribution -from distutils.errors import DistutilsError - -from ._utils import silence - -__all__ = ['get_compiler'] - - -def get_dummy_distribution(): - """ - Returns a distutils Distribution object used to instrument the setup - environment before calling the actual setup() function. - """ - - # Pre-parse the Distutils command-line options and config files to if - # the option is set. - dist = Distribution({'script_name': os.path.basename(sys.argv[0]), - 'script_args': sys.argv[1:]}) - - with silence(): - try: - dist.parse_config_files() - dist.parse_command_line() - except (DistutilsError, AttributeError, SystemExit): - # Let distutils handle DistutilsErrors itself AttributeErrors can - # get raise for ./setup.py --help SystemExit can be raised if a - # display option was used, for example - pass - - return dist - - -def get_main_package_directory(distribution): - """ - Given a Distribution object, return the main package directory. - """ - return min(distribution.packages, key=len).replace('.', os.sep) - - -def get_distutils_option(option, commands): - """ Returns the value of the given distutils option. - - Parameters - ---------- - option : str - The name of the option - - commands : list of str - The list of commands on which this option is available - - Returns - ------- - val : str or None - the value of the given distutils option. If the option is not set, - returns None. - """ - - dist = get_dummy_distribution() - - for cmd in commands: - cmd_opts = dist.command_options.get(cmd) - if cmd_opts is not None and option in cmd_opts: - return cmd_opts[option][1] - else: - return None - - -def get_distutils_build_option(option): - """ Returns the value of the given distutils build option. - - Parameters - ---------- - option : str - The name of the option - - Returns - ------- - val : str or None - The value of the given distutils build option. If the option - is not set, returns None. - """ - return get_distutils_option(option, ['build', 'build_ext', 'build_clib']) - - -def get_compiler(): - """ - Determines the compiler that will be used to build extension modules. - - Returns - ------- - compiler : str - The compiler option specified for the build, build_ext, or build_clib - command; or the default compiler for the platform if none was - specified. - - """ - - compiler = get_distutils_build_option('compiler') - if compiler is None: - return ccompiler.get_default_compiler() - - return compiler diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/_openmp_helpers.py new/extension-helpers-1.0.0/extension_helpers/_openmp_helpers.py --- old/extension-helpers-0.1/extension_helpers/_openmp_helpers.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/_openmp_helpers.py 2022-03-16 22:44:31.000000000 +0100 @@ -15,25 +15,27 @@ import sys import glob import time +import logging import datetime import tempfile import subprocess -from distutils import log -from distutils.errors import LinkError, CompileError -from distutils.ccompiler import new_compiler -from distutils.sysconfig import get_config_var, customize_compiler -from ._distutils_helpers import get_compiler +from setuptools.command.build_ext import customize_compiler, get_config_var, new_compiler + +from ._setup_helpers import get_compiler __all__ = ['add_openmp_flags_if_available'] try: # Check if this has already been instantiated, only set the default once. - _ASTROPY_DISABLE_SETUP_WITH_OPENMP_ + _EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_ except NameError: import builtins + # It hasn't, so do so. - builtins._ASTROPY_DISABLE_SETUP_WITH_OPENMP_ = False + builtins._EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_ = False + +log = logging.getLogger(__name__) CCODE = """ #include <omp.h> @@ -173,48 +175,48 @@ compile_flags = openmp_flags.get('compiler_flags') link_flags = openmp_flags.get('linker_flags') - tmp_dir = tempfile.mkdtemp() - start_dir = os.path.abspath('.') + with tempfile.TemporaryDirectory() as tmp_dir: + start_dir = os.path.abspath('.') - try: - os.chdir(tmp_dir) + try: + os.chdir(tmp_dir) - # Write test program - with open('test_openmp.c', 'w') as f: - f.write(CCODE) - - os.mkdir('objects') - - # Compile, test program - ccompiler.compile(['test_openmp.c'], output_dir='objects', - extra_postargs=compile_flags) - - # Link test program - objects = glob.glob(os.path.join('objects', '*' + ccompiler.obj_extension)) - ccompiler.link_executable(objects, 'test_openmp', - extra_postargs=link_flags) - - # Run test program - output = subprocess.check_output('./test_openmp') - output = output.decode(sys.stdout.encoding or 'utf-8').splitlines() - - if 'nthreads=' in output[0]: - nthreads = int(output[0].strip().split('=')[1]) - if len(output) == nthreads: - is_openmp_supported = True + # Write test program + with open('test_openmp.c', 'w') as f: + f.write(CCODE) + + os.mkdir('objects') + + # Compile, test program + ccompiler.compile(['test_openmp.c'], output_dir='objects', + extra_postargs=compile_flags) + + # Link test program + objects = glob.glob(os.path.join('objects', '*' + ccompiler.obj_extension)) + ccompiler.link_executable(objects, 'test_openmp', + extra_postargs=link_flags) + + # Run test program + output = subprocess.check_output('./test_openmp') + output = output.decode(sys.stdout.encoding or 'utf-8').splitlines() + + if 'nthreads=' in output[0]: + nthreads = int(output[0].strip().split('=')[1]) + if len(output) == nthreads: + is_openmp_supported = True + else: + log.warn("Unexpected number of lines from output of test OpenMP " + "program (output was {0})".format(output)) + is_openmp_supported = False else: - log.warn("Unexpected number of lines from output of test OpenMP " + log.warn("Unexpected output from test OpenMP " "program (output was {0})".format(output)) is_openmp_supported = False - else: - log.warn("Unexpected output from test OpenMP " - "program (output was {0})".format(output)) + except Exception: is_openmp_supported = False - except (CompileError, LinkError, subprocess.CalledProcessError): - is_openmp_supported = False - finally: - os.chdir(start_dir) + finally: + os.chdir(start_dir) return is_openmp_supported @@ -223,9 +225,10 @@ """ Determine whether the build compiler has OpenMP support. """ - log_threshold = log.set_threshold(log.FATAL) + log_threshold = log.level + log.setLevel('CRITICAL') ret = check_openmp_support() - log.set_threshold(log_threshold) + log.setLevel(log_threshold) return ret @@ -237,7 +240,7 @@ Returns `True` if the flags were added, `False` otherwise. """ - if _ASTROPY_DISABLE_SETUP_WITH_OPENMP_: + if _EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_: log.info("OpenMP support has been explicitly disabled.") return False @@ -258,7 +261,7 @@ _IS_OPENMP_ENABLED_SRC = """ -# Autogenerated by {packagetitle}'s setup.py on {timestamp!s} +# Autogenerated by {packagename}'s setup.py on {timestamp!s} def is_openmp_enabled(): \"\"\" @@ -275,22 +278,17 @@ OpenMP support. """ - if packagename.lower() == 'astropy': - packagetitle = 'Astropy' - else: - packagetitle = packagename - epoch = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) timestamp = datetime.datetime.utcfromtimestamp(epoch) if disable_openmp is not None: import builtins - builtins._ASTROPY_DISABLE_SETUP_WITH_OPENMP_ = disable_openmp - if _ASTROPY_DISABLE_SETUP_WITH_OPENMP_: + builtins._EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_ = disable_openmp + if _EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_: log.info("OpenMP support has been explicitly disabled.") - openmp_support = False if _ASTROPY_DISABLE_SETUP_WITH_OPENMP_ else is_openmp_supported() + openmp_support = False if _EXTENSION_HELPERS_DISABLE_OPENMP_SETUP_ else is_openmp_supported() - src = _IS_OPENMP_ENABLED_SRC.format(packagetitle=packagetitle, + src = _IS_OPENMP_ENABLED_SRC.format(packagename=packagename, timestamp=timestamp, return_bool=openmp_support) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/_setup_helpers.py new/extension-helpers-1.0.0/extension_helpers/_setup_helpers.py --- old/extension-helpers-0.1/extension_helpers/_setup_helpers.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/_setup_helpers.py 2022-03-16 22:44:31.000000000 +0100 @@ -7,18 +7,33 @@ import os import sys import shutil +import logging import subprocess -from distutils import log from collections import defaultdict -from distutils.core import Extension -from setuptools import find_packages -from setuptools.config import read_configuration +from setuptools import Extension, find_packages +from setuptools.command.build_ext import new_compiler -from ._distutils_helpers import get_compiler from ._utils import import_file, walk_skip_hidden -__all__ = ['get_extensions', 'pkg_config'] +__all__ = ['get_compiler', 'get_extensions', 'pkg_config'] + +log = logging.getLogger(__name__) + + +def get_compiler(): + """ + Determines the compiler that will be used to build extension modules. + + Returns + ------- + compiler : str + The compiler option specified for the build, build_ext, or build_clib + command; or the default compiler for the platform if none was + specified. + + """ + return new_compiler().compiler_type def get_extensions(srcdir='.'): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/_utils.py new/extension-helpers-1.0.0/extension_helpers/_utils.py --- old/extension-helpers-0.1/extension_helpers/_utils.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/_utils.py 2022-03-16 22:44:31.000000000 +0100 @@ -9,64 +9,6 @@ __all__ = ['write_if_different', 'import_file'] -# Note: The following Warning subclasses are simply copies of the Warnings in -# Astropy of the same names. -class AstropyWarning(Warning): - """ - The base warning class from which all Astropy warnings should inherit. - - Any warning inheriting from this class is handled by the Astropy logger. - """ - - -class AstropyDeprecationWarning(AstropyWarning): - """ - A warning class to indicate a deprecated feature. - """ - - -class AstropyPendingDeprecationWarning(PendingDeprecationWarning, - AstropyWarning): - """ - A warning class to indicate a soon-to-be deprecated feature. - """ - - -class _DummyFile(object): - """A noop writeable object.""" - - errors = '' - - def write(self, s): - pass - - def flush(self): - pass - - -@contextlib.contextmanager -def silence(): - """A context manager that silences sys.stdout and sys.stderr.""" - - old_stdout = sys.stdout - old_stderr = sys.stderr - sys.stdout = _DummyFile() - sys.stderr = _DummyFile() - exception_occurred = False - try: - yield - except: # noqa - exception_occurred = True - # Go ahead and clean up so that exception handling can work normally - sys.stdout = old_stdout - sys.stderr = old_stderr - raise - - if not exception_occurred: - sys.stdout = old_stdout - sys.stderr = old_stderr - - if sys.platform == 'win32': import ctypes @@ -175,7 +117,7 @@ generated from the filename. """ # Specifying a traditional dot-separated fully qualified name here - # results in a number of "Parent module 'astropy' not found while + # results in a number of "Parent module '...' not found while # handling absolute import" warnings. Using the same name, the # namespaces of the modules get merged together. So, this # generates an underscore-separated name which is more likely to @@ -185,7 +127,7 @@ if name is None: basename = os.path.splitext(filename)[0] - name = '_'.join(os.path.relpath(basename).split(os.sep)[1:]) + name = '_'.join(os.path.abspath(basename).split(os.sep)[1:]) if not os.path.exists(filename): raise ImportError('Could not import file {0}'.format(filename)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/conftest.py new/extension-helpers-1.0.0/extension_helpers/conftest.py --- old/extension-helpers-0.1/extension_helpers/conftest.py 2019-12-16 21:50:17.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/conftest.py 2022-03-16 22:44:31.000000000 +0100 @@ -9,13 +9,16 @@ try: from coverage import CoverageData + from coverage import __version__ as coverage_version except ImportError: HAS_COVERAGE = False + CoverageData = None else: - HAS_COVERAGE = True + # Set to the major version number + HAS_COVERAGE = int(coverage_version.split('.')[0]) -if HAS_COVERAGE: - SUBPROCESS_COVERAGE = [] + +SUBPROCESS_COVERAGE = [] def pytest_configure(config): @@ -27,9 +30,6 @@ if HAS_COVERAGE: - # We create an empty coverage data object - combined_cdata = CoverageData() - # Add all files from extension_helpers to make sure we compute the total # coverage, not just the coverage of the files that have non-zero # coverage. @@ -52,6 +52,14 @@ if os.path.exists(short_filename): lines[os.path.abspath(short_filename)].extend(cdata.lines(filename)) - combined_cdata.add_lines(lines) - - combined_cdata.write_file('.coverage.subprocess') + if HAS_COVERAGE >= 5: + # Support coverage<5 and >=5; see + # https://github.com/astropy/extension-helpers/issues/24 + # We create an empty coverage data object + combined_cdata = CoverageData(suffix='subprocess') + combined_cdata.add_lines(lines) + combined_cdata.write() + else: + combined_cdata = CoverageData() + combined_cdata.add_lines(lines) + combined_cdata.write_file('.coverage.subprocess') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/tests/__init__.py new/extension-helpers-1.0.0/extension_helpers/tests/__init__.py --- old/extension-helpers-0.1/extension_helpers/tests/__init__.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/tests/__init__.py 2022-03-16 22:44:31.000000000 +0100 @@ -4,13 +4,7 @@ import pytest -try: - from coverage import CoverageData -except ImportError: - HAS_COVERAGE = False -else: - HAS_COVERAGE = True - from ..conftest import SUBPROCESS_COVERAGE +from ..conftest import HAS_COVERAGE, SUBPROCESS_COVERAGE, CoverageData PACKAGE_DIR = os.path.dirname(__file__) @@ -65,7 +59,13 @@ stdout, stderr = p.communicate() cdata = CoverageData() - cdata.read_file(os.path.join(path, '.coverage')) + if HAS_COVERAGE >= 5: + # Support coverage<5 and >=5; see + # https://github.com/astropy/extension-helpers/issues/24 + cdata.read() + else: + cdata.read_file(os.path.join(path, '.coverage')) + SUBPROCESS_COVERAGE.append(cdata) else: @@ -83,18 +83,6 @@ raise SystemExit(p.returncode) -@pytest.fixture(scope='function', autouse=True) -def reset_distutils_log(): - """ - This is a setup/teardown fixture that ensures the log-level of the - distutils log is always set to a default of WARN, since different - settings could affect tests that check the contents of stdout. - """ - - from distutils import log - log.set_threshold(log.WARN) - - TEST_PACKAGE_SETUP_PY = """\ #!/usr/bin/env python diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/tests/test_openmp_helpers.py new/extension-helpers-1.0.0/extension_helpers/tests/test_openmp_helpers.py --- old/extension-helpers-0.1/extension_helpers/tests/test_openmp_helpers.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/tests/test_openmp_helpers.py 2022-03-16 22:44:31.000000000 +0100 @@ -1,20 +1,24 @@ + import os import sys import types from copy import deepcopy from importlib import machinery -from distutils.core import Extension import pytest +from setuptools import Extension from .._openmp_helpers import add_openmp_flags_if_available, generate_openmp_enabled_py @pytest.fixture def openmp_expected(request): - openmp_expected = request.config.getoption("--openmp-expected") - if openmp_expected is not None: - return openmp_expected.lower() == 'true' + try: + openmp_expected = request.config.getoption("--openmp-expected") + if openmp_expected is not None: + return openmp_expected.lower() == 'true' + except ValueError: + return None def test_add_openmp_flags_if_available(openmp_expected): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/tests/test_setup_helpers.py new/extension-helpers-1.0.0/extension_helpers/tests/test_setup_helpers.py --- old/extension-helpers-0.1/extension_helpers/tests/test_setup_helpers.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/tests/test_setup_helpers.py 2022-03-16 22:44:31.000000000 +0100 @@ -1,12 +1,13 @@ import os import sys +import uuid import importlib +import subprocess from textwrap import dedent import pytest -from .._setup_helpers import get_extensions -from . import reset_distutils_log # noqa +from .._setup_helpers import get_compiler, get_extensions from . import cleanup_import, run_setup extension_helpers_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) # noqa @@ -20,19 +21,26 @@ os.remove(tmpfile) +POSSIBLE_COMPILERS = ['unix', 'msvc', 'bcpp', 'cygwin', 'mingw32'] + + +def test_get_compiler(): + assert get_compiler() in POSSIBLE_COMPILERS + + def _extension_test_package(tmpdir, request, extension_type='c', include_numpy=False): """Creates a simple test package with an extension module.""" test_pkg = tmpdir.mkdir('test_pkg') - test_pkg.mkdir('apyhtest_eva').ensure('__init__.py') + test_pkg.mkdir('helpers_test_package').ensure('__init__.py') # TODO: It might be later worth making this particular test package into a # reusable fixture for other build_ext tests if extension_type in ('c', 'both'): # A minimal C extension for testing - test_pkg.join('apyhtest_eva', 'unit01.c').write(dedent("""\ + test_pkg.join('helpers_test_package', 'unit01.c').write(dedent("""\ #include <Python.h> static struct PyModuleDef moduledef = { @@ -50,7 +58,7 @@ if extension_type in ('pyx', 'both'): # A minimal Cython extension for testing - test_pkg.join('apyhtest_eva', 'unit02.pyx').write(dedent("""\ + test_pkg.join('helpers_test_package', 'unit02.pyx').write(dedent("""\ print("Hello cruel angel.") """)) @@ -64,11 +72,13 @@ include_dirs = ['numpy'] if include_numpy else [] extensions_list = [ - "Extension('apyhtest_eva.{0}', [join('apyhtest_eva', '{1}')], include_dirs={2})".format( + "Extension('helpers_test_package.{0}', " + "[join('helpers_test_package', '{1}')], " + "include_dirs={2})".format( os.path.splitext(extension)[0], extension, include_dirs) for extension in extensions] - test_pkg.join('apyhtest_eva', 'setup_package.py').write(dedent("""\ + test_pkg.join('helpers_test_package', 'setup_package.py').write(dedent("""\ from setuptools import Extension from os.path import join def get_extensions(): @@ -83,7 +93,7 @@ from extension_helpers import get_extensions setup( - name='apyhtest_eva', + name='helpers_test_package', version='0.1', packages=find_packages(), ext_modules=get_extensions() @@ -96,7 +106,7 @@ sys.path.insert(0, '') def finalize(): - cleanup_import('apyhtest_eva') + cleanup_import('helpers_test_package') request.addfinalizer(finalize) @@ -123,7 +133,7 @@ def test_cython_autoextensions(tmpdir): """ - Regression test for https://github.com/astropy/extension-helpers/pull/19 + Regression test for https://github.com/astropy/astropy-helpers/pull/19 Ensures that Cython extensions in sub-packages are discovered and built only once. @@ -163,10 +173,107 @@ '--record={0}'.format(install_temp.join('record.txt'))]) with install_temp.as_cwd(): - import apyhtest_eva - # Make sure we imported the apyhtest_eva package from the correct place - dirname = os.path.abspath(os.path.dirname(apyhtest_eva.__file__)) - assert dirname == str(install_temp.join('apyhtest_eva')) + import helpers_test_package + + # Make sure we imported the helpers_test_package package from the correct place + dirname = os.path.abspath(os.path.dirname(helpers_test_package.__file__)) + assert dirname == str(install_temp.join('helpers_test_package')) + + import helpers_test_package.compiler_version + assert helpers_test_package.compiler_version != 'unknown' + + +@pytest.mark.parametrize('use_extension_helpers', [None, False, True]) +def test_no_setup_py(tmpdir, use_extension_helpers): + """ + Test that makes sure that extension-helpers can be enabled without a + setup.py file. + """ + + package_name = 'helpers_test_package_' + str(uuid.uuid4()).replace('-', '_') + + test_pkg = tmpdir.mkdir('test_pkg') + test_pkg.mkdir(package_name).ensure('__init__.py') + + simple_c = test_pkg.join(package_name, 'simple.c') + + simple_c.write(dedent("""\ + #include <Python.h> + + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "simple", + NULL, + -1, + NULL + }; + PyMODINIT_FUNC + PyInit_simple(void) { + return PyModule_Create(&moduledef); + } + """)) + + test_pkg.join(package_name, 'setup_package.py').write(dedent(f"""\ + from setuptools import Extension + from os.path import join + def get_extensions(): + return [Extension('{package_name}.simple', [join('{package_name}', 'simple.c')])] + """)) + + if use_extension_helpers is None: + test_pkg.join('setup.cfg').write(dedent(f"""\ + [metadata] + name = {package_name} + version = 0.1 + + [options] + packages = find: + """)) + else: + test_pkg.join('setup.cfg').write(dedent(f"""\ + [metadata] + name = {package_name} + version = 0.1 + + [options] + packages = find: + + [extension-helpers] + use_extension_helpers = {str(use_extension_helpers).lower()} + """)) + + test_pkg.join('pyproject.toml').write(dedent("""\ + [build-system] + requires = ["setuptools>=43.0.0", + "wheel"] + build-backend = 'setuptools.build_meta' + """)) + + install_temp = test_pkg.mkdir('install_temp') + + with test_pkg.as_cwd(): + # NOTE: we disable build isolation as we need to pick up the current + # developer version of extension-helpers + subprocess.call([sys.executable, '-m', 'pip', 'install', '.', + '--no-build-isolation', + f'--target={install_temp}']) + + if '' in sys.path: + sys.path.remove('') + + sys.path.insert(0, '') + + with install_temp.as_cwd(): + + importlib.import_module(package_name) - import apyhtest_eva.compiler_version - assert apyhtest_eva.compiler_version != 'unknown' + if use_extension_helpers: + compiler_version_mod = importlib.import_module(package_name + '.compiler_version') + assert compiler_version_mod.compiler != 'unknown' + else: + try: + importlib.import_module(package_name + '.compiler_version') + except ImportError: + pass + else: + raise AssertionError(package_name + '.compiler_version should not exist') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/tests/test_utils.py new/extension-helpers-1.0.0/extension_helpers/tests/test_utils.py --- old/extension-helpers-0.1/extension_helpers/tests/test_utils.py 1970-01-01 01:00:00.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/tests/test_utils.py 2022-03-16 22:44:31.000000000 +0100 @@ -0,0 +1,26 @@ +import os +import time + +from .._utils import import_file, write_if_different + + +def test_import_file(tmpdir): + filename = str(tmpdir / 'spam.py') + with open(filename, 'w') as f: + f.write('magic = 12345') + module = import_file(filename) + assert module.magic == 12345 + + +def test_write_if_different(tmpdir): + filename = str(tmpdir / 'test.txt') + write_if_different(filename, b'abc') + time1 = os.path.getmtime(filename) + time.sleep(0.01) + write_if_different(filename, b'abc') + time2 = os.path.getmtime(filename) + assert time2 == time1 + time.sleep(0.01) + write_if_different(filename, b'abcd') + time3 = os.path.getmtime(filename) + assert time3 > time1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers/version.py new/extension-helpers-1.0.0/extension_helpers/version.py --- old/extension-helpers-0.1/extension_helpers/version.py 2019-12-18 13:29:04.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers/version.py 2022-03-16 22:44:50.000000000 +0100 @@ -1,4 +1,5 @@ # coding: utf-8 # file generated by setuptools_scm # don't change, don't track in version control -version = '0.1' +version = '1.0.0' +version_tuple = (1, 0, 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers.egg-info/PKG-INFO new/extension-helpers-1.0.0/extension_helpers.egg-info/PKG-INFO --- old/extension-helpers-0.1/extension_helpers.egg-info/PKG-INFO 2019-12-18 13:29:04.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers.egg-info/PKG-INFO 2022-03-16 22:44:51.000000000 +0100 @@ -1,27 +1,11 @@ Metadata-Version: 2.1 Name: extension-helpers -Version: 0.1 -Summary: Utilities for building and installing packages in the Astropy ecosystem -Home-page: https://github.com/astropy/astropy-helpers +Version: 1.0.0 +Summary: Utilities for building and installing packages with compiled extensions +Home-page: https://github.com/astropy/extension-helpers Author: The Astropy Developers Author-email: astropy.t...@gmail.com License: BSD 3-Clause License -Description: extension-helpers - ================= - - .. image:: https://dev.azure.com/astropy-project/extension-helpers/_apis/build/status/astropy.extension-helpers?branchName=master - :target: https://dev.azure.com/astropy-project/extension-helpers/_build/latest?definitionId=4&branchName=master - - .. image:: https://codecov.io/gh/astropy/extension-helpers/branch/master/graph/badge.svg - :target: https://codecov.io/gh/astropy/extension-helpers - - The **extension-helpers** package includes convenience helpers to assist with - building Python packages with compiled C/Cython extensions. It is developed by - the Astropy project but is intended to be general and usable by any Python - package. - - For more information, see the documentation at http://extension-helpers.readthedocs.io - Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -37,3 +21,26 @@ Requires-Python: >=3.6 Provides-Extra: test Provides-Extra: docs +License-File: LICENSE.rst + +extension-helpers +================= + +.. image:: https://github.com/astropy/extension-helpers/actions/workflows/main.yml/badge.svg + :target: https://github.com/astropy/extension-helpers/actions/workflows/main.yml + +.. image:: https://codecov.io/gh/astropy/extension-helpers/branch/main/graph/badge.svg + :target: https://codecov.io/gh/astropy/extension-helpers + +.. image:: https://readthedocs.org/projects/extension-helpers/badge/?version=latest + :target: https://extension-helpers.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +The **extension-helpers** package includes convenience helpers to assist with +building Python packages with compiled C/Cython extensions. It is developed by +the Astropy project but is intended to be general and usable by any Python +package. + +For more information, see the documentation at http://extension-helpers.readthedocs.io + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers.egg-info/SOURCES.txt new/extension-helpers-1.0.0/extension_helpers.egg-info/SOURCES.txt --- old/extension-helpers-0.1/extension_helpers.egg-info/SOURCES.txt 2019-12-18 13:29:05.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers.egg-info/SOURCES.txt 2022-03-16 22:44:51.000000000 +0100 @@ -1,4 +1,3 @@ -.coveragerc .gitignore .readthedocs.yml CHANGES.rst @@ -6,13 +5,11 @@ LICENSE.rst MANIFEST.in README.rst -azure-pipelines.yml conftest.py pyproject.toml setup.cfg -setup.py tox.ini -.circleci/config.yml +.github/workflows/main.yml docs/Makefile docs/api.rst docs/conf.py @@ -21,7 +18,6 @@ docs/openmp.rst docs/using.rst extension_helpers/__init__.py -extension_helpers/_distutils_helpers.py extension_helpers/_openmp_helpers.py extension_helpers/_setup_helpers.py extension_helpers/_utils.py @@ -30,6 +26,7 @@ extension_helpers.egg-info/PKG-INFO extension_helpers.egg-info/SOURCES.txt extension_helpers.egg-info/dependency_links.txt +extension_helpers.egg-info/entry_points.txt extension_helpers.egg-info/not-zip-safe extension_helpers.egg-info/requires.txt extension_helpers.egg-info/top_level.txt @@ -37,4 +34,5 @@ extension_helpers/tests/__init__.py extension_helpers/tests/test_openmp_helpers.py extension_helpers/tests/test_setup_helpers.py +extension_helpers/tests/test_utils.py licenses/LICENSE_ASTROSCRAPPY.rst \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers.egg-info/entry_points.txt new/extension-helpers-1.0.0/extension_helpers.egg-info/entry_points.txt --- old/extension-helpers-0.1/extension_helpers.egg-info/entry_points.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers.egg-info/entry_points.txt 2022-03-16 22:44:51.000000000 +0100 @@ -0,0 +1,2 @@ +[setuptools.finalize_distribution_options] +extension_helpers_get_extensions = extension_helpers:_finalize_distribution_hook diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/extension_helpers.egg-info/requires.txt new/extension-helpers-1.0.0/extension_helpers.egg-info/requires.txt --- old/extension-helpers-0.1/extension_helpers.egg-info/requires.txt 2019-12-18 13:29:04.000000000 +0100 +++ new/extension-helpers-1.0.0/extension_helpers.egg-info/requires.txt 2022-03-16 22:44:51.000000000 +0100 @@ -1,8 +1,11 @@ +setuptools>=40.2 [docs] -sphinx-astropy +sphinx +sphinx-automodapi [test] -pytest-astropy +wheel +pytest pytest-cov -coverage<5 +coverage>=4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/pyproject.toml new/extension-helpers-1.0.0/pyproject.toml --- old/extension-helpers-0.1/pyproject.toml 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/pyproject.toml 2022-03-16 22:44:31.000000000 +0100 @@ -1,5 +1,8 @@ [build-system] -requires = ["setuptools", - "setuptools_scm", +requires = ["setuptools>=43.0.0", + "setuptools_scm>=6.2", "wheel"] build-backend = 'setuptools.build_meta' + +[tool.setuptools_scm] +write_to = "extension_helpers/version.py" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/setup.cfg new/extension-helpers-1.0.0/setup.cfg --- old/extension-helpers-0.1/setup.cfg 2019-12-18 13:29:05.166231600 +0100 +++ new/extension-helpers-1.0.0/setup.cfg 2022-03-16 22:44:51.766397000 +0100 @@ -5,8 +5,8 @@ author_email = astropy.t...@gmail.com license = BSD 3-Clause License license_file = LICENSE.rst -url = https://github.com/astropy/astropy-helpers -description = Utilities for building and installing packages in the Astropy ecosystem +url = https://github.com/astropy/extension-helpers +description = Utilities for building and installing packages with compiled extensions long_description = file: README.rst classifiers = Development Status :: 5 - Production/Stable @@ -24,17 +24,25 @@ zip_safe = False python_requires = >=3.6 packages = find: +install_requires = + setuptools>=40.2 [options.package_data] extension_helpers = src/compiler.c +[options.entry_points] +setuptools.finalize_distribution_options = + extension_helpers_get_extensions = extension_helpers:_finalize_distribution_hook + [options.extras_require] test = - pytest-astropy + wheel + pytest pytest-cov - coverage<5 + coverage>=4 docs = - sphinx-astropy + sphinx + sphinx-automodapi [tool:pytest] norecursedirs = @@ -51,7 +59,27 @@ multi_line_output = 0 balanced_wrapping = True include_trailing_comma = false -length_sort_stdlib = true +length_sort = False +length_sort_sections = stdlib + +[coverage:run] +omit = + extension_helpers/*/setup_package.py + extension_helpers/tests/* + extension_helpers/conftest.py + */extension_helpers/*/setup_package.py + */extension_helpers/tests/* + */extension_helpers/conftest.py + +[coverage:report] +exclude_lines = + pragma: no cover + except ImportError + raise AssertionError + raise NotImplementedError + def main\(.*\): + pragma: py{ignore_python_version} + def _ipython_key_completions_ [egg_info] tag_build = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/setup.py new/extension-helpers-1.0.0/setup.py --- old/extension-helpers-0.1/setup.py 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/setup.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# Licensed under a 3-clause BSD style license - see LICENSE.rst - -# NOTE: most of the configuration, including the version number, -# is defined in setup.cfg - -import os -import sys -from distutils.version import LooseVersion - -import setuptools -from setuptools import setup - -if LooseVersion(setuptools.__version__) < '30.3': - sys.stderr.write("ERROR: setuptools 30.3 or later is required by extension-helpers\n") - sys.exit(1) - -setup(use_scm_version={'write_to': os.path.join('extension_helpers', 'version.py')}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extension-helpers-0.1/tox.ini new/extension-helpers-1.0.0/tox.ini --- old/extension-helpers-0.1/tox.ini 2019-12-18 13:27:20.000000000 +0100 +++ new/extension-helpers-1.0.0/tox.ini 2022-03-16 22:44:31.000000000 +0100 @@ -1,6 +1,6 @@ [tox] envlist = - py{36,37,38}-test{,-conda} + py{36,37,38,39,310}-test{,-conda} build_docs pycodestyle requires = @@ -9,10 +9,11 @@ isolated_build = true [testenv] +passenv = + CONDA_BUILD_SYSROOT setenv = - osxgcc: CC=gcc - osxclang: CC=clang-4.0 - linuxgcc: CC=x86_64-conda_cos6-linux-gnu-gcc + osxclang: CC=clang-10 + linuxgcc: CC=gcc_linux-64 changedir = test: .tmp/{envname} build_docs: docs @@ -22,26 +23,36 @@ test: run tests with pytest build_docs: invoke sphinx-build to build the HTML docs all: run tests with all optional dependencies - dev: run tests with numpy and astropy dev versions + dev: run tests with setuptools dev versions + oldestdeps: run tests with oldest supported version of setuptools +deps = + oldestdeps: setuptools==42.0 conda_deps = - osxgcc: gcc - osxclang: clang_osx-64 + osxclang: clang_osx-64==10 osxclang: llvm-openmp linuxgcc: gcc_linux-64 conda_channels = - osxgcc: conda-forge + linuxgcc: conda-forge extras = test: test build_docs: docs all: all commands = - dev: bash -ec "rm -rf setuptools_repo; git clone https://github.com/pypa/setuptools.git setuptools_repo && cd setuptools_repo && python bootstrap.py" - dev: pip install setuptools_repo/ --no-build-isolation + dev: pip install git+https://github.com/pypa/setuptools.git pip freeze test: python -c 'import setuptools; print(setuptools.__version__)' - test: pytest --pyargs extension_helpers {toxinidir}/docs --cov extension_helpers {posargs} + test: pytest --pyargs extension_helpers {toxinidir}/docs --cov extension_helpers --cov-config={toxinidir}/setup.cfg {posargs} build_docs: sphinx-build -W -b html . _build/html +[testenv:py39-downstream] +changedir = test: .tmp/downstream +commands = + pip install setuptools setuptools_scm wheel cython numpy + pip install --no-build-isolation "git+https://github.com/astropy/astropy#egg=astropy[test]" + pytest --pyargs astropy + pip install --no-build-isolation "git+https://github.com/sunpy/sunpy#egg=sunpy[all,tests]" + pytest --pyargs sunpy + [testenv:style] skip_install = true description = invoke pycodestyle and isort on package code @@ -50,4 +61,4 @@ isort commands = pycodestyle extension_helpers --max-line-length=100 - isort -c -rc extension_helpers + isort -c extension_helpers