summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJensDiemer <git@jensdiemer.de>2020-02-13 10:36:50 +0100
committerJensDiemer <git@jensdiemer.de>2020-02-13 10:36:50 +0100
commit51a3622519aa0a04801038a95344f60040cae05c (patch)
tree1eb9b13dd2b7fa6bef7135f01b41df7cd2413efa
parent9cc2afe55b8610efdea61f7263ef89ca78a2b473 (diff)
downloadcreole-51a3622519aa0a04801038a95344f60040cae05c.tar.gz
NEW: creole.setup_utils.assert_rst_readmeupdate
-rw-r--r--README.creole1
-rw-r--r--README.rst4
-rw-r--r--creole/setup_utils.py50
-rw-r--r--creole/shared/diff_utils.py34
-rw-r--r--creole/tests/test_project_setup.py5
-rw-r--r--creole/tests/utils/utils.py16
6 files changed, 82 insertions, 28 deletions
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 <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}")