diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index d7ec1cf..7383136 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -1,27 +1,37 @@ -name: Python application +name: Python application cross-platform test -on: [push, pull_request] +on: [push] jobs: build: + runs-on: ${{ matrix.os }} - runs-on: ubuntu-latest + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v2 - - name: Set up Python 3.10 + + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install pytest pytest-cov coverage - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + pip install -r requirements-test.txt + pip install -r requirements.txt + - name: Test with pytest run: | - pytest --cov=brokenaxes --cov-report=xml test.py + pytest --cov=brokenaxes --cov-report=xml --mpl --mpl-baseline-path test_baseline test.py + - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + if: matrix.python-version == '3.10' && matrix.os == 'ubuntu-latest' + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true diff --git a/requirements-test.txt b/requirements-test.txt new file mode 100644 index 0000000..a2e2b0a --- /dev/null +++ b/requirements-test.txt @@ -0,0 +1,3 @@ +pytest>=6.0 +pytest-mpl==0.17.0 +pytest-cov \ No newline at end of file diff --git a/setup.py b/setup.py index ce01cfb..ea89268 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import setup # To use a consistent encoding from codecs import open from os import path @@ -24,14 +24,14 @@ 'Topic :: Scientific/Engineering', 'Framework :: Matplotlib', 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7' + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', ], keywords='data visualization', - - #packages=find_packages(exclude=['docs']), py_modules=["brokenaxes"], # List run-time dependencies here. These will be installed by pip when @@ -43,10 +43,9 @@ # List additional groups of dependencies here (e.g. development # dependencies). You can install these using the following syntax, # for example: - # $ pip install -e .[dev,test] + # $ pip install -e .[test] extras_require={ - # 'dev': ['check-manifest'], - 'test': ['pytest'], + 'test': ['pytest>=6.0', 'pytest-cov', 'pytest-mpl'], }, diff --git a/test.py b/test.py index 4390389..af77ab3 100644 --- a/test.py +++ b/test.py @@ -9,6 +9,10 @@ from brokenaxes import brokenaxes +np.random.seed(42) + + +@pytest.mark.mpl_image_compare def test_standard(): fig = plt.figure(figsize=(5, 2)) bax = brokenaxes( @@ -20,8 +24,10 @@ def test_standard(): bax.legend(loc=3) bax.set_xlabel("time") bax.set_ylabel("value") + return fig +@pytest.mark.mpl_image_compare def test_subplots(): sps1, sps2 = GridSpec(2, 1) @@ -33,7 +39,10 @@ def test_subplots(): bax = brokenaxes(xlims=((0, 2.5), (3, 6)), subplot_spec=sps2) bax.hist(x, histtype="bar") + return bax.fig + +@pytest.mark.mpl_image_compare def test_log(): fig = plt.figure(figsize=(5, 5)) bax = brokenaxes( @@ -53,7 +62,10 @@ def test_log(): bax.set_xlabel("x") bax.set_ylabel("y") + return fig + +@pytest.mark.mpl_image_compare def test_datetime(): fig = plt.figure(figsize=(5, 5)) xx = [datetime.datetime(2020, 1, x) for x in range(1, 20)] @@ -79,7 +91,10 @@ def test_datetime(): [x.remove() for x in bax.diag_handles] bax.draw_diags() + return fig + +@pytest.mark.mpl_image_compare def test_datetime_y(): fig = plt.figure(figsize=(5, 5)) yy = [datetime.datetime(2020, 1, x) for x in range(1, 20)] @@ -103,7 +118,10 @@ def test_datetime_y(): bax.draw_diags() + return fig + +@pytest.mark.mpl_image_compare def test_legend(): fig = plt.figure(figsize=(5, 2)) bax = brokenaxes( @@ -114,27 +132,28 @@ def test_legend(): h2 = bax.plot(x, np.cos(10 * x), label="cos") bax.legend(handles=[h1[0][0], h2[0][0]], labels=["1", "2"]) + return fig + +@pytest.mark.mpl_image_compare def test_text(): bax = brokenaxes( xlims=((0, 0.1), (0.4, 0.7)), ylims=((-1, 0.7), (0.79, 1)), hspace=0.05 ) bax.text(0.5, 0.5, "hello") - -def test_text_error(): - bax = brokenaxes( - xlims=((0, 0.1), (0.4, 0.7)), ylims=((-1, 0.7), (0.79, 1)), hspace=0.05 - ) - with pytest.raises(ValueError): - bax.text(-11, -11, "hello") + return bax.fig +@pytest.mark.mpl_image_compare def test_lims_arrays(): lims = np.arange(6).reshape((-1,2)) brokenaxes(xlims=lims, ylims=lims) + return plt.gcf() + +@pytest.mark.mpl_image_compare def test_pass_fig(): fig = plt.figure(figsize=(5, 2)) bax = brokenaxes( @@ -142,7 +161,10 @@ def test_pass_fig(): ) assert bax.fig is fig + return fig + +@pytest.mark.mpl_image_compare def test_despine(): fig = plt.figure(figsize=(5, 2)) bax = brokenaxes( @@ -150,7 +172,10 @@ def test_despine(): ) assert bax.despine is False + return fig + +@pytest.mark.mpl_image_compare def test_set_title(): fig = plt.figure(figsize=(5, 2)) bax = brokenaxes( @@ -158,7 +183,10 @@ def test_set_title(): ) bax.set_title("title") + return fig + +@pytest.mark.mpl_image_compare def test_secondary_axes(): fig = plt.figure(figsize=(5, 2)) @@ -171,6 +199,19 @@ def test_secondary_axes(): bax.secondary_yaxis("left", label="left") bax.secondary_yaxis("right") + return fig + + +@pytest.mark.mpl_image_compare +def test_draw_diags(): + fig = plt.figure(figsize=(5, 2)) + bax = brokenaxes( + xlims=((0, 0.1), (0.4, 0.7)), ylims=((-1, 0.7), (0.79, 1)), hspace=0.05 + ) + bax.draw_diags(tilt=90, d=.05) + + return fig + def test_get_axis_special(): fig = plt.figure(figsize=(5, 2)) @@ -183,9 +224,9 @@ def test_get_axis_special(): assert isinstance(bax.get_shared_y_axes(), mpl.cbook.GrouperView) -def test_draw_diags(): - fig = plt.figure(figsize=(5, 2)) +def test_text_error(): bax = brokenaxes( xlims=((0, 0.1), (0.4, 0.7)), ylims=((-1, 0.7), (0.79, 1)), hspace=0.05 ) - bax.draw_diags(tilt=90, d=.05) + with pytest.raises(ValueError): + bax.text(-11, -11, "hello") \ No newline at end of file diff --git a/test_baseline/test_datetime.png b/test_baseline/test_datetime.png new file mode 100644 index 0000000..8455926 Binary files /dev/null and b/test_baseline/test_datetime.png differ diff --git a/test_baseline/test_datetime_y.png b/test_baseline/test_datetime_y.png new file mode 100644 index 0000000..68c9e43 Binary files /dev/null and b/test_baseline/test_datetime_y.png differ diff --git a/test_baseline/test_despine.png b/test_baseline/test_despine.png new file mode 100644 index 0000000..8835f8b Binary files /dev/null and b/test_baseline/test_despine.png differ diff --git a/test_baseline/test_draw_diags.png b/test_baseline/test_draw_diags.png new file mode 100644 index 0000000..2a17bd5 Binary files /dev/null and b/test_baseline/test_draw_diags.png differ diff --git a/test_baseline/test_legend.png b/test_baseline/test_legend.png new file mode 100644 index 0000000..4d2d01e Binary files /dev/null and b/test_baseline/test_legend.png differ diff --git a/test_baseline/test_lims_arrays.png b/test_baseline/test_lims_arrays.png new file mode 100644 index 0000000..7fc586e Binary files /dev/null and b/test_baseline/test_lims_arrays.png differ diff --git a/test_baseline/test_log.png b/test_baseline/test_log.png new file mode 100644 index 0000000..5d377a7 Binary files /dev/null and b/test_baseline/test_log.png differ diff --git a/test_baseline/test_pass_fig.png b/test_baseline/test_pass_fig.png new file mode 100644 index 0000000..13df808 Binary files /dev/null and b/test_baseline/test_pass_fig.png differ diff --git a/test_baseline/test_secondary_axes.png b/test_baseline/test_secondary_axes.png new file mode 100644 index 0000000..c874a14 Binary files /dev/null and b/test_baseline/test_secondary_axes.png differ diff --git a/test_baseline/test_set_title.png b/test_baseline/test_set_title.png new file mode 100644 index 0000000..c428048 Binary files /dev/null and b/test_baseline/test_set_title.png differ diff --git a/test_baseline/test_standard.png b/test_baseline/test_standard.png new file mode 100644 index 0000000..c443100 Binary files /dev/null and b/test_baseline/test_standard.png differ diff --git a/test_baseline/test_subplots.png b/test_baseline/test_subplots.png new file mode 100644 index 0000000..2105aef Binary files /dev/null and b/test_baseline/test_subplots.png differ diff --git a/test_baseline/test_text.png b/test_baseline/test_text.png new file mode 100644 index 0000000..4adba1b Binary files /dev/null and b/test_baseline/test_text.png differ