From 63dae7c504a9fa0732198dd12654016fbeb0c6aa Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Thu, 13 Feb 2020 09:54:48 +0100 Subject: run tests first, then linting --- .github/workflows/pythonapp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 2541ec4..6a2c6ee 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -35,16 +35,16 @@ jobs: source $HOME/.poetry/env make tox-listenvs - - name: 'Run linters' - if: matrix.python-version == '3.8' + - name: 'Run tests with Python v${{ matrix.python-version }}' run: | source $HOME/.poetry/env - make lint + make pytest - - name: 'Run tests with Python v${{ matrix.python-version }}' + - name: 'Run linters' + if: matrix.python-version == '3.8' run: | source $HOME/.poetry/env - make pytest + make lint - name: 'Upload coverage report' run: bash <(curl -s https://codecov.io/bash) -- cgit v1.2.1 From 9cc2afe55b8610efdea61f7263ef89ca78a2b473 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Thu, 13 Feb 2020 10:03:53 +0100 Subject: use https://github.com/ymyzk/tox-gh-actions on gitlab CI --- .github/workflows/pythonapp.yml | 9 ++++++--- tox.ini | 8 ++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 6a2c6ee..75901e0 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -24,6 +24,7 @@ jobs: make install-poetry source $HOME/.poetry/env make install + pip3 install tox-gh-actions - name: 'List installed packages' run: | @@ -38,7 +39,10 @@ jobs: - name: 'Run tests with Python v${{ matrix.python-version }}' run: | source $HOME/.poetry/env - make pytest + make tox + + - name: 'Upload coverage report' + run: bash <(curl -s https://codecov.io/bash) - name: 'Run linters' if: matrix.python-version == '3.8' @@ -46,5 +50,4 @@ jobs: source $HOME/.poetry/env make lint - - name: 'Upload coverage report' - run: bash <(curl -s https://codecov.io/bash) + diff --git a/tox.ini b/tox.ini index ce97e99..4973a7e 100644 --- a/tox.ini +++ b/tox.ini @@ -3,6 +3,14 @@ isolated_build = True envlist = py38,py37,py36 skip_missing_interpreters = True +[gh-actions] +# https://github.com/ymyzk/tox-gh-actions +python = + 3.6: py36 + 3.7: py37 + 3.8: py38 + pypy3: pypy3 + [testenv] whitelist_externals = make commands = -- cgit v1.2.1 From 51a3622519aa0a04801038a95344f60040cae05c Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Thu, 13 Feb 2020 10:36:50 +0100 Subject: NEW: creole.setup_utils.assert_rst_readme --- README.creole | 1 + README.rst | 4 ++- creole/setup_utils.py | 50 ++++++++++++++++++++++++++++---------- creole/shared/diff_utils.py | 34 ++++++++++++++++++++++++++ creole/tests/test_project_setup.py | 5 ++++ creole/tests/utils/utils.py | 16 ++---------- 6 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 creole/shared/diff_utils.py diff --git a/README.creole b/README.creole index 655b821..0aab2fa 100644 --- a/README.creole +++ b/README.creole @@ -228,6 +228,7 @@ Note: In this case you must install **docutils**! See above. = history = * *dev* - [[https://github.com/jedie/python-creole/compare/v1.4.4...master|compare v1.4.4...master]] +** new: {{{creole.setup_utils.assert_rst_readme}}} for project setup tests ** TBC * v1.4.4 - 2020-02-07 - [[https://github.com/jedie/python-creole/compare/v1.4.3...v1.4.4|compare v1.4.3...v1.4.4]] ** Fix #44: Move {{{poetry-publish}}} to {{{dev-dependencies}}} and lower {{{docutils}}} requirement to {{^0.15}} diff --git a/README.rst b/README.rst index 39e180d..55af50c 100644 --- a/README.rst +++ b/README.rst @@ -300,6 +300,8 @@ history * *dev* - `compare v1.4.4...master `_ + * new: ``creole.setup_utils.assert_rst_readme`` for project setup tests + * TBC * v1.4.4 - 2020-02-07 - `compare v1.4.3...v1.4.4 `_ @@ -665,4 +667,4 @@ donation ------------ -``Note: this file is generated from README.creole 2020-02-07 15:07:21 with "python-creole"`` \ No newline at end of file +``Note: this file is generated from README.creole 2020-02-13 10:27:40 with "python-creole"`` \ No newline at end of file diff --git a/creole/setup_utils.py b/creole/setup_utils.py index e48e8cf..0fe1e24 100644 --- a/creole/setup_utils.py +++ b/creole/setup_utils.py @@ -20,6 +20,7 @@ import warnings from pathlib import Path from creole import creole2html, html2rest +from creole.shared.diff_utils import unified_diff from creole.shared.unknown_tags import raise_unknown_node, transparent_unknown_nodes @@ -100,6 +101,23 @@ def get_long_description(package_root, filename='README.creole', raise_errors=No return long_description_rest +def _generate_rst_readme(*, creole_readme_path): + with creole_readme_path.open('r') as f: + creole_readme = f.read().strip() + + # convert creole into html + html_readme = creole2html(creole_readme) + + # convert html to ReSt + rest_readme = html2rest( + html_readme, + emitter_kwargs={ + 'unknown_emit': raise_unknown_node # raise a error if a unknown node found + } + ) + return rest_readme + + def update_rst_readme(package_root, filename='README.creole'): """ Generate README.rst from README.creole @@ -115,19 +133,7 @@ def update_rst_readme(package_root, filename='README.creole'): end='...', flush=True ) - with creole_readme_path.open('r') as f: - creole_readme = f.read().strip() - - # convert creole into html - html_readme = creole2html(creole_readme) - - # convert html to ReSt - rest_readme = html2rest( - html_readme, - emitter_kwargs={ - 'unknown_emit': raise_unknown_node # raise a error if a unknown node found - } - ) + rest_readme = _generate_rst_readme(creole_readme_path=creole_readme_path) with rest_readme_path.open('w') as f: f.write(rest_readme) @@ -146,6 +152,24 @@ def update_rst_readme(package_root, filename='README.creole'): return rest_readme_path +def assert_rst_readme(package_root, filename='README.creole'): + """ + raise AssertionError if README.rst is not up-to-date. + """ + creole_readme_path = Path(package_root, filename) + rest_readme = _generate_rst_readme(creole_readme_path=creole_readme_path) + rest_readme_path = creole_readme_path.with_suffix('.rst') + with rest_readme_path.open('r') as f: + content = f.read() + + assert len(content) > 0, f'Empty content in {rest_readme_path}' + content = content.rsplit('\n', 4)[0] # remove note about generation with modification time + + if rest_readme != content: + diff = unified_diff(content, rest_readme, filename=rest_readme_path.name) + raise AssertionError(f'{rest_readme_path.name} is not up-to-date:\n{diff}') + + def update_creole_rst_readme(): return update_rst_readme( package_root=Path(__file__).parent.parent, diff --git a/creole/shared/diff_utils.py b/creole/shared/diff_utils.py new file mode 100644 index 0000000..b6fa05d --- /dev/null +++ b/creole/shared/diff_utils.py @@ -0,0 +1,34 @@ +""" + :copyleft: 2020 by python-creole team, see AUTHORS for more details. + :license: GNU GPL v3 or above, see LICENSE for more details. +""" + +import difflib + + +def unified_diff(old, new, filename=None): + """ + Return text of unified diff between old and new. + """ + if filename is None: + fromfile = 'old' + tofile = 'new' + else: + fromfile = f'old / {filename}' + tofile = f'new / {filename}' + + if isinstance(old, str) and isinstance(new, str): + old = old.splitlines(keepends=True) + new = new.splitlines(keepends=True) + + diff = difflib.unified_diff(old, new, fromfile=fromfile, tofile=tofile) + + text = '' + for line in diff: + text += line + + # Work around missing newline (http://bugs.python.org/issue2142). + if text and not line.endswith('\n'): + text += 'n\\ No newline at end of file\n' + + return text diff --git a/creole/tests/test_project_setup.py b/creole/tests/test_project_setup.py index b74fdbc..001e8da 100644 --- a/creole/tests/test_project_setup.py +++ b/creole/tests/test_project_setup.py @@ -8,6 +8,7 @@ import subprocess from pathlib import Path from creole import __version__ +from creole.setup_utils import assert_rst_readme from creole.tests.constants import CREOLE_PACKAGE_ROOT @@ -39,6 +40,10 @@ def test_version(): ) +def test_assert_rst_readme(): + assert_rst_readme(package_root=CREOLE_PACKAGE_ROOT) + + def test_poetry_check(): poerty_bin = shutil.which('poetry') diff --git a/creole/tests/utils/utils.py b/creole/tests/utils/utils.py index dd60454..d9fbf29 100644 --- a/creole/tests/utils/utils.py +++ b/creole/tests/utils/utils.py @@ -8,8 +8,6 @@ :license: GNU GPL v3 or above, see LICENSE for more details. """ - -import difflib import os import shutil import tempfile @@ -17,17 +15,7 @@ import textwrap import unittest from pathlib import Path - -def make_diff(block1, block2): - d = difflib.Differ() - - block1 = block1.replace("\\n", "\\n\n").split("\n") - block2 = block2.replace("\\n", "\\n\n").split("\n") - - diff = d.compare(block1, block2) - - result = [f"{line:>2} {i}\n" for line, i in enumerate(diff)] - return "".join(result) +from creole.shared.diff_utils import unified_diff class MarkupTest(unittest.TestCase): @@ -54,7 +42,7 @@ class MarkupTest(unittest.TestCase): return try: - diff = make_diff(first, second) + diff = unified_diff(first, second) except AttributeError: raise self.failureException(f"{first!r} is not {second!r}") -- cgit v1.2.1