diff options
author | Ole Streicher <ole@aip.de> | 2022-01-03 08:52:27 +0100 |
---|---|---|
committer | Ole Streicher <ole@aip.de> | 2022-01-03 08:52:27 +0100 |
commit | 4deef5926a92abf01e2e3d04e6067dbc625e1bad (patch) | |
tree | 5ece915e27d3e704765506adb2681b49edc76a5f | |
parent | 2241ffbbe69f1a9c17608ae9d16ba5b34414ed3d (diff) |
New upstream version 0.4.0
-rw-r--r-- | .github/workflows/ci_workflows.yml | 53 | ||||
-rw-r--r-- | .github/workflows/publish.yml | 48 | ||||
-rw-r--r-- | .gitignore | 63 | ||||
-rw-r--r-- | CHANGES.md | 7 | ||||
-rw-r--r-- | MANIFEST.in | 3 | ||||
-rw-r--r-- | PKG-INFO | 415 | ||||
-rw-r--r-- | README.rst | 13 | ||||
-rw-r--r-- | pyproject.toml | 5 | ||||
-rw-r--r-- | pytest_arraydiff.egg-info/PKG-INFO | 415 | ||||
-rw-r--r-- | pytest_arraydiff.egg-info/SOURCES.txt | 7 | ||||
-rw-r--r-- | pytest_arraydiff.egg-info/requires.txt | 4 | ||||
-rwxr-xr-x | pytest_arraydiff/__init__.py | 4 | ||||
-rwxr-xr-x | pytest_arraydiff/plugin.py | 32 | ||||
-rw-r--r-- | pytest_arraydiff/version.py | 5 | ||||
-rw-r--r-- | setup.cfg | 50 | ||||
-rwxr-xr-x | setup.py | 39 | ||||
-rw-r--r-- | tests/test_pytest_arraydiff.py | 24 | ||||
-rw-r--r-- | tox.ini | 32 |
18 files changed, 720 insertions, 499 deletions
diff --git a/.github/workflows/ci_workflows.yml b/.github/workflows/ci_workflows.yml new file mode 100644 index 0000000..286cdb6 --- /dev/null +++ b/.github/workflows/ci_workflows.yml @@ -0,0 +1,53 @@ +name: CI + +on: + pull_request: + push: + schedule: + # Run every Sunday at 06:53 UTC + - cron: 53 6 * * 0 + +jobs: + tests: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + python-version: 3.7 + toxenv: py37-test-pytest46 + - os: windows-latest + python-version: 3.7 + toxenv: py37-test-pytest50 + - os: macos-latest + python-version: 3.8 + toxenv: py38-test-pytest52 + - os: ubuntu-latest + python-version: 3.8 + toxenv: py38-test-pytest53 + - os: windows-latest + python-version: 3.9 + toxenv: py39-test-pytest60 + - os: macos-latest + python-version: 3.9 + toxenv: py39-test-pytest61 + - os: ubuntu-latest + python-version: '3.10' + toxenv: py310-test-pytest62 + - os: ubuntu-latest + python-version: '3.10' + toxenv: py310-test-pytestdev + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install tox + run: python -m pip install tox + - name: Run tox + run: tox -v -e ${{ matrix.toxenv }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..2631bf7 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,48 @@ +name: Release + +on: + pull_request: + push: + tags: + - '*' + +jobs: + build-n-publish: + name: Build and publish Python 🐍 distributions 📦 to PyPI + runs-on: ubuntu-latest + if: ((github.event_name == 'push' && startsWith(github.ref, 'refs/tags')) || contains(github.event.pull_request.labels.*.name, 'Build wheels')) + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Install python-build and twine + run: python -m pip install pip build "twine>=3.3" -U + + - name: Build package + run: python -m build --sdist --wheel . + + - name: List result + run: ls -l dist + + - name: Check long_description + run: python -m twine check --strict dist/* + + # FIXME: pytest not found + #- name: Test package + # run: | + # cd .. + # python -m venv testenv + # testenv/bin/pip install pytest pytest-arraydiff/dist/*.whl + # testenv/bin/pytest pytest-arraydiff/tests --arraydiff + + - name: Publish distribution 📦 to PyPI + if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.pypi_password }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fca8de1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Compiled files +*.py[cod] +*.a +*.o +*.so +*.pyd +__pycache__ + +# Ignore .c files by default to avoid including generated code. If you want to +# add a non-generated .c extension, use `git add -f filename.c`. +*.c + +# Other generated files +MANIFEST + +# Sphinx +_build +_generated +docs/api +docs/generated + +# Packages/installer info +*.egg +*.egg-info +dist +build +eggs +.eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +distribute-*.tar.gz + +# Other +.cache +.tox +.*.swp +.*.swo +*~ +.project +.pydevproject +.settings +.coverage +cover +htmlcov +.pytest_cache + +# Env +.venv +venv +.env + +# Mac OSX +.DS_Store + +# PyCharm +.idea + +*/version.py +pip-wheel-metadata/ @@ -1,3 +1,10 @@ +0.4 (2021-12-31) +---------------- + +- Minimum Python version is now 3.7. [#30] + +- Various infrastructure updates. + 0.3 (2018-12-05) ---------------- diff --git a/MANIFEST.in b/MANIFEST.in index 73a6b90..d56a613 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,5 +2,8 @@ include LICENSE include README.rst include CHANGES.md include tox.ini +include pyproject.toml +include setup.cfg +include setup.py recursive-include tests *.py *.fits *.txt @@ -1,214 +1,219 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: pytest-arraydiff -Version: 0.3 +Version: 0.4.0 Summary: pytest plugin to help with comparing array output from tests -Home-page: https://github.com/astrofrog/pytest-arraydiff -Author: Thomas Robitaille -Author-email: thomas.robitaille@gmail.com +Home-page: https://github.com/astropy/pytest-arraydiff +Author: The Astropy Developers +Author-email: astropy.team@gmail.com License: BSD -Description: |Travis Build Status| |AppVeyor Build status| |Coverage| - - About - ----- - - This is a `py.test <http://pytest.org>`__ plugin to facilitate the - generation and comparison of data arrays produced during tests, in particular - in cases where the arrays are too large to conveniently hard-code them - in the tests (e.g. ``np.testing.assert_allclose(x, [1, 2, 3])``). - - The basic idea is that you can write a test that generates a Numpy array (or - other related objects depending on the format). You can then either run the - tests in a mode to **generate** reference files from the arrays, or you can run - the tests in **comparison** mode, which will compare the results of the tests to - the reference ones within some tolerance. - - At the moment, the supported file formats for the reference files are: - - - A plain text-based format (baed on Numpy ``loadtxt`` output) - - The FITS format (requires `astropy <http://www.astropy.org>`__). With this - format, tests can return either a Numpy array for a FITS HDU object. - - For more information on how to write tests to do this, see the **Using** - section below. - - Installing - ---------- - - This plugin is compatible with Python 2.7, and 3.5 and later, and - requires `pytest <http://pytest.org>`__ and - `numpy <http://www.numpy.org>`__ to be installed. - - To install, you can do:: - - pip install pytest-arraydiff - - You can check that the plugin is registered with pytest by doing:: - - py.test --version - - which will show a list of plugins:: - - This is pytest version 2.7.1, imported from ... - setuptools registered plugins: - pytest-arraydiff-0.1 at ... - - Using - ----- - - To use, you simply need to mark the function where you want to compare - arrays using ``@pytest.mark.array_compare``, and make sure that the - function returns a plain Numpy array:: - - python - import pytest - import numpy as np - - @pytest.mark.array_compare - def test_succeeds(): - return np.arange(3 * 5 * 4).reshape((3, 5, 4)) - - To generate the reference data files, run the tests with the - ``--arraydiff-generate-path`` option with the name of the directory - where the generated files should be placed:: - - py.test --arraydiff-generate-path=reference - - If the directory does not exist, it will be created. The directory will - be interpreted as being relative to where you are running ``py.test``. - Make sure you manually check the reference arrays to ensure they are - correct. - - Once you are happy with the generated data files, you should move them - to a sub-directory called ``reference`` relative to the test files (this - name is configurable, see below). You can also generate the baseline - arrays directly in the right directory. - - You can then run the tests simply with:: - - py.test --arraydiff - - and the tests will pass if the arrays are the same. If you omit the - ``--arraydiff`` option, the tests will run but will only check that the - code runs without checking the output arrays. - - Options - ------- - - The ``@pytest.mark.array_compare`` marker take an argument to specify - the format to use for the reference files: - - .. code:: python - - @pytest.mark.array_compare(file_format='text') - def test_array(): - ... - - The default file format can also be specified using the - ``--arraydiff-default-format=<format>`` flag when running ``py.test``, - and ``<format>`` should be either ``fits`` or ``text``. - - The supported formats at this time are ``text`` and ``fits``, and - contributions for other formats are welcome. The default format is - ``text``. - - Another argument is the relative tolerance for floating point values - (which defaults to 1e-7): - - .. code:: python - - @pytest.mark.array_compare(rtol=20) - def test_array(): - ... - - You can also pass keyword arguments to the writers using the - ``write_kwargs``. For the ``text`` format, these arguments are passed to - ``savetxt`` while for the ``fits`` format they are passed to Astropy's - ``fits.writeto`` function. - - .. code:: python - - @pytest.mark.array_compare(file_format='fits', write_kwargs={'output_verify': 'silentfix'}) - def test_array(): - ... - - Other options include the name of the reference directory (which - defaults to ``reference`` ) and the filename for the reference file - (which defaults to the name of the test with a format-dependent - extension). - - .. code:: python - - @pytest.mark.array_compare(reference_dir='baseline_arrays', - filename='other_name.fits') - def test_array(): - ... - - The reference directory in the decorator above will be interpreted as - being relative to the test file. Note that the baseline directory can - also be a URL (which should start with ``http://`` or ``https://`` and - end in a slash). - - Finally, you can also set a custom baseline directory globally when - running tests by running ``py.test`` with:: - - py.test --arraydiff --arraydiff-reference-path=baseline_arrays - - This directory will be interpreted as being relative to where the tests - are run. In addition, if both this option and the ``reference_dir`` - option in the ``array_compare`` decorator are used, the one in the - decorator takes precedence. - - Test failure example - -------------------- - - If the arrays produced by the tests are correct, then the test will - pass, but if they are not, the test will fail with a message similar to - the following:: - - E AssertionError: - E - E a: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/test_to_mask_rect-mode_subpixels-subpixels_18.txt - E b: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/reference-test_to_mask_rect-mode_subpixels-subpixels_18.txt - E - E Not equal to tolerance rtol=1e-07, atol=0 - E - E (mismatch 47.22222222222222%) - E x: array([[ 0. , 0. , 0. , 0. , 0.404012, 0.55 , - E 0.023765, 0. , 0. ], - E [ 0. , 0. , 0. , 0.112037, 1.028704, 1.1 ,... - E y: array([[ 0. , 0. , 0. , 0. , 0.367284, 0.5 , - E 0.021605, 0. , 0. ], - E [ 0. , 0. , 0. , 0.101852, 0.935185, 1. ,... - - The file paths included in the exception are then available for - inspection. - - Running the tests for pytest-arraydiff - -------------------------------------- - - If you are contributing some changes and want to run the tests, first - install the latest version of the plugin then do:: - - cd tests - py.test --arraydiff - - The reason for having to install the plugin first is to ensure that the - plugin is correctly loaded as part of the test suite. - - .. |Travis Build Status| image:: https://travis-ci.org/astrofrog/pytest-arraydiff.svg?branch=master - :target: https://travis-ci.org/astrofrog/pytest-arraydiff - .. |AppVeyor Build status| image:: https://ci.appveyor.com/api/projects/status/0nech6qgp8jlabjp/branch/master?svg=true - :target: https://ci.appveyor.com/project/astropy/pytest-arraydiff - .. |Coverage| image:: https://codecov.io/gh/astropy/pytest-arraydiff/branch/master/graph/badge.svg - :target: https://codecov.io/gh/astropy/pytest-arraydiff - Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: Pytest Classifier: Intended Audience :: Developers -Classifier: Topic :: Software Development :: Testing +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: OS Independent -Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Utilities +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE + +.. image:: https://github.com/astropy/pytest-arraydiff/workflows/CI/badge.svg + :target: https://github.com/astropy/pytest-arraydiff/actions + :alt: CI Status + +About +----- + +This is a `py.test <http://pytest.org>`__ plugin to facilitate the +generation and comparison of data arrays produced during tests, in particular +in cases where the arrays are too large to conveniently hard-code them +in the tests (e.g. ``np.testing.assert_allclose(x, [1, 2, 3])``). + +The basic idea is that you can write a test that generates a Numpy array (or +other related objects depending on the format). You can then either run the +tests in a mode to **generate** reference files from the arrays, or you can run +the tests in **comparison** mode, which will compare the results of the tests to +the reference ones within some tolerance. + +At the moment, the supported file formats for the reference files are: + +- A plain text-based format (based on Numpy ``loadtxt`` output) +- The FITS format (requires `astropy <http://www.astropy.org>`__). With this + format, tests can return either a Numpy array for a FITS HDU object. + +For more information on how to write tests to do this, see the **Using** +section below. + +Installing +---------- + +This plugin is compatible with Python 2.7, and 3.5 and later, and +requires `pytest <http://pytest.org>`__ and +`numpy <http://www.numpy.org>`__ to be installed. + +To install, you can do:: + + pip install pytest-arraydiff + +You can check that the plugin is registered with pytest by doing:: + + py.test --version + +which will show a list of plugins:: + + This is pytest version 2.7.1, imported from ... + setuptools registered plugins: + pytest-arraydiff-0.1 at ... + +Using +----- + +To use, you simply need to mark the function where you want to compare +arrays using ``@pytest.mark.array_compare``, and make sure that the +function returns a plain Numpy array:: + + python + import pytest + import numpy as np + + @pytest.mark.array_compare + def test_succeeds(): + return np.arange(3 * 5 * 4).reshape((3, 5, 4)) + +To generate the reference data files, run the tests with the +``--arraydiff-generate-path`` option with the name of the directory +where the generated files should be placed:: + + py.test --arraydiff-generate-path=reference + +If the directory does not exist, it will be created. The directory will +be interpreted as being relative to where you are running ``py.test``. +Make sure you manually check the reference arrays to ensure they are +correct. + +Once you are happy with the generated data files, you should move them +to a sub-directory called ``reference`` relative to the test files (this +name is configurable, see below). You can also generate the baseline +arrays directly in the right directory. + +You can then run the tests simply with:: + + py.test --arraydiff + +and the tests will pass if the arrays are the same. If you omit the +``--arraydiff`` option, the tests will run but will only check that the +code runs without checking the output arrays. + +Options +------- + +The ``@pytest.mark.array_compare`` marker take an argument to specify +the format to use for the reference files: + +.. code:: python + + @pytest.mark.array_compare(file_format='text') + def test_array(): + ... + +The default file format can also be specified using the +``--arraydiff-default-format=<format>`` flag when running ``py.test``, +and ``<format>`` should be either ``fits`` or ``text``. + +The supported formats at this time are ``text`` and ``fits``, and +contributions for other formats are welcome. The default format is +``text``. + +Another argument is the relative tolerance for floating point values +(which defaults to 1e-7): + +.. code:: python + + @pytest.mark.array_compare(rtol=20) + def test_array(): + ... + +You can also pass keyword arguments to the writers using the +``write_kwargs``. For the ``text`` format, these arguments are passed to +``savetxt`` while for the ``fits`` format they are passed to Astropy's +``fits.writeto`` function. + +.. code:: python + + @pytest.mark.array_compare(file_format='fits', write_kwargs={'output_verify': 'silentfix'}) + def test_array(): + ... + +Other options include the name of the reference directory (which +defaults to ``reference`` ) and the filename for the reference file +(which defaults to the name of the test with a format-dependent +extension). + +.. code:: python + + @pytest.mark.array_compare(reference_dir='baseline_arrays', + filename='other_name.fits') + def test_array(): + ... + +The reference directory in the decorator above will be interpreted as +being relative to the test file. Note that the baseline directory can +also be a URL (which should start with ``http://`` or ``https://`` and +end in a slash). + +Finally, you can also set a custom baseline directory globally when +running tests by running ``py.test`` with:: + + py.test --arraydiff --arraydiff-reference-path=baseline_arrays + +This directory will be interpreted as being relative to where the tests +are run. In addition, if both this option and the ``reference_dir`` +option in the ``array_compare`` decorator are used, the one in the +decorator takes precedence. + +Test failure example +-------------------- + +If the arrays produced by the tests are correct, then the test will +pass, but if they are not, the test will fail with a message similar to +the following:: + + E AssertionError: + E + E a: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/test_to_mask_rect-mode_subpixels-subpixels_18.txt + E b: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/reference-test_to_mask_rect-mode_subpixels-subpixels_18.txt + E + E Not equal to tolerance rtol=1e-07, atol=0 + E + E (mismatch 47.22222222222222%) + E x: array([[ 0. , 0. , 0. , 0. , 0.404012, 0.55 , + E 0.023765, 0. , 0. ], + E [ 0. , 0. , 0. , 0.112037, 1.028704, 1.1 ,... + E y: array([[ 0. , 0. , 0. , 0. , 0.367284, 0.5 , + E 0.021605, 0. , 0. ], + E [ 0. , 0. , 0. , 0.101852, 0.935185, 1. ,... + +The file paths included in the exception are then available for +inspection. + +Running the tests for pytest-arraydiff +-------------------------------------- + +If you are contributing some changes and want to run the tests, first +install the latest version of the plugin then do:: + + cd tests + py.test --arraydiff + +The reason for having to install the plugin first is to ensure that the +plugin is correctly loaded as part of the test suite. + + @@ -1,4 +1,6 @@ -|Travis Build Status| |AppVeyor Build status| |Coverage| +.. image:: https://github.com/astropy/pytest-arraydiff/workflows/CI/badge.svg + :target: https://github.com/astropy/pytest-arraydiff/actions + :alt: CI Status About ----- @@ -16,7 +18,7 @@ the reference ones within some tolerance. At the moment, the supported file formats for the reference files are: -- A plain text-based format (baed on Numpy ``loadtxt`` output) +- A plain text-based format (based on Numpy ``loadtxt`` output) - The FITS format (requires `astropy <http://www.astropy.org>`__). With this format, tests can return either a Numpy array for a FITS HDU object. @@ -186,10 +188,3 @@ install the latest version of the plugin then do:: The reason for having to install the plugin first is to ensure that the plugin is correctly loaded as part of the test suite. - -.. |Travis Build Status| image:: https://travis-ci.org/astrofrog/pytest-arraydiff.svg?branch=master - :target: https://travis-ci.org/astrofrog/pytest-arraydiff -.. |AppVeyor Build status| image:: https://ci.appveyor.com/api/projects/status/0nech6qgp8jlabjp/branch/master?svg=true - :target: https://ci.appveyor.com/project/astropy/pytest-arraydiff -.. |Coverage| image:: https://codecov.io/gh/astropy/pytest-arraydiff/branch/master/graph/badge.svg - :target: https://codecov.io/gh/astropy/pytest-arraydiff diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..590e0b1 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,5 @@ +[build-system] +requires = ["setuptools>=30.3.0", + "setuptools_scm", + "wheel"] +build-backend = 'setuptools.build_meta' diff --git a/pytest_arraydiff.egg-info/PKG-INFO b/pytest_arraydiff.egg-info/PKG-INFO index 292b52e..2a54e1f 100644 --- a/pytest_arraydiff.egg-info/PKG-INFO +++ b/pytest_arraydiff.egg-info/PKG-INFO @@ -1,214 +1,219 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: pytest-arraydiff -Version: 0.3 +Version: 0.4.0 Summary: pytest plugin to help with comparing array output from tests -Home-page: https://github.com/astrofrog/pytest-arraydiff -Author: Thomas Robitaille -Author-email: thomas.robitaille@gmail.com +Home-page: https://github.com/astropy/pytest-arraydiff +Author: The Astropy Developers +Author-email: astropy.team@gmail.com License: BSD -Description: |Travis Build Status| |AppVeyor Build status| |Coverage| - - About - ----- - - This is a `py.test <http://pytest.org>`__ plugin to facilitate the - generation and comparison of data arrays produced during tests, in particular - in cases where the arrays are too large to conveniently hard-code them - in the tests (e.g. ``np.testing.assert_allclose(x, [1, 2, 3])``). - - The basic idea is that you can write a test that generates a Numpy array (or - other related objects depending on the format). You can then either run the - tests in a mode to **generate** reference files from the arrays, or you can run - the tests in **comparison** mode, which will compare the results of the tests to - the reference ones within some tolerance. - - At the moment, the supported file formats for the reference files are: - - - A plain text-based format (baed on Numpy ``loadtxt`` output) - - The FITS format (requires `astropy <http://www.astropy.org>`__). With this - format, tests can return either a Numpy array for a FITS HDU object. - - For more information on how to write tests to do this, see the **Using** - section below. - - Installing - ---------- - - This plugin is compatible with Python 2.7, and 3.5 and later, and - requires `pytest <http://pytest.org>`__ and - `numpy <http://www.numpy.org>`__ to be installed. - - To install, you can do:: - - pip install pytest-arraydiff - - You can check that the plugin is registered with pytest by doing:: - - py.test --version - - which will show a list of plugins:: - - This is pytest version 2.7.1, imported from ... - setuptools registered plugins: - pytest-arraydiff-0.1 at ... - - Using - ----- - - To use, you simply need to mark the function where you want to compare - arrays using ``@pytest.mark.array_compare``, and make sure that the - function returns a plain Numpy array:: - - python - import pytest - import numpy as np - - @pytest.mark.array_compare - def test_succeeds(): - return np.arange(3 * 5 * 4).reshape((3, 5, 4)) - - To generate the reference data files, run the tests with the - ``--arraydiff-generate-path`` option with the name of the directory - where the generated files should be placed:: - - py.test --arraydiff-generate-path=reference - - If the directory does not exist, it will be created. The directory will - be interpreted as being relative to where you are running ``py.test``. - Make sure you manually check the reference arrays to ensure they are - correct. - - Once you are happy with the generated data files, you should move them - to a sub-directory called ``reference`` relative to the test files (this - name is configurable, see below). You can also generate the baseline - arrays directly in the right directory. - - You can then run the tests simply with:: - - py.test --arraydiff - - and the tests will pass if the arrays are the same. If you omit the - ``--arraydiff`` option, the tests will run but will only check that the - code runs without checking the output arrays. - - Options - ------- - - The ``@pytest.mark.array_compare`` marker take an argument to specify - the format to use for the reference files: - - .. code:: python - - @pytest.mark.array_compare(file_format='text') - def test_array(): - ... - - The default file format can also be specified using the - ``--arraydiff-default-format=<format>`` flag when running ``py.test``, - and ``<format>`` should be either ``fits`` or ``text``. - - The supported formats at this time are ``text`` and ``fits``, and - contributions for other formats are welcome. The default format is - ``text``. - - Another argument is the relative tolerance for floating point values - (which defaults to 1e-7): - - .. code:: python - - @pytest.mark.array_compare(rtol=20) - def test_array(): - ... - - You can also pass keyword arguments to the writers using the - ``write_kwargs``. For the ``text`` format, these arguments are passed to - ``savetxt`` while for the ``fits`` format they are passed to Astropy's - ``fits.writeto`` function. - - .. code:: python - - @pytest.mark.array_compare(file_format='fits', write_kwargs={'output_verify': 'silentfix'}) - def test_array(): - ... - - Other options include the name of the reference directory (which - defaults to ``reference`` ) and the filename for the reference file - (which defaults to the name of the test with a format-dependent - extension). - - .. code:: python - - @pytest.mark.array_compare(reference_dir='baseline_arrays', - filename='other_name.fits') - def test_array(): - ... - - The reference directory in the decorator above will be interpreted as - being relative to the test file. Note that the baseline directory can - also be a URL (which should start with ``http://`` or ``https://`` and - end in a slash). - - Finally, you can also set a custom baseline directory globally when - running tests by running ``py.test`` with:: - - py.test --arraydiff --arraydiff-reference-path=baseline_arrays - - This directory will be interpreted as being relative to where the tests - are run. In addition, if both this option and the ``reference_dir`` - option in the ``array_compare`` decorator are used, the one in the - decorator takes precedence. - - Test failure example - -------------------- - - If the arrays produced by the tests are correct, then the test will - pass, but if they are not, the test will fail with a message similar to - the following:: - - E AssertionError: - E - E a: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/test_to_mask_rect-mode_subpixels-subpixels_18.txt - E b: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/reference-test_to_mask_rect-mode_subpixels-subpixels_18.txt - E - E Not equal to tolerance rtol=1e-07, atol=0 - E - E (mismatch 47.22222222222222%) - E x: array([[ 0. , 0. , 0. , 0. , 0.404012, 0.55 , - E 0.023765, 0. , 0. ], - E [ 0. , 0. , 0. , 0.112037, 1.028704, 1.1 ,... - E y: array([[ 0. , 0. , 0. , 0. , 0.367284, 0.5 , - E 0.021605, 0. , 0. ], - E [ 0. , 0. , 0. , 0.101852, 0.935185, 1. ,... - - The file paths included in the exception are then available for - inspection. - - Running the tests for pytest-arraydiff - -------------------------------------- - - If you are contributing some changes and want to run the tests, first - install the latest version of the plugin then do:: - - cd tests - py.test --arraydiff - - The reason for having to install the plugin first is to ensure that the - plugin is correctly loaded as part of the test suite. - - .. |Travis Build Status| image:: https://travis-ci.org/astrofrog/pytest-arraydiff.svg?branch=master - :target: https://travis-ci.org/astrofrog/pytest-arraydiff - .. |AppVeyor Build status| image:: https://ci.appveyor.com/api/projects/status/0nech6qgp8jlabjp/branch/master?svg=true - :target: https://ci.appveyor.com/project/astropy/pytest-arraydiff - .. |Coverage| image:: https://codecov.io/gh/astropy/pytest-arraydiff/branch/master/graph/badge.svg - :target: https://codecov.io/gh/astropy/pytest-arraydiff - Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: Pytest Classifier: Intended Audience :: Developers -Classifier: Topic :: Software Development :: Testing +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 3 -Classifier: Operating System :: OS Independent -Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Utilities +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE + +.. image:: https://github.com/astropy/pytest-arraydiff/workflows/CI/badge.svg + :target: https://github.com/astropy/pytest-arraydiff/actions + :alt: CI Status + +About +----- + +This is a `py.test <http://pytest.org>`__ plugin to facilitate the +generation and comparison of data arrays produced during tests, in particular +in cases where the arrays are too large to conveniently hard-code them +in the tests (e.g. ``np.testing.assert_allclose(x, [1, 2, 3])``). + +The basic idea is that you can write a test that generates a Numpy array (or +other related objects depending on the format). You can then either run the +tests in a mode to **generate** reference files from the arrays, or you can run +the tests in **comparison** mode, which will compare the results of the tests to +the reference ones within some tolerance. + +At the moment, the supported file formats for the reference files are: + +- A plain text-based format (based on Numpy ``loadtxt`` output) +- The FITS format (requires `astropy <http://www.astropy.org>`__). With this + format, tests can return either a Numpy array for a FITS HDU object. + +For more information on how to write tests to do this, see the **Using** +section below. + +Installing +---------- + +This plugin is compatible with Python 2.7, and 3.5 and later, and +requires `pytest <http://pytest.org>`__ and +`numpy <http://www.numpy.org>`__ to be installed. + +To install, you can do:: + + pip install pytest-arraydiff + +You can check that the plugin is registered with pytest by doing:: + + py.test --version + +which will show a list of plugins:: + + This is pytest version 2.7.1, imported from ... + setuptools registered plugins: + pytest-arraydiff-0.1 at ... + +Using +----- + +To use, you simply need to mark the function where you want to compare +arrays using ``@pytest.mark.array_compare``, and make sure that the +function returns a plain Numpy array:: + + python + import pytest + import numpy as np + + @pytest.mark.array_compare + def test_succeeds(): + return np.arange(3 * 5 * 4).reshape((3, 5, 4)) + +To generate the reference data files, run the tests with the +``--arraydiff-generate-path`` option with the name of the directory +where the generated files should be placed:: + + py.test --arraydiff-generate-path=reference + +If the directory does not exist, it will be created. The directory will +be interpreted as being relative to where you are running ``py.test``. +Make sure you manually check the reference arrays to ensure they are +correct. + +Once you are happy with the generated data files, you should move them +to a sub-directory called ``reference`` relative to the test files (this +name is configurable, see below). You can also generate the baseline +arrays directly in the right directory. + +You can then run the tests simply with:: + + py.test --arraydiff + +and the tests will pass if the arrays are the same. If you omit the +``--arraydiff`` option, the tests will run but will only check that the +code runs without checking the output arrays. + +Options +------- + +The ``@pytest.mark.array_compare`` marker take an argument to specify +the format to use for the reference files: + +.. code:: python + + @pytest.mark.array_compare(file_format='text') + def test_array(): + ... + +The default file format can also be specified using the +``--arraydiff-default-format=<format>`` flag when running ``py.test``, +and ``<format>`` should be either ``fits`` or ``text``. + +The supported formats at this time are ``text`` and ``fits``, and +contributions for other formats are welcome. The default format is +``text``. + +Another argument is the relative tolerance for floating point values +(which defaults to 1e-7): + +.. code:: python + + @pytest.mark.array_compare(rtol=20) + def test_array(): + ... + +You can also pass keyword arguments to the writers using the +``write_kwargs``. For the ``text`` format, these arguments are passed to +``savetxt`` while for the ``fits`` format they are passed to Astropy's +``fits.writeto`` function. + +.. code:: python + + @pytest.mark.array_compare(file_format='fits', write_kwargs={'output_verify': 'silentfix'}) + def test_array(): + ... + +Other options include the name of the reference directory (which +defaults to ``reference`` ) and the filename for the reference file +(which defaults to the name of the test with a format-dependent +extension). + +.. code:: python + + @pytest.mark.array_compare(reference_dir='baseline_arrays', + filename='other_name.fits') + def test_array(): + ... + +The reference directory in the decorator above will be interpreted as +being relative to the test file. Note that the baseline directory can +also be a URL (which should start with ``http://`` or ``https://`` and +end in a slash). + +Finally, you can also set a custom baseline directory globally when +running tests by running ``py.test`` with:: + + py.test --arraydiff --arraydiff-reference-path=baseline_arrays + +This directory will be interpreted as being relative to where the tests +are run. In addition, if both this option and the ``reference_dir`` +option in the ``array_compare`` decorator are used, the one in the +decorator takes precedence. + +Test failure example +-------------------- + +If the arrays produced by the tests are correct, then the test will +pass, but if they are not, the test will fail with a message similar to +the following:: + + E AssertionError: + E + E a: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/test_to_mask_rect-mode_subpixels-subpixels_18.txt + E b: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/reference-test_to_mask_rect-mode_subpixels-subpixels_18.txt + E + E Not equal to tolerance rtol=1e-07, atol=0 + E + E (mismatch 47.22222222222222%) + E x: array([[ 0. , 0. , 0. , 0. , 0.404012, 0.55 , + E 0.023765, 0. , 0. ], + E [ 0. , 0. , 0. , 0.112037, 1.028704, 1.1 ,... + E y: array([[ 0. , 0. , 0. , 0. , 0.367284, 0.5 , + E 0.021605, 0. , 0. ], + E [ 0. , 0. , 0. , 0.101852, 0.935185, 1. ,... + +The file paths included in the exception are then available for +inspection. + +Running the tests for pytest-arraydiff +-------------------------------------- + +If you are contributing some changes and want to run the tests, first +install the latest version of the plugin then do:: + + cd tests + py.test --arraydiff + +The reason for having to install the plugin first is to ensure that the +plugin is correctly loaded as part of the test suite. + + diff --git a/pytest_arraydiff.egg-info/SOURCES.txt b/pytest_arraydiff.egg-info/SOURCES.txt index 26c124a..20b25e4 100644 --- a/pytest_arraydiff.egg-info/SOURCES.txt +++ b/pytest_arraydiff.egg-info/SOURCES.txt @@ -1,10 +1,17 @@ +.gitignore CHANGES.md LICENSE MANIFEST.in README.rst +pyproject.toml +setup.cfg setup.py +tox.ini +.github/workflows/ci_workflows.yml +.github/workflows/publish.yml pytest_arraydiff/__init__.py pytest_arraydiff/plugin.py +pytest_arraydiff/version.py pytest_arraydiff.egg-info/PKG-INFO pytest_arraydiff.egg-info/SOURCES.txt pytest_arraydiff.egg-info/dependency_links.txt diff --git a/pytest_arraydiff.egg-info/requires.txt b/pytest_arraydiff.egg-info/requires.txt index 28ffe72..43c6acf 100644 --- a/pytest_arraydiff.egg-info/requires.txt +++ b/pytest_arraydiff.egg-info/requires.txt @@ -1,3 +1,3 @@ +pytest>=4.6 numpy -six -pytest +astropy diff --git a/pytest_arraydiff/__init__.py b/pytest_arraydiff/__init__.py index cce384d..b507b35 100755 --- a/pytest_arraydiff/__init__.py +++ b/pytest_arraydiff/__init__.py @@ -1 +1,3 @@ -__version__ = '0.3' +# Licensed under a 3-clause BSD style license - see LICENSE.rst + +from .version import version as __version__ # noqa diff --git a/pytest_arraydiff/plugin.py b/pytest_arraydiff/plugin.py index cd63b69..9d10bad 100755 --- a/pytest_arraydiff/plugin.py +++ b/pytest_arraydiff/plugin.py @@ -36,27 +36,17 @@ import abc import shutil import tempfile import warnings -from distutils.version import StrictVersion - -import six -from six.moves.urllib.request import urlopen +from urllib.request import urlopen import pytest import numpy as np -if six.PY2: - def abstractstaticmethod(func): - return func - def abstractclassmethod(func): - return func -else: - abstractstaticmethod = abc.abstractstaticmethod - abstractclassmethod = abc.abstractclassmethod +abstractstaticmethod = abc.abstractstaticmethod +abstractclassmethod = abc.abstractclassmethod -@six.add_metaclass(abc.ABCMeta) -class BaseDiff(object): +class BaseDiff(object, metaclass=abc.ABCMeta): @abstractstaticmethod def read(filename): @@ -143,14 +133,7 @@ class TextDiff(SimpleArrayDiff): @staticmethod def write(filename, data, **kwargs): fmt = kwargs.get('fmt', '%g') - # Workaround for a known issue in `numpy.savetxt` for the `fmt` argument: - # https://github.com/numpy/numpy/pull/4053#issuecomment-263808221 - # Convert `unicode` to `str` (i.e. bytes) on Python 2 - if six.PY2 and isinstance(fmt, six.text_type): - fmt = fmt.encode('ascii') - kwargs['fmt'] = fmt - return np.savetxt(filename, data, **kwargs) @@ -213,10 +196,7 @@ class ArrayComparison(object): def pytest_runtest_setup(self, item): - if StrictVersion(pytest.__version__) < StrictVersion("3.6"): - compare = item.get_marker('array_compare') - else: - compare = item.get_closest_marker('array_compare') + compare = item.get_closest_marker('array_compare') if compare is None: return @@ -295,7 +275,7 @@ class ArrayComparison(object): This is expected for new tests.""".format( test=test_array)) - # distutils may put the baseline arrays in non-accessible places, + # setuptools may put the baseline arrays in non-accessible places, # copy to our tmpdir to be sure to keep them in case of failure baseline_file = os.path.abspath(os.path.join(result_dir, 'reference-' + filename)) shutil.copyfile(baseline_file_ref, baseline_file) diff --git a/pytest_arraydiff/version.py b/pytest_arraydiff/version.py new file mode 100644 index 0000000..d2d477f --- /dev/null +++ b/pytest_arraydiff/version.py @@ -0,0 +1,5 @@ +# coding: utf-8 +# file generated by setuptools_scm +# don't change, don't track in version control +version = '0.4.0' +version_tuple = (0, 4, 0) @@ -1,3 +1,53 @@ +[metadata] +name = pytest-arraydiff +url = https://github.com/astropy/pytest-arraydiff +author = The Astropy Developers +author_email = astropy.team@gmail.com +classifiers = + Development Status :: 4 - Beta + Framework :: Pytest + Intended Audience :: Developers + License :: OSI Approved :: BSD License + Operating System :: OS Independent + Programming Language :: Python + Programming Language :: Python :: 3 + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: Implementation :: CPython + Topic :: Software Development :: Testing + Topic :: Utilities +license = BSD +description = pytest plugin to help with comparing array output from tests +long_description = file: README.rst +long_description_content_type = text/x-rst + +[options] +zip_safe = False +packages = find: +python_requires = >=3.7 +setup_requires = + setuptools_scm +install_requires = + pytest>=4.6 + numpy + astropy + +[options.entry_points] +pytest11 = + pytest_arraydiff = pytest_arraydiff.plugin + +[tool:pytest] +minversion = 4.6 +testpaths = tests +xfail_strict = true +markers = + array_compare : for functions using array comparison + +[flake8] +max-line-length = 150 + [egg_info] tag_build = tag_date = 0 @@ -1,37 +1,6 @@ -from setuptools import setup - -from pytest_arraydiff import __version__ +#!/usr/bin/env python -# IMPORTANT: we deliberately use rst here instead of markdown because long_description -# needs to be in rst, and requiring pandoc to be installed to convert markdown to rst -# on-the-fly is over-complicated and sometimes the generated rst has warnings that -# cause PyPI to not display it correctly. - -with open('README.rst') as infile: - long_description = infile.read() +import os +from setuptools import setup -setup( - version=__version__, - url="https://github.com/astrofrog/pytest-arraydiff", - name="pytest-arraydiff", - description='pytest plugin to help with comparing array output from tests', - long_description=long_description, - packages=['pytest_arraydiff'], - install_requires=['numpy', 'six', 'pytest'], - license='BSD', - author='Thomas Robitaille', - author_email='thomas.robitaille@gmail.com', - entry_points={'pytest11': ['pytest_arraydiff = pytest_arraydiff.plugin']}, - zip_safe=False, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Framework :: Pytest', - 'Intended Audience :: Developers', - 'Topic :: Software Development :: Testing', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 3', - 'Operating System :: OS Independent', - 'License :: OSI Approved :: BSD License', - ], -) +setup(use_scm_version={'write_to': os.path.join('pytest_arraydiff', 'version.py')}) diff --git a/tests/test_pytest_arraydiff.py b/tests/test_pytest_arraydiff.py index dfbd677..9749b27 100644 --- a/tests/test_pytest_arraydiff.py +++ b/tests/test_pytest_arraydiff.py @@ -1,13 +1,10 @@ import os -import sys import subprocess import tempfile import pytest import numpy as np -PY2 = sys.version_info[0] == 2 - reference_dir = 'baseline' @@ -58,11 +55,11 @@ def test_fails(): f.write(TEST_FAILING) # If we use --arraydiff, it should detect that the file is missing - code = subprocess.call('py.test --arraydiff {0}'.format(test_file), shell=True) + code = subprocess.call('pytest --arraydiff {0}'.format(test_file), shell=True) assert code != 0 # If we don't use --arraydiff option, the test should succeed - code = subprocess.call('py.test {0}'.format(test_file), shell=True) + code = subprocess.call('pytest {0}'.format(test_file), shell=True) assert code == 0 @@ -89,19 +86,13 @@ def test_generate(file_format): # If we don't generate, the test will fail try: - if PY2: - subprocess.check_output(['pytest', '--arraydiff', test_file]) - else: - subprocess.check_output(['pytest', '--arraydiff', test_file], timeout=10) + subprocess.check_output(['pytest', '--arraydiff', test_file], timeout=10) except subprocess.CalledProcessError as grepexc: assert b'File not found for comparison test' in grepexc.output # If we do generate, the test should succeed and a new file will appear - if PY2: - code = subprocess.call(['pytest', '--arraydiff-generate-path={0}'.format(gen_dir), test_file]) - else: - code = subprocess.call(['pytest', '--arraydiff-generate-path={0}'.format(gen_dir), test_file], - timeout=10) + code = subprocess.call(['pytest', '--arraydiff-generate-path={0}'.format(gen_dir), test_file], + timeout=10) assert code == 0 assert os.path.exists(os.path.join(gen_dir, 'test_gen.' + ('fits' if file_format == 'fits' else 'txt'))) @@ -115,6 +106,7 @@ def test_default(): return np.arange(6 * 5).reshape((6, 5)) """ + @pytest.mark.parametrize('file_format', ('fits', 'text')) def test_default_format(file_format): @@ -127,7 +119,7 @@ def test_default_format(file_format): gen_dir = os.path.join(tmpdir, 'spam', 'egg') # If we do generate, the test should succeed and a new file will appear - code = subprocess.call('py.test -s --arraydiff-default-format={0}' + code = subprocess.call('pytest -s --arraydiff-default-format={0}' ' --arraydiff-generate-path={1} {2}'.format(file_format, gen_dir, test_file), shell=True) assert code == 0 assert os.path.exists(os.path.join(gen_dir, 'test_default.' + ('fits' if file_format == 'fits' else 'txt'))) @@ -135,7 +127,7 @@ def test_default_format(file_format): @pytest.mark.array_compare(reference_dir=reference_dir, rtol=0.5, file_format='fits') def test_tolerance(): - return np.ones((3,4)) * 1.6 + return np.ones((3, 4)) * 1.6 def test_nofile(): @@ -0,0 +1,32 @@ +[tox] +envlist = + py{37,38,39,310}-test{,-devdeps} + codestyle +requires = + setuptools >= 30.3.0 + pip >= 19.3.1 +isolated_build = true + +[testenv] +changedir = .tmp/{envname} +description = run tests +deps = + pytest46: pytest==4.6.* + pytest50: pytest==5.0.* + pytest52: pytest==5.2.* + pytest53: pytest==5.3.* + pytest60: pytest==6.0.* + pytest61: pytest==6.1.* + pytest62: pytest==6.2.* + pytestdev: git+https://github.com/pytest-dev/pytest#egg=pytest + +commands = + pip freeze + pytest {toxinidir}/tests {posargs} + pytest {toxinidir}/tests --arraydiff {posargs} + +[testenv:codestyle] +skip_install = true +description = check code style, e.g. with flake8 +deps = flake8 +commands = flake8 pytest_arraydiff --count |