Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package ionit it fixes the YAMLLoadWarning from PyYAML 5.1+ and fixes the support for ruamel.yaml. [ Reason ] 1) python3-yaml 5.3.1-4 shows a YAMLLoadWarning. 2) When user have the alternative dependency python3-ruamel.yaml installed instead of python3-yaml, ionit will fail. [ Impact ] Users will see the YAMLLoadWarning in the log output when using YAML files. ionit will fail if users don't have python3-yaml installed (i.e. they already have python3-ruamel.yaml installed). [ Tests ] ionit has 100% test coverage. The tests are run during package build time and as autopkgtest against the installed system. There are upstream tests to test having only python3-ruamel.yaml installed: https://github.com/bdrung/ionit/actions/runs/863074972 [ Risks ] The code change is trivial (5 lines in the ionit file). The package is nearly a leaf package (only lsb build-depends on ionit). [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing [ Other info ] I attach the full debdiff and the reduced debdiff. The reduce debdiff has following stuff removed (since that is not relevant/trivial IMO): * copyright year and email address update * README.md update * Added GitHub CI config file * Changes to the unittests in the tests directory unblock ionit/0.3.8-1 -- Benjamin Drung Senior DevOps Engineer and Debian & Ubuntu Developer Compute Platform Operations 1&1 IONOS SE | Greifswalder Str. 207 | 10405 Berlin | Deutschland E-Mail: benjamin.dr...@ionos.com | Web: www.ionos.de Hauptsitz Montabaur, Amtsgericht Montabaur, HRB 24498 Vorstand: Hüseyin Dogan, Dr. Martin Endreß, Claudia Frese, Henning Kettler, Arthur Mai, Matthias Steinberg, Achim Weiß Aufsichtsratsvorsitzender: Markus Kadelke Member of United Internet
diff -Nru ionit-0.3.6/debian/changelog ionit-0.3.8/debian/changelog --- ionit-0.3.6/debian/changelog 2020-12-15 12:48:40.000000000 +0100 +++ ionit-0.3.8/debian/changelog 2021-05-21 09:27:45.000000000 +0200 @@ -1,3 +1,26 @@ +ionit (0.3.8-1) unstable; urgency=medium + + * New upstream bug-fix release: + - tests: Mark ionit_plugin as first party module + * Let autopkgtest depend on black and ionit as well + + -- Benjamin Drung <benjamin.dr...@ionos.com> Fri, 21 May 2021 09:27:45 +0200 + +ionit (0.3.7-1) unstable; urgency=medium + + * New upstream bug-fix release: + - Check import definition order with isort + - Add test case for black code formatter + - Fix YAMLLoadWarning with PyYAML 5.1+ + - Fix support for ruamel.yaml + - setup.py: Add PyYAML as dependency + * Build-depend on black and isort + * Use py3dist-overrides for alternative yaml dependencies + * Update my email to the new ionos.com domain + * Update year in debian/copyright + + -- Benjamin Drung <benjamin.dr...@ionos.com> Thu, 20 May 2021 20:30:09 +0200 + ionit (0.3.6-2) unstable; urgency=medium * Create/Remove empty /etc/ionit at install/purge (Closes: #977016) diff -Nru ionit-0.3.6/debian/control ionit-0.3.8/debian/control --- ionit-0.3.6/debian/control 2020-12-15 12:47:26.000000000 +0100 +++ ionit-0.3.8/debian/control 2021-05-21 09:27:45.000000000 +0200 @@ -1,9 +1,11 @@ Source: ionit Section: utils Priority: optional -Maintainer: Benjamin Drung <benjamin.dr...@cloud.ionos.com> -Build-Depends: debhelper-compat (= 13), +Maintainer: Benjamin Drung <benjamin.dr...@ionos.com> +Build-Depends: black, + debhelper-compat (= 13), dh-python, + isort, pandoc, pylint (>= 2.2.2-2~) | pylint3, python3, @@ -19,9 +21,7 @@ Package: ionit Architecture: all -Depends: python3-yaml | python3-ruamel.yaml, - ${misc:Depends}, - ${python3:Depends} +Depends: ${misc:Depends}, ${python3:Depends} Description: Render configuration files from Jinja templates ionit is a simple and small configuration templating tool. It collects a context and renders Jinja templates in a given directory. The context can be diff -Nru ionit-0.3.6/debian/copyright ionit-0.3.8/debian/copyright --- ionit-0.3.6/debian/copyright 2020-09-28 12:12:50.000000000 +0200 +++ ionit-0.3.8/debian/copyright 2021-05-21 09:27:45.000000000 +0200 @@ -1,7 +1,7 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Files: * -Copyright: 2018-2019 Benjamin Drung <benjamin.dr...@cloud.ionos.com> +Copyright: 2018-2021 Benjamin Drung <benjamin.dr...@ionos.com> License: ISC Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -17,7 +17,7 @@ Files: tests/mock_open.py tests/test_mock_open.py Copyright: 2013 Ionuț Arțăriși <io...@artarisi.eu> - 2018 Benjamin Drung <benjamin.dr...@cloud.ionos.com> + 2018 Benjamin Drung <benjamin.dr...@ionos.com> License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff -Nru ionit-0.3.6/debian/py3dist-overrides ionit-0.3.8/debian/py3dist-overrides --- ionit-0.3.6/debian/py3dist-overrides 1970-01-01 01:00:00.000000000 +0100 +++ ionit-0.3.8/debian/py3dist-overrides 2021-05-21 09:27:45.000000000 +0200 @@ -0,0 +1 @@ +PyYAML python3-yaml | python3-ruamel.yaml diff -Nru ionit-0.3.6/debian/tests/control ionit-0.3.8/debian/tests/control --- ionit-0.3.6/debian/tests/control 2020-09-28 12:12:50.000000000 +0200 +++ ionit-0.3.8/debian/tests/control 2021-05-21 09:27:45.000000000 +0200 @@ -1,3 +1,3 @@ Tests: unittest Restrictions: allow-stderr -Depends: ionit, pylint (>= 2.2.2-2~) | pylint3, python3-flake8 +Depends: black, ionit, isort, pylint (>= 2.2.2-2~) | pylint3, python3-flake8 diff -Nru ionit-0.3.6/.github/workflows/ci.yaml ionit-0.3.8/.github/workflows/ci.yaml --- ionit-0.3.6/.github/workflows/ci.yaml 1970-01-01 01:00:00.000000000 +0100 +++ ionit-0.3.8/.github/workflows/ci.yaml 2021-05-21 09:17:01.000000000 +0200 @@ -0,0 +1,65 @@ +name: CI + +on: + - push + - pull_request + +jobs: + unittest: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + container: + - debian:bullseye + - debian:testing + - debian:unstable + - ubuntu:focal + - ubuntu:groovy + - ubuntu:hirsute + - ubuntu:latest + - ubuntu:rolling + - ubuntu:devel + yaml_package: + - python3-ruamel.yaml + - python3-yaml + container: + image: ${{ matrix.container }} + steps: + - uses: actions/checkout@v2 + - name: Install dependencies + run: | + apt-get update + apt-get install --yes black isort pylint python3 python3-coverage python3-flake8 python3-jinja2 ${{ matrix.yaml_package }} + - name: Run unit tests + run: | + python3 -m coverage run -m unittest discover -v + python3 -m coverage xml + - name: Install dependencies for Codecov + run: apt-get install --yes curl git + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + fail_ci_if_error: true + functionalities: gcov + + # Debian buster needs pylint3 instead of pylint + unittest-debian-buster: + name: unittest debian:buster + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + yaml_package: + - python3-ruamel.yaml + - python3-yaml + container: + image: debian:buster + steps: + - uses: actions/checkout@v2 + - name: Install dependencies + run: | + apt-get update + apt-get install --yes black isort pylint3 python3 python3-flake8 python3-jinja2 ${{ matrix.yaml_package }} + - name: Run unit tests + run: python3 -m unittest discover -v diff -Nru ionit-0.3.6/ionit ionit-0.3.8/ionit --- ionit-0.3.6/ionit 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/ionit 2021-05-21 09:17:01.000000000 +0200 @@ -1,6 +1,6 @@ #!/usr/bin/python3 -# Copyright (C) 2018-2019, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# Copyright (C) 2018-2021, Benjamin Drung <benjamin.dr...@ionos.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -24,10 +24,15 @@ import sys import jinja2 -import yaml import ionit_plugin +try: + import yaml +except ImportError: + import ruamel.yaml as yaml + + DEFAULT_CONFIG = "/etc/ionit" LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s: %(message)s" SCRIPT_NAME = "ionit" @@ -128,7 +133,7 @@ elif extension == ".yaml": logger.info("Reading configuration file '%s'...", file) with open(file) as config_file: - file_context = yaml.load(config_file) + file_context = yaml.load(config_file, Loader=yaml.SafeLoader) else: logger.info( "Skipping configuration file '%s', " diff -Nru ionit-0.3.6/ionit.1.md ionit-0.3.8/ionit.1.md --- ionit-0.3.6/ionit.1.md 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/ionit.1.md 2021-05-21 09:17:01.000000000 +0200 @@ -90,4 +90,4 @@ # AUTHOR -Benjamin Drung <benjamin.dr...@cloud.ionos.com> +Benjamin Drung <benjamin.dr...@ionos.com> diff -Nru ionit-0.3.6/ionit_plugin.py ionit-0.3.8/ionit_plugin.py --- ionit-0.3.6/ionit_plugin.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/ionit_plugin.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2019, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# Copyright (C) 2018-2021, Benjamin Drung <benjamin.dr...@ionos.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above diff -Nru ionit-0.3.6/LICENSE ionit-0.3.8/LICENSE --- ionit-0.3.6/LICENSE 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/LICENSE 2021-05-21 09:17:01.000000000 +0200 @@ -1,6 +1,6 @@ ionit is licensed under ISC: -Copyright (C) 2018-2019, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +Copyright (C) 2018-2021, Benjamin Drung <benjamin.dr...@ionos.com> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff -Nru ionit-0.3.6/NEWS ionit-0.3.8/NEWS --- ionit-0.3.6/NEWS 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/NEWS 2021-05-21 09:17:01.000000000 +0200 @@ -1,3 +1,16 @@ +ionit 0.3.7 (2021-05-21) + +* tests: Mark ionit_plugin as first party module + +ionit 0.3.7 (2021-05-20) + +* Check import definition order with isort +* Fix code format for older black versions +* Add test case for black code formatter +* Fix YAMLLoadWarning with PyYAML 5.1+ +* Add support for ruamel.yaml +* setup.py: Add PyYAML as dependency + ionit 0.3.6 (2020-09-28) * Address issues found by pylint 2.6.0 (fixes Debian bug #971138) diff -Nru ionit-0.3.6/README.md ionit-0.3.8/README.md --- ionit-0.3.6/README.md 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/README.md 2021-05-21 09:17:01.000000000 +0200 @@ -1,3 +1,11 @@ +[](https://github.com/bdrung/ionit/actions/workflows/ci.yaml) +[](https://codecov.io/gh/bdrung/ionit) +[](https://github.com/psf/black) +[](LICENSE) +[](https://tracker.debian.org/pkg/ionit) +[](https://pypi.org/project/ionit/) +[](https://launchpad.net/ubuntu/+source/ionit) + ionit ===== @@ -60,12 +68,14 @@ * Python >= 3.4 * Python modules: * jinja2 - * yaml or ruamel.yaml + * PyYAML or ruamel.yaml * pandoc (to generate `ionit.1` man page from `ionit.1.md`) The test cases have additional requirements: +* black * flake8 +* isort * pylint Examples @@ -133,10 +143,12 @@ Creating releases ================= -To create a release, increase the version in `setup.py`, document the -noteworthy changes in `NEWS`, and commit the change. Tag the release: +This project uses [semantic versioning](https://semver.org/). To create a +release, increase the version in `setup.py` and document the noteworthy changes +in `NEWS`. Then commit the changes and tag the release: ``` +git commit -sm "Release ionit $(./setup.py --version)" NEWS setup.py git tag v$(./setup.py --version) ``` @@ -146,3 +158,10 @@ git archive --prefix="$name/" HEAD | xz -c9 > "../$name.tar.xz" gpg --output "../$name.tar.xz.asc" --armor --detach-sign "../$name.tar.xz" ``` + +The package for PyPI can be built and uploaded by running: + +``` +pyproject-build --no-isolation +twine upload --repository pypi dist/* +``` diff -Nru ionit-0.3.6/setup.py ionit-0.3.8/setup.py --- ionit-0.3.6/setup.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/setup.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,6 +1,6 @@ #!/usr/bin/python3 -# Copyright (C) 2018-2019, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# Copyright (C) 2018-2021, Benjamin Drung <benjamin.dr...@ionos.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -32,22 +32,37 @@ if __name__ == "__main__": + with open("README.md", "r", encoding="utf-8") as fh: + LONG_DESCRIPTION = fh.read() + setup( name="ionit", - version="0.3.6", + version="0.3.8", description="Render configuration files from Jinja templates", - long_description=( - "ionit is a simple and small configuration templating tool. It collects a context and " - "renders Jinja templates in a given directory. The context can be either static JSON " - "or YAML files or dynamic Python files. Python files can also define functions passed " - "through to the rendering." - ), + long_description=LONG_DESCRIPTION, + long_description_content_type="text/markdown", author="Benjamin Drung", - author_email="benjamin.dr...@cloud.ionos.com", + author_email="benjamin.dr...@ionos.com", url="https://github.com/bdrung/ionit", + project_urls={"Bug Tracker": "https://github.com/bdrung/ionit/issues"}, license="ISC", - install_requires=["jinja2"], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "License :: OSI Approved :: ISC License (ISCL)", + "Operating System :: POSIX", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.4", + "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", + ], + install_requires=["jinja2", "PyYAML"], scripts=["ionit"], py_modules=["ionit_plugin"], data_files=[(systemd_unit_path(), ["ionit.service"])], + python_requires=">=3.4", ) diff -Nru ionit-0.3.6/tests/config/python/number.py ionit-0.3.8/tests/config/python/number.py --- ionit-0.3.6/tests/config/python/number.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/config/python/number.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,5 +1,2 @@ def collect_context(_): - return { - "small": 42, - "big": 8000, - } + return {"small": 42, "big": 8000} diff -Nru ionit-0.3.6/tests/__init__.py ionit-0.3.8/tests/__init__.py --- ionit-0.3.6/tests/__init__.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/__init__.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,4 +1,4 @@ -# Copyright (C) 2017, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# Copyright (C) 2017-2021, Benjamin Drung <benjamin.dr...@ionos.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -12,16 +12,15 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -"""Helper functions for testing ionit""" +"""Helper functions for testing ionit.""" import inspect import os -import sys import unittest def get_source_files(): - """Return a list of sources files/directories (to check with flake8/pylint)""" + """Return a list of sources files/directories (to check with flake8/pylint).""" scripts = ["ionit"] modules = ["tests"] py_files = ["ionit_plugin.py", "setup.py"] @@ -36,8 +35,7 @@ if is_script: with open(code_file, "rb") as script_file: shebang = script_file.readline().decode("utf-8") - if ((sys.version_info[0] == 3 and "python3" in shebang) or - ("python" in shebang and "python3" not in shebang)): + if "python" in shebang: files.append(code_file) else: files.append(code_file) @@ -45,8 +43,10 @@ def unittest_verbosity(): - """Return the verbosity setting of the currently running unittest - program, or None if none is running. + """ + Return the verbosity setting of the currently running unittest. + + If no test is running, return 0. """ frame = inspect.currentframe() while frame: @@ -54,4 +54,4 @@ if isinstance(self, unittest.TestProgram): return self.verbosity frame = frame.f_back - return None # pragma: no cover + return 0 # pragma: no cover diff -Nru ionit-0.3.6/tests/mock_open.py ionit-0.3.8/tests/mock_open.py --- ionit-0.3.6/tests/mock_open.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/mock_open.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,7 +1,7 @@ # The MIT License (MIT) # Copyright (c) 2013 Ionuț Arțăriși <io...@artarisi.eu> -# 2018 Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# 2018 Benjamin Drung <benjamin.dr...@ionos.com> # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff -Nru ionit-0.3.6/tests/pylint.conf ionit-0.3.8/tests/pylint.conf --- ionit-0.3.6/tests/pylint.conf 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/pylint.conf 2021-05-21 09:17:01.000000000 +0200 @@ -27,7 +27,7 @@ [SIMILARITIES] # Minimum lines number of a similarity. -min-similarity-lines=5 +min-similarity-lines=6 [FORMAT] diff -Nru ionit-0.3.6/tests/test_black.py ionit-0.3.8/tests/test_black.py --- ionit-0.3.6/tests/test_black.py 1970-01-01 01:00:00.000000000 +0100 +++ ionit-0.3.8/tests/test_black.py 2021-05-21 09:17:01.000000000 +0200 @@ -0,0 +1,45 @@ +# Copyright (C) 2021, Benjamin Drung <bdr...@debian.org> +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +"""Run black code formatter in check mode.""" + +import subprocess +import sys +import unittest + +from . import get_source_files, unittest_verbosity + + +class BlackTestCase(unittest.TestCase): + """ + This unittest class provides a test that runs the black code + formatter in check mode on the Python source code. The list of + source files is provided by the get_source_files() function. + """ + + def test_black(self): + """Test: Run black code formatter on Python source code.""" + + cmd = ["black", "--check", "--diff", "-l", "99"] + get_source_files() + if unittest_verbosity() >= 2: + sys.stderr.write("Running following command:\n{}\n".format(" ".join(cmd))) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True + ) + output = process.communicate()[0].decode() + + if process.returncode == 1: # pragma: no cover + self.fail("black found code that needs reformatting:\n{}".format(output.strip())) + if process.returncode != 0: # pragma: no cover + self.fail("black exited with code {}:\n{}".format(process.returncode, output.strip())) diff -Nru ionit-0.3.6/tests/test_flake8.py ionit-0.3.8/tests/test_flake8.py --- ionit-0.3.6/tests/test_flake8.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/test_flake8.py 2021-05-21 09:17:01.000000000 +0200 @@ -12,7 +12,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -"""test_flake8.py - Run flake8 check""" +"""Run flake8 check.""" import subprocess import sys @@ -30,7 +30,7 @@ """ def test_flake8(self): - """Test: Run flake8 on Python source code""" + """Test: Run flake8 on Python source code.""" cmd = [sys.executable, "-m", "flake8", "--max-line-length=99"] + get_source_files() if unittest_verbosity() >= 2: sys.stderr.write("Running following command:\n{}\n".format(" ".join(cmd))) diff -Nru ionit-0.3.6/tests/test_ionit.py ionit-0.3.8/tests/test_ionit.py --- ionit-0.3.6/tests/test_ionit.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/test_ionit.py 2021-05-21 09:17:01.000000000 +0200 @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2019, Benjamin Drung <benjamin.dr...@cloud.ionos.com> +# Copyright (C) 2018-2021, Benjamin Drung <benjamin.dr...@ionos.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -281,8 +281,9 @@ template_dir = os.path.join(TEMPLATE_DIR, "static") context = {"first": "A", "second": "B"} with self.assertLogs("ionit", level="ERROR") as context_manager: - with mock_open(os.path.join(template_dir, "counting"), - exception=PermissionError(13, "Permission denied"), complain=False): + counting_filename = os.path.join(template_dir, "counting") + permission_error = PermissionError(13, "Permission denied") + with mock_open(counting_filename, exception=permission_error, complain=False): self.assertEqual(render_templates(template_dir, context, "jinja"), 1) self.assertFalse(os.path.exists(os.path.join(template_dir, "counting"))) self.assertEqual(len(context_manager.output), 1) diff -Nru ionit-0.3.6/tests/test_isort.py ionit-0.3.8/tests/test_isort.py --- ionit-0.3.6/tests/test_isort.py 1970-01-01 01:00:00.000000000 +0100 +++ ionit-0.3.8/tests/test_isort.py 2021-05-21 09:17:01.000000000 +0200 @@ -0,0 +1,51 @@ +# Copyright (C) 2021, Benjamin Drung <bdr...@debian.org> +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +"""Run isort to check if Python import definitions are sorted.""" + +import subprocess +import sys +import unittest + +from . import get_source_files, unittest_verbosity + + +class IsortTestCase(unittest.TestCase): + """ + This unittest class provides a test that runs isort to check if + Python import definitions are sorted. The list of source files + is provided by the get_source_files() function. + """ + + def test_isort(self): + """Test: Run isort on Python source code.""" + + cmd = [ + "isort", + "--check-only", + "--diff", + "-l", + "99", + "-p", + "ionit_plugin", + ] + get_source_files() + if unittest_verbosity() >= 2: + sys.stderr.write("Running following command:\n{}\n".format(" ".join(cmd))) + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True + ) + output = process.communicate()[0].decode() + + if process.returncode != 0: # pragma: no cover + self.fail("isort found unsorted Python import definitions:\n{}".format(output.strip())) diff -Nru ionit-0.3.6/tests/test_pylint.py ionit-0.3.8/tests/test_pylint.py --- ionit-0.3.6/tests/test_pylint.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/tests/test_pylint.py 2021-05-21 09:17:01.000000000 +0200 @@ -13,7 +13,7 @@ # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -"""test_pylint.py - Run pylint""" +"""Run pylint.""" import os import re @@ -35,7 +35,7 @@ """ def test_pylint(self): - """Test: Run pylint on Python source code""" + """Test: Run pylint on Python source code.""" cmd = [sys.executable, "-m", "pylint", "--rcfile=" + CONFIG, "--"] + get_source_files() if unittest_verbosity() >= 2:
diff -Nru ionit-0.3.6/debian/changelog ionit-0.3.8/debian/changelog --- ionit-0.3.6/debian/changelog 2020-12-15 12:48:40.000000000 +0100 +++ ionit-0.3.8/debian/changelog 2021-05-21 09:27:45.000000000 +0200 @@ -1,3 +1,26 @@ +ionit (0.3.8-1) unstable; urgency=medium + + * New upstream bug-fix release: + - tests: Mark ionit_plugin as first party module + * Let autopkgtest depend on black and ionit as well + + -- Benjamin Drung <benjamin.dr...@ionos.com> Fri, 21 May 2021 09:27:45 +0200 + +ionit (0.3.7-1) unstable; urgency=medium + + * New upstream bug-fix release: + - Check import definition order with isort + - Add test case for black code formatter + - Fix YAMLLoadWarning with PyYAML 5.1+ + - Fix support for ruamel.yaml + - setup.py: Add PyYAML as dependency + * Build-depend on black and isort + * Use py3dist-overrides for alternative yaml dependencies + * Update my email to the new ionos.com domain + * Update year in debian/copyright + + -- Benjamin Drung <benjamin.dr...@ionos.com> Thu, 20 May 2021 20:30:09 +0200 + ionit (0.3.6-2) unstable; urgency=medium * Create/Remove empty /etc/ionit at install/purge (Closes: #977016) diff -Nru ionit-0.3.6/debian/control ionit-0.3.8/debian/control --- ionit-0.3.6/debian/control 2020-12-15 12:47:26.000000000 +0100 +++ ionit-0.3.8/debian/control 2021-05-21 09:27:45.000000000 +0200 @@ -1,9 +1,11 @@ Source: ionit Section: utils Priority: optional -Maintainer: Benjamin Drung <benjamin.dr...@cloud.ionos.com> -Build-Depends: debhelper-compat (= 13), +Maintainer: Benjamin Drung <benjamin.dr...@ionos.com> +Build-Depends: black, + debhelper-compat (= 13), dh-python, + isort, pandoc, pylint (>= 2.2.2-2~) | pylint3, python3, @@ -19,9 +21,7 @@ Package: ionit Architecture: all -Depends: python3-yaml | python3-ruamel.yaml, - ${misc:Depends}, - ${python3:Depends} +Depends: ${misc:Depends}, ${python3:Depends} Description: Render configuration files from Jinja templates ionit is a simple and small configuration templating tool. It collects a context and renders Jinja templates in a given directory. The context can be diff -Nru ionit-0.3.6/debian/py3dist-overrides ionit-0.3.8/debian/py3dist-overrides --- ionit-0.3.6/debian/py3dist-overrides 1970-01-01 01:00:00.000000000 +0100 +++ ionit-0.3.8/debian/py3dist-overrides 2021-05-21 09:27:45.000000000 +0200 @@ -0,0 +1 @@ +PyYAML python3-yaml | python3-ruamel.yaml diff -Nru ionit-0.3.6/debian/tests/control ionit-0.3.8/debian/tests/control --- ionit-0.3.6/debian/tests/control 2020-09-28 12:12:50.000000000 +0200 +++ ionit-0.3.8/debian/tests/control 2021-05-21 09:27:45.000000000 +0200 @@ -1,3 +1,3 @@ Tests: unittest Restrictions: allow-stderr -Depends: ionit, pylint (>= 2.2.2-2~) | pylint3, python3-flake8 +Depends: black, ionit, isort, pylint (>= 2.2.2-2~) | pylint3, python3-flake8 diff -Nru ionit-0.3.6/ionit ionit-0.3.8/ionit --- ionit-0.3.6/ionit 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/ionit 2021-05-21 09:17:01.000000000 +0200 @@ -24,10 +24,15 @@ import sys import jinja2 -import yaml import ionit_plugin +try: + import yaml +except ImportError: + import ruamel.yaml as yaml + + DEFAULT_CONFIG = "/etc/ionit" LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s: %(message)s" SCRIPT_NAME = "ionit" @@ -128,7 +133,7 @@ elif extension == ".yaml": logger.info("Reading configuration file '%s'...", file) with open(file) as config_file: - file_context = yaml.load(config_file) + file_context = yaml.load(config_file, Loader=yaml.SafeLoader) else: logger.info( "Skipping configuration file '%s', " diff -Nru ionit-0.3.6/NEWS ionit-0.3.8/NEWS --- ionit-0.3.6/NEWS 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/NEWS 2021-05-21 09:17:01.000000000 +0200 @@ -1,3 +1,16 @@ +ionit 0.3.7 (2021-05-21) + +* tests: Mark ionit_plugin as first party module + +ionit 0.3.7 (2021-05-20) + +* Check import definition order with isort +* Fix code format for older black versions +* Add test case for black code formatter +* Fix YAMLLoadWarning with PyYAML 5.1+ +* Add support for ruamel.yaml +* setup.py: Add PyYAML as dependency + ionit 0.3.6 (2020-09-28) * Address issues found by pylint 2.6.0 (fixes Debian bug #971138) diff -Nru ionit-0.3.6/setup.py ionit-0.3.8/setup.py --- ionit-0.3.6/setup.py 2020-09-28 11:30:34.000000000 +0200 +++ ionit-0.3.8/setup.py 2021-05-21 09:17:01.000000000 +0200 @@ -32,22 +32,37 @@ if __name__ == "__main__": + with open("README.md", "r", encoding="utf-8") as fh: + LONG_DESCRIPTION = fh.read() + setup( name="ionit", - version="0.3.6", + version="0.3.8", description="Render configuration files from Jinja templates", - long_description=( - "ionit is a simple and small configuration templating tool. It collects a context and " - "renders Jinja templates in a given directory. The context can be either static JSON " - "or YAML files or dynamic Python files. Python files can also define functions passed " - "through to the rendering." - ), + long_description=LONG_DESCRIPTION, + long_description_content_type="text/markdown", author="Benjamin Drung", - author_email="benjamin.dr...@cloud.ionos.com", + author_email="benjamin.dr...@ionos.com", url="https://github.com/bdrung/ionit", + project_urls={"Bug Tracker": "https://github.com/bdrung/ionit/issues"}, license="ISC", - install_requires=["jinja2"], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "License :: OSI Approved :: ISC License (ISCL)", + "Operating System :: POSIX", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.4", + "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", + ], + install_requires=["jinja2", "PyYAML"], scripts=["ionit"], py_modules=["ionit_plugin"], data_files=[(systemd_unit_path(), ["ionit.service"])], + python_requires=">=3.4", )