From 8ca1df9ae6cb3181612e78ae1c6cf3732d01cb55 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sat, 1 Feb 2020 15:01:47 +0100 Subject: Test update_creole_rst_readme() and add tests for __version__ --- creole/setup_utils.py | 39 ++++------------------- creole/tests/constants.py | 5 +++ creole/tests/test_project_setup.py | 37 ++++++++++++++++++++++ creole/tests/test_setup_utils.py | 63 +++++++++++++++++++++++--------------- creole/tests/utils/utils.py | 54 ++++++++++++++++++++++++-------- 5 files changed, 127 insertions(+), 71 deletions(-) create mode 100644 creole/tests/constants.py create mode 100644 creole/tests/test_project_setup.py diff --git a/creole/setup_utils.py b/creole/setup_utils.py index eed6693..eab2a65 100644 --- a/creole/setup_utils.py +++ b/creole/setup_utils.py @@ -1,40 +1,12 @@ """ - utils for distutils setup + Python setup.py utilities ~~~~~~~~~~~~~~~~~~~~~~~~~ - Get README.creole as ReStructuredText on-the-fly for setup.long_description + Generate ReStructuredText README from README.creole. + Usable for other python packages, too. More information: - https://code.google.com/p/python-creole/wiki/UseInSetup - - usage in setup.py e.g.: - --------------------------------------------------------------------------- - #!/usr/bin/env python - # coding: utf-8 - - import os - import sys - from setuptools import setup, find_packages - - PACKAGE_ROOT = os.path.dirname(os.path.abspath(__file__)) - - try: - from creole.setup_utils import get_long_description - except ImportError: - if 'register' in sys.argv or 'sdist' in sys.argv or '--long-description' in sys.argv: - etype, evalue, etb = sys.exc_info() - evalue = etype('%s - Please install python-creole >= v0.8 - e.g.: pip install python-creole' % evalue) - raise etype, evalue, etb - long_description = None - else: - long_description = get_long_description(PACKAGE_ROOT) - - setup( - ... - long_description = long_description, - ... - ) - --------------------------------------------------------------------------- + https://github.com/jedie/python-creole/wiki/Use-In-Setup :copyleft: 2011-2020 by the python-creole team, see AUTHORS for more details. :license: GNU GPL v3 or above, see LICENSE for more details. @@ -172,10 +144,11 @@ def update_rst_readme(package_root, filename='README.creole'): f.write(f'``Note: this file is generated from {filename} {dt} with "python-creole"``') print('done.') + return rest_readme_path def update_creole_rst_readme(): - update_rst_readme( + return update_rst_readme( package_root=Path(__file__).parent.parent, filename='README.creole' ) diff --git a/creole/tests/constants.py b/creole/tests/constants.py new file mode 100644 index 0000000..0e276d4 --- /dev/null +++ b/creole/tests/constants.py @@ -0,0 +1,5 @@ +from pathlib import Path + +import creole + +CREOLE_PACKAGE_ROOT = Path(creole.__file__).parent.parent diff --git a/creole/tests/test_project_setup.py b/creole/tests/test_project_setup.py new file mode 100644 index 0000000..b589acf --- /dev/null +++ b/creole/tests/test_project_setup.py @@ -0,0 +1,37 @@ +""" + :copyleft: 2020 by python-creole team, see AUTHORS for more details. + :license: GNU GPL v3 or above, see LICENSE for more details. +""" + +from pathlib import Path + +from creole import __version__ +from creole.tests.constants import CREOLE_PACKAGE_ROOT + + +def assert_file_contains_string(file_path, string): + with file_path.open('r') as f: + for line in f: + if string in line: + return + raise AssertionError(f'File {file_path} does not contain {string!r} !') + + +def test_version(): + if 'dev' not in __version__: + version_string = f'v{__version__}' + + assert_file_contains_string( + file_path=Path(CREOLE_PACKAGE_ROOT, 'README.creole'), + string=version_string + ) + + assert_file_contains_string( + file_path=Path(CREOLE_PACKAGE_ROOT, 'README.rst'), + string=version_string + ) + + assert_file_contains_string( + file_path=Path(CREOLE_PACKAGE_ROOT, 'pyproject.toml'), + string=f'version = "{__version__}"' + ) diff --git a/creole/tests/test_setup_utils.py b/creole/tests/test_setup_utils.py index 33d998c..a86e8bc 100644 --- a/creole/tests/test_setup_utils.py +++ b/creole/tests/test_setup_utils.py @@ -1,45 +1,31 @@ - """ unittest for setup_utils ~~~~~~~~~~~~~~~~~~~~~~~~ - https://code.google.com/p/python-creole/wiki/UseInSetup + https://github.com/jedie/python-creole/wiki/Use-In-Setup :copyleft: 2011-2020 by python-creole team, see AUTHORS for more details. :license: GNU GPL v3 or above, see LICENSE for more details. """ - - +import difflib +import filecmp import os +import shutil +import sys import tempfile -import warnings +from pathlib import Path +from unittest import TestCase -import creole -from creole.setup_utils import get_long_description +from creole.setup_utils import get_long_description, update_creole_rst_readme +from creole.tests.constants import CREOLE_PACKAGE_ROOT from creole.tests.utils.base_unittest import BaseCreoleTest +from creole.tests.utils.utils import IsolatedFilesystem -try: - import docutils # noqa flake8 - DOCUTILS = True -except ImportError: - DOCUTILS = False - - -CREOLE_PACKAGE_ROOT = os.path.abspath(os.path.join(os.path.dirname(creole.__file__), "..")) -TEST_README_DIR = os.path.abspath(os.path.dirname(__file__)) +TEST_README_DIR = Path(__file__).parent TEST_README_FILENAME = "test_README.creole" -# TODO: Use @unittest.skipIf if python 2.6 will be not support anymore. -# @unittest.skipIf(DOCUTILS == False, "docutils not installed.") class SetupUtilsTests(BaseCreoleTest): - def run(self, *args, **kwargs): - # TODO: Remove if python 2.6 will be not support anymore. - if not DOCUTILS: - warnings.warn("Skip SetupUtilsTests, because 'docutils' not installed.") - return - return super(SetupUtilsTests, self).run(*args, **kwargs) - def test_creole_package_path(self): self.assertTrue( os.path.isdir(CREOLE_PACKAGE_ROOT), @@ -123,3 +109,30 @@ class SetupUtilsTests(BaseCreoleTest): txt = "German Umlaute: ä ö ü ß Ä Ö Ü" self.assertIn(txt, long_description) + + +def test_update_rst_readme(): + with IsolatedFilesystem(prefix="temp_dir_prefix"): + old_rest_readme_path = Path(Path().cwd(), 'README.rst') + shutil.copy( + Path(CREOLE_PACKAGE_ROOT, 'README.rst'), + old_rest_readme_path + ) + rest_readme_path = update_creole_rst_readme() + assert str(rest_readme_path.relative_to(CREOLE_PACKAGE_ROOT)) == 'README.rst' + + if filecmp.cmp(rest_readme_path, old_rest_readme_path, shallow=False) is True: + return + + with old_rest_readme_path.open('r') as f: + fromlines = f.readlines() + + with rest_readme_path.open('r') as f: + tolines = f.readlines() + + diff = difflib.ndiff(fromlines, tolines) + print('=' * 100) + sys.stdout.writelines(diff) + print('=' * 100) + + assert fromlines == tolines diff --git a/creole/tests/utils/utils.py b/creole/tests/utils/utils.py index 005f6c4..dd60454 100644 --- a/creole/tests/utils/utils.py +++ b/creole/tests/utils/utils.py @@ -1,26 +1,21 @@ -# coding: utf-8 - - """ unitest generic utils ~~~~~~~~~~~~~~~~~~~~~ Generic utils useable for a markup test. - :copyleft: 2008-2011 by python-creole team, see AUTHORS for more details. + :copyleft: 2008-2020 by python-creole team, see AUTHORS for more details. :license: GNU GPL v3 or above, see LICENSE for more details. """ import difflib +import os +import shutil +import tempfile import textwrap import unittest - -# error output format: -# =1 -> via repr() -# =2 -> raw -VERBOSE = 1 -#VERBOSE = 2 +from pathlib import Path def make_diff(block1, block2): @@ -31,7 +26,7 @@ def make_diff(block1, block2): diff = d.compare(block1, block2) - result = ["%2s %s\n" % (line, i) for line, i in enumerate(diff)] + result = [f"{line:>2} {i}\n" for line, i in enumerate(diff)] return "".join(result) @@ -40,11 +35,17 @@ class MarkupTest(unittest.TestCase): Special error class: Try to display markup errors in a better way. """ + # error output format: + # =1 -> via repr() + # =2 -> raw + VERBOSE = 1 + #VERBOSE = 2 + def _format_output(self, txt): txt = txt.split("\\n") - if VERBOSE == 1: + if self.VERBOSE == 1: txt = "".join(['%s\\n\n' % i for i in txt]) - elif VERBOSE == 2: + elif self.VERBOSE == 2: txt = "".join(['%s\n' % i for i in txt]) return txt @@ -83,3 +84,30 @@ class MarkupTest(unittest.TestCase): txt = txt[1:] return txt + + +class IsolatedFilesystem: + """ + Context manager, e.g.: + with IsolatedFilesystem(prefix="temp_dir_prefix"): + print("I'm in the temp path here: %s" % Path().cwd()) + """ + + def __init__(self, prefix=None): + super().__init__() + + self.prefix = prefix + + def __enter__(self): + print(f"Use prefix: {self.prefix!r}") + + self.cwd = Path().cwd() + self.temp_path = tempfile.mkdtemp(prefix=self.prefix) + os.chdir(self.temp_path) + + def __exit__(self, exc_type, exc_value, traceback): + os.chdir(str(self.cwd)) # str() needed for older python <=3.5 + try: + shutil.rmtree(self.temp_path) + except OSError: + pass -- cgit v1.2.1