diff options
author | Jens Diemer <github.com@jensdiemer.de> | 2020-02-13 10:41:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-13 10:41:24 +0100 |
commit | 1e2e2c4edb888b5c9a46f057880d441922878f5b (patch) | |
tree | 1eb9b13dd2b7fa6bef7135f01b41df7cd2413efa | |
parent | 00cbba43f0fcc8648bc1d2bb461647741f00bc4a (diff) | |
parent | 51a3622519aa0a04801038a95344f60040cae05c (diff) | |
download | creole-1e2e2c4edb888b5c9a46f057880d441922878f5b.tar.gz |
Merge pull request #47 from jedie/update
Update
-rw-r--r-- | .github/workflows/pythonapp.yml | 15 | ||||
-rw-r--r-- | README.creole | 1 | ||||
-rw-r--r-- | README.rst | 4 | ||||
-rw-r--r-- | creole/setup_utils.py | 50 | ||||
-rw-r--r-- | creole/shared/diff_utils.py | 34 | ||||
-rw-r--r-- | creole/tests/test_project_setup.py | 5 | ||||
-rw-r--r-- | creole/tests/utils/utils.py | 16 | ||||
-rw-r--r-- | tox.ini | 8 |
8 files changed, 99 insertions, 34 deletions
diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 2541ec4..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: | @@ -35,16 +36,18 @@ jobs: source $HOME/.poetry/env make tox-listenvs + - name: 'Run tests with Python v${{ matrix.python-version }}' + run: | + source $HOME/.poetry/env + make tox + + - name: 'Upload coverage report' + run: bash <(curl -s https://codecov.io/bash) + - name: 'Run linters' if: matrix.python-version == '3.8' run: | source $HOME/.poetry/env make lint - - name: 'Run tests with Python v${{ matrix.python-version }}' - run: | - source $HOME/.poetry/env - make pytest - - name: 'Upload coverage report' - run: bash <(curl -s https://codecov.io/bash) 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}} @@ -300,6 +300,8 @@ history * *dev* - `compare v1.4.4...master <https://github.com/jedie/python-creole/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 <https://github.com/jedie/python-creole/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}") @@ -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 = |