From 43d16fd38212b474d846e43b0d846fff37902d26 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 1 Dec 2023 20:45:05 +0100 Subject: [PATCH 1/4] Use: cli_base.cli_tools.test_utils.logs.AssertLogs --- README.md | 8 +- manageprojects/test_utils/logs.py | 47 +++-------- manageprojects/tests/test_cookiecutter_api.py | 2 +- .../tests/test_cookiecutter_templates.py | 2 +- manageprojects/tests/test_format_file.py | 2 +- manageprojects/tests/test_overwrite.py | 2 +- manageprojects/tests/test_patching.py | 2 +- .../tests/test_utilities_publish.py | 2 +- .../tests/test_utilities_pyproject_toml.py | 2 +- pyproject.toml | 2 +- requirements.dev.txt | 84 +++++++++---------- requirements.txt | 18 ++-- 12 files changed, 75 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index 2ab4d73..b725438 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,8 @@ See also git tags: https://github.com/jedie/manageprojects/tags [comment]: <> (✂✂✂ auto generated history start ✂✂✂) +* [**dev**](https://github.com/jedie/manageprojects/compare/v0.15.4...main) + * 2023-12-01 - Use: cli_base.cli_tools.test_utils.logs.AssertLogs * [v0.15.4](https://github.com/jedie/manageprojects/compare/v0.15.3...v0.15.4) * 2023-11-27 - Use "flake8-bugbear", too. * [v0.15.3](https://github.com/jedie/manageprojects/compare/v0.15.2...v0.15.3) @@ -328,6 +330,9 @@ See also git tags: https://github.com/jedie/manageprojects/tags * 2023-11-07 - Update requirements * [v0.15.2](https://github.com/jedie/manageprojects/compare/v0.15.1...v0.15.2) * 2023-11-01 - Update requirements + +
Expand older history entries ... + * [v0.15.1](https://github.com/jedie/manageprojects/compare/v0.15.0...v0.15.1) * 2023-10-08 - Update text matrix with Python v3.12 * 2023-10-08 - fix github CI @@ -335,9 +340,6 @@ See also git tags: https://github.com/jedie/manageprojects/tags * 2023-10-08 - Autogenerate history via https://github.com/jedie/cli-base-utilities * 2023-09-24 - apply migrations * 2023-09-24 - Update requirements - -
Expand older history entries ... - * [v0.15.0](https://github.com/jedie/manageprojects/compare/v0.14.1...v0.15.0) * 2023-08-17 - Deprecate Git * 2023-08-17 - Deprecate print_version() (moved to cli_base) diff --git a/manageprojects/test_utils/logs.py b/manageprojects/test_utils/logs.py index 7b69c72..96f614c 100644 --- a/manageprojects/test_utils/logs.py +++ b/manageprojects/test_utils/logs.py @@ -1,42 +1,17 @@ -import logging -from pathlib import Path -from unittest import TestCase +import warnings +from cli_base.cli_tools.test_utils.logs import AssertLogs as OriginalAssertLogs -class AssertLogs: + +class AssertLogs(OriginalAssertLogs): """ Capture and assert log output from different loggers. """ - def __init__( - self, - test_case: TestCase, - loggers: tuple[str, ...] = ('manageprojects', 'cookiecutter'), - level=logging.DEBUG, - ): - assertLogs = test_case.assertLogs - - self.logs = [] - for logger in loggers: - self.logs.append(assertLogs(logger, level=level)) - - self.context_managers = None - - def __enter__(self): - self.context_managers = [log.__enter__() for log in self.logs] - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - for log in self.logs: - log.__exit__(exc_type, exc_val, exc_tb) - - def assert_in(self, *test_parts): - outputs = [] - for cm in self.context_managers: - outputs.extend(cm.output) - - output = '\n'.join(outputs) - for part in test_parts: - if isinstance(part, Path): - part = str(part) - assert part in output, f'Log part {part!r} not found in:\n{output}' + def __init__(self, *args, **kwargs): + warnings.warn( + 'Migrate to: cli_base.cli_tools.test_utils.logs.AssertLogs !', + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) diff --git a/manageprojects/tests/test_cookiecutter_api.py b/manageprojects/tests/test_cookiecutter_api.py index 977dd1b..8e6eda5 100644 --- a/manageprojects/tests/test_cookiecutter_api.py +++ b/manageprojects/tests/test_cookiecutter_api.py @@ -2,9 +2,9 @@ from pathlib import Path from bx_py_utils.path import assert_is_dir +from cli_base.cli_tools.test_utils.logs import AssertLogs from manageprojects.cookiecutter_api import get_repo_path -from manageprojects.test_utils.logs import AssertLogs from manageprojects.tests.base import BaseTestCase diff --git a/manageprojects/tests/test_cookiecutter_templates.py b/manageprojects/tests/test_cookiecutter_templates.py index 4102851..3e4f71b 100644 --- a/manageprojects/tests/test_cookiecutter_templates.py +++ b/manageprojects/tests/test_cookiecutter_templates.py @@ -6,12 +6,12 @@ from bx_py_utils.path import assert_is_dir, assert_is_file from bx_py_utils.test_utils.datetime import parse_dt from cli_base.cli_tools.test_utils.git_utils import init_git +from cli_base.cli_tools.test_utils.logs import AssertLogs from manageprojects.cli.cli_app import clone_project from manageprojects.cookiecutter_templates import start_managed_project, update_managed_project from manageprojects.data_classes import CookiecutterResult, GenerateTemplatePatchResult, ManageProjectsMeta from manageprojects.test_utils.click_cli_utils import invoke_click -from manageprojects.test_utils.logs import AssertLogs from manageprojects.tests.base import BaseTestCase from manageprojects.utilities.pyproject_toml import PyProjectToml from manageprojects.utilities.temp_path import TemporaryDirectory diff --git a/manageprojects/tests/test_format_file.py b/manageprojects/tests/test_format_file.py index 06fa31e..2e482ea 100644 --- a/manageprojects/tests/test_format_file.py +++ b/manageprojects/tests/test_format_file.py @@ -2,6 +2,7 @@ from pathlib import Path from unittest import TestCase +from cli_base.cli_tools.test_utils.logs import AssertLogs from packaging.version import Version from manageprojects.constants import PY_BIN_PATH @@ -15,7 +16,6 @@ get_git_info, get_pyproject_info, ) -from manageprojects.test_utils.logs import AssertLogs from manageprojects.test_utils.subprocess import SimpleRunReturnCallback, SubprocessCallMock from manageprojects.tests.base import GIT_BIN_PARENT, PROJECT_PATH from manageprojects.utilities.temp_path import TemporaryDirectory diff --git a/manageprojects/tests/test_overwrite.py b/manageprojects/tests/test_overwrite.py index e6df775..6f29fd2 100644 --- a/manageprojects/tests/test_overwrite.py +++ b/manageprojects/tests/test_overwrite.py @@ -5,10 +5,10 @@ from bx_py_utils.path import assert_is_file from bx_py_utils.test_utils.redirect import RedirectOut from cli_base.cli_tools.test_utils.git_utils import init_git +from cli_base.cli_tools.test_utils.logs import AssertLogs from manageprojects.cookiecutter_templates import update_managed_project from manageprojects.data_classes import ManageProjectsMeta, OverwriteResult -from manageprojects.test_utils.logs import AssertLogs from manageprojects.tests.base import BaseTestCase from manageprojects.utilities.pyproject_toml import PyProjectToml from manageprojects.utilities.temp_path import TemporaryDirectory diff --git a/manageprojects/tests/test_patching.py b/manageprojects/tests/test_patching.py index b8d6d48..ef82014 100644 --- a/manageprojects/tests/test_patching.py +++ b/manageprojects/tests/test_patching.py @@ -5,10 +5,10 @@ from bx_py_utils.path import assert_is_dir from bx_py_utils.test_utils.snapshot import assert_text_snapshot from cli_base.cli_tools.test_utils.git_utils import init_git +from cli_base.cli_tools.test_utils.logs import AssertLogs from manageprojects.data_classes import GenerateTemplatePatchResult from manageprojects.patching import generate_template_patch, make_git_diff -from manageprojects.test_utils.logs import AssertLogs from manageprojects.tests.base import BaseTestCase from manageprojects.utilities.temp_path import TemporaryDirectory diff --git a/manageprojects/tests/test_utilities_publish.py b/manageprojects/tests/test_utilities_publish.py index bd39c87..44575ea 100644 --- a/manageprojects/tests/test_utilities_publish.py +++ b/manageprojects/tests/test_utilities_publish.py @@ -6,11 +6,11 @@ from cli_base.cli_tools import subprocess_utils from cli_base.cli_tools.test_utils.git_utils import init_git +from cli_base.cli_tools.test_utils.logs import AssertLogs from packaging.version import Version import manageprojects from manageprojects.cli.dev import PACKAGE_ROOT -from manageprojects.test_utils.logs import AssertLogs from manageprojects.test_utils.subprocess import FakeStdout, SubprocessCallMock from manageprojects.tests.base import GIT_BIN_PARENT from manageprojects.utilities.publish import ( diff --git a/manageprojects/tests/test_utilities_pyproject_toml.py b/manageprojects/tests/test_utilities_pyproject_toml.py index d1f4e43..358f21d 100644 --- a/manageprojects/tests/test_utilities_pyproject_toml.py +++ b/manageprojects/tests/test_utilities_pyproject_toml.py @@ -3,10 +3,10 @@ from bx_py_utils.path import assert_is_file from bx_py_utils.test_utils.datetime import parse_dt +from cli_base.cli_tools.test_utils.logs import AssertLogs import manageprojects from manageprojects.data_classes import ManageProjectsMeta -from manageprojects.test_utils.logs import AssertLogs from manageprojects.tests.base import BaseTestCase from manageprojects.utilities.pyproject_toml import PyProjectToml, find_pyproject_toml from manageprojects.utilities.temp_path import TemporaryDirectory diff --git a/pyproject.toml b/pyproject.toml index 28c0750..e53f76a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "codespell", # https://github.com/codespell-project/codespell "mypy", # https://github.com/python/mypy - "cli-base-utilities", # https://github.com/jedie/cli-base-utilities + "cli-base-utilities>=0.5.0", # https://github.com/jedie/cli-base-utilities "click", # https://github.com/pallets/click/ "rich-click", # https://github.com/ewels/rich-click "rich", # https://github.com/Textualize/rich diff --git a/requirements.dev.txt b/requirements.dev.txt index df8ef14..81710e2 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -52,9 +52,9 @@ build==1.0.3 \ --hash=sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b \ --hash=sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f # via pip-tools -bx-py-utils==88 \ - --hash=sha256:32fbc7e9ff3dfb0a817c80fb1d165ec559643dab59c0be549e646acbf8223b75 \ - --hash=sha256:3a6f4eeef6abcac834b2c1ea4c5211130fd930a064aa0baabddd7c2bd00e38ac +bx-py-utils==89 \ + --hash=sha256:179649df6b2541d241e23e2cf1ac314586717d8e60f57326fe5c9f110f3d602e \ + --hash=sha256:68215036c448fd04baf989cd51a9523a9edb8239a7520c9177fb874d64914878 # via cli-base-utilities cachetools==5.3.2 \ --hash=sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2 \ @@ -216,9 +216,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.4.4 \ - --hash=sha256:110bef895fb7dfc29662f463ccedc4c985a880afbde2e6dea387d0d2f96f4985 \ - --hash=sha256:72d4248776519a21c3448d6e348511ce6fe8c3742c154e158473236c8278fb1c +cli-base-utilities==0.5.0 \ + --hash=sha256:366caa000bb0908914bc09e7b9cc2b6921bcf51e0aa2a91ae36cd5e092d774d8 \ + --hash=sha256:67eec2c61b00ed9f376ca364e6ef85d65db6c0908cf530d7015483ef2902f27e # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ @@ -297,30 +297,30 @@ coverage==7.3.2 \ --hash=sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a \ --hash=sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4 # via manageprojects (pyproject.toml) -cryptography==41.0.5 \ - --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ - --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ - --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ - --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ - --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ - --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ - --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ - --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ - --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ - --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ - --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ - --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ - --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ - --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ - --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ - --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ - --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ - --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ - --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ - --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ - --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ - --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ - --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via secretstorage darker[color,flynt,isort]==1.7.2 \ --hash=sha256:ec5b7c382d9537611c164f3ecca2e1b8a7923bc5a02bf22f6e7f6c8bcbdf593a \ @@ -354,9 +354,9 @@ flake8==6.1.0 \ # via # flake8-bugbear # manageprojects (pyproject.toml) -flake8-bugbear==23.11.26 \ - --hash=sha256:55d00c8a3c48c995c1f0ec0df54f8c9cf530c06035ce53975a03517d2e7f53e5 \ - --hash=sha256:8e36119071bab626b6dab834fadd6d03c06090e9b189e67b4905821df8212fee +flake8-bugbear==23.11.28 \ + --hash=sha256:0ba6c44eaa0e4782da94c5c2607159a0e73569369246cd179cc143a0e16b78ba \ + --hash=sha256:8d0f351d954fd860851710cd8b5b28742b2339c0e58848b103418dd9cddb9aa4 # via manageprojects (pyproject.toml) flynt==0.77 \ --hash=sha256:2863ac8ec19d6ec8d29e760546e6ced644baf6dff3c7cdc77e03abbd29b80f14 \ @@ -366,9 +366,9 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 +importlib-metadata==6.9.0 \ + --hash=sha256:1c8dc6839ddc9771412596926f24cb5a553bbd40624ee2c7e55e531542bed3b8 \ + --hash=sha256:e8acb523c335a91822674e149b46c0399ec4d328c4d1f6e49c273da5ff0201b9 # via # keyring # twine @@ -781,9 +781,9 @@ tomlkit==0.12.3 \ # via # cli-base-utilities # manageprojects (pyproject.toml) -tox==4.11.3 \ - --hash=sha256:5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951 \ - --hash=sha256:599af5e5bb0cad0148ac1558a0b66f8fff219ef88363483b8d92a81e4246f28f +tox==4.11.4 \ + --hash=sha256:2adb83d68f27116812b69aa36676a8d6a52249cb0d173649de0e7d0c2e3e7229 \ + --hash=sha256:73a7240778fabf305aeb05ab8ea26e575e042ab5a18d71d0ed13e343a51d6ce1 # via manageprojects (pyproject.toml) twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ @@ -805,9 +805,9 @@ urllib3==2.1.0 \ # via # requests # twine -virtualenv==20.24.7 \ - --hash=sha256:69050ffb42419c91f6c1284a7b24e0475d793447e35929b488bf6a0aade39353 \ - --hash=sha256:a18b3fd0314ca59a2e9f4b556819ed07183b3e9a3702ecfe213f593d44f7b3fd +virtualenv==20.25.0 \ + --hash=sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3 \ + --hash=sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b # via tox wheel==0.42.0 \ --hash=sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d \ diff --git a/requirements.txt b/requirements.txt index 3b1711a..03abd08 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,9 +48,9 @@ black==23.11.0 \ --hash=sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911 \ --hash=sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142 # via darker -bx-py-utils==88 \ - --hash=sha256:32fbc7e9ff3dfb0a817c80fb1d165ec559643dab59c0be549e646acbf8223b75 \ - --hash=sha256:3a6f4eeef6abcac834b2c1ea4c5211130fd930a064aa0baabddd7c2bd00e38ac +bx-py-utils==89 \ + --hash=sha256:179649df6b2541d241e23e2cf1ac314586717d8e60f57326fe5c9f110f3d602e \ + --hash=sha256:68215036c448fd04baf989cd51a9523a9edb8239a7520c9177fb874d64914878 # via cli-base-utilities certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ @@ -152,9 +152,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.4.4 \ - --hash=sha256:110bef895fb7dfc29662f463ccedc4c985a880afbde2e6dea387d0d2f96f4985 \ - --hash=sha256:72d4248776519a21c3448d6e348511ce6fe8c3742c154e158473236c8278fb1c +cli-base-utilities==0.5.0 \ + --hash=sha256:366caa000bb0908914bc09e7b9cc2b6921bcf51e0aa2a91ae36cd5e092d774d8 \ + --hash=sha256:67eec2c61b00ed9f376ca364e6ef85d65db6c0908cf530d7015483ef2902f27e # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ @@ -187,9 +187,9 @@ flake8==6.1.0 \ # via # flake8-bugbear # manageprojects (pyproject.toml) -flake8-bugbear==23.11.26 \ - --hash=sha256:55d00c8a3c48c995c1f0ec0df54f8c9cf530c06035ce53975a03517d2e7f53e5 \ - --hash=sha256:8e36119071bab626b6dab834fadd6d03c06090e9b189e67b4905821df8212fee +flake8-bugbear==23.11.28 \ + --hash=sha256:0ba6c44eaa0e4782da94c5c2607159a0e73569369246cd179cc143a0e16b78ba \ + --hash=sha256:8d0f351d954fd860851710cd8b5b28742b2339c0e58848b103418dd9cddb9aa4 # via manageprojects (pyproject.toml) flynt==0.77 \ --hash=sha256:2863ac8ec19d6ec8d29e760546e6ced644baf6dff3c7cdc77e03abbd29b80f14 \ From 008d43b35e86f4c0e52fd195ea873598e6e398ba Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Fri, 1 Dec 2023 21:50:56 +0100 Subject: [PATCH 2/4] Apply https://github.com/jedie/cookiecutter_templates updates --- .gitignore | 1 + README.md | 3 +- manageprojects/cli/cli_app.py | 9 ++ manageprojects/cli/dev.py | 142 +++++++++++-------------------- manageprojects/tests/__init__.py | 32 +++++-- pyproject.toml | 4 +- 6 files changed, 89 insertions(+), 102 deletions(-) diff --git a/.gitignore b/.gitignore index 202bedb..94a4547 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__ /dist/ /coverage.* +*.orig !.github !.editorconfig diff --git a/README.md b/README.md index b725438..c8a0729 100644 --- a/README.md +++ b/README.md @@ -299,7 +299,7 @@ Usage: ./dev-cli.py [OPTIONS] COMMAND [ARGS]... ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮ │ check-code-style Check code style by calling darker + flake8 │ -│ coverage Run and show coverage. │ +│ coverage Run tests and show coverage report. │ │ fix-code-style Fix code style of all manageprojects source code files via darker │ │ install Run pip-sync and install 'manageprojects' via pip as editable. │ │ mypy Run Mypy (configured in pyproject.toml) │ @@ -322,6 +322,7 @@ See also git tags: https://github.com/jedie/manageprojects/tags [comment]: <> (✂✂✂ auto generated history start ✂✂✂) * [**dev**](https://github.com/jedie/manageprojects/compare/v0.15.4...main) + * 2023-12-01 - Apply https://github.com/jedie/cookiecutter_templates updates * 2023-12-01 - Use: cli_base.cli_tools.test_utils.logs.AssertLogs * [v0.15.4](https://github.com/jedie/manageprojects/compare/v0.15.3...v0.15.4) * 2023-11-27 - Use "flake8-bugbear", too. diff --git a/manageprojects/cli/cli_app.py b/manageprojects/cli/cli_app.py index 6525823..5311ded 100644 --- a/manageprojects/cli/cli_app.py +++ b/manageprojects/cli/cli_app.py @@ -14,6 +14,8 @@ from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE from cli_base.cli_tools.version_info import print_version from rich import print # noqa +from rich.console import Console +from rich.traceback import install as rich_traceback_install from rich_click import RichGroup import manageprojects @@ -422,6 +424,13 @@ def version(): def main(): print_version(manageprojects) + console = Console() + rich_traceback_install( + width=console.size.width, # full terminal width + show_locals=True, + suppress=[click], + max_frames=2, + ) # Execute Click CLI: cli.name = './cli.py' diff --git a/manageprojects/cli/dev.py b/manageprojects/cli/dev.py index 92562a1..7d54876 100644 --- a/manageprojects/cli/dev.py +++ b/manageprojects/cli/dev.py @@ -7,9 +7,13 @@ import rich_click as click from bx_py_utils.path import assert_is_file +from cli_base.cli_tools.dev_tools import run_coverage, run_tox, run_unittest_cli from cli_base.cli_tools.subprocess_utils import verbose_check_call +from cli_base.cli_tools.test_utils.snapshot import UpdateTestSnapshotFiles +from cli_base.cli_tools.verbosity import OPTION_KWARGS_VERBOSE from cli_base.cli_tools.version_info import print_version -from rich import print # noqa; noqa +from rich.console import Console +from rich.traceback import install as rich_traceback_install from rich_click import RichGroup import manageprojects @@ -59,31 +63,15 @@ def cli(): @click.command() -@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) -def mypy(verbose: bool = True): +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def mypy(verbosity: int): """Run Mypy (configured in pyproject.toml)""" - verbose_check_call('mypy', '.', cwd=PACKAGE_ROOT, verbose=verbose, exit_on_error=True) + verbose_check_call('mypy', '.', cwd=PACKAGE_ROOT, verbose=verbosity > 0, exit_on_error=True) cli.add_command(mypy) -@click.command() -@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) -def coverage(verbose: bool = True): - """ - Run and show coverage. - """ - verbose_check_call('coverage', 'run', verbose=verbose, exit_on_error=True) - verbose_check_call('coverage', 'combine', '--append', verbose=verbose, exit_on_error=True) - verbose_check_call('coverage', 'report', '--fail-under=30', verbose=verbose, exit_on_error=True) - verbose_check_call('coverage', 'xml', verbose=verbose, exit_on_error=True) - verbose_check_call('coverage', 'json', verbose=verbose, exit_on_error=True) - - -cli.add_command(coverage) - - @click.command() def install(): """ @@ -163,7 +151,7 @@ def publish(): """ Build and upload this project to PyPi """ - _run_unittest_cli(verbose=False, exit_after_run=False) # Don't publish a broken state + run_unittest_cli(verbose=False, exit_after_run=False) # Don't publish a broken state publish_package( module=manageprojects, @@ -177,12 +165,12 @@ def publish(): @click.command() @click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) -@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) -def fix_code_style(color: bool = True, verbose: bool = False): +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def fix_code_style(color: bool, verbosity: int): """ Fix code style of all manageprojects source code files via darker """ - code_style.fix(package_root=PACKAGE_ROOT, color=color, verbose=verbose) + code_style.fix(package_root=PACKAGE_ROOT, color=color, verbose=verbosity > 0) cli.add_command(fix_code_style) @@ -190,95 +178,58 @@ def fix_code_style(color: bool = True, verbose: bool = False): @click.command() @click.option('--color/--no-color', **OPTION_ARGS_DEFAULT_TRUE) -@click.option('--verbose/--no-verbose', **OPTION_ARGS_DEFAULT_FALSE) -def check_code_style(color: bool = True, verbose: bool = False): +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def check_code_style(color: bool, verbosity: int): """ Check code style by calling darker + flake8 """ - code_style.check(package_root=PACKAGE_ROOT, color=color, verbose=verbose) + code_style.check(package_root=PACKAGE_ROOT, color=color, verbose=verbosity > 0) cli.add_command(check_code_style) @click.command() -def update_test_snapshot_files(): +@click.option('-v', '--verbosity', **OPTION_KWARGS_VERBOSE) +def update_test_snapshot_files(verbosity: int): """ Update all test snapshot files (by remove and recreate all snapshot files) """ - def iter_snapshot_files(): - yield from PACKAGE_ROOT.rglob('*.snapshot.*') - - removed_file_count = 0 - for item in iter_snapshot_files(): - item.unlink() - removed_file_count += 1 - print(f'{removed_file_count} test snapshot files removed... run tests...') - - # Just recreate them by running tests: - _run_unittest_cli( - extra_env=dict( - RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error - ), - verbose=False, - exit_after_run=False, - ) - - new_files = len(list(iter_snapshot_files())) - print(f'{new_files} test snapshot files created, ok.\n') + with UpdateTestSnapshotFiles(root_path=PACKAGE_ROOT, verbose=verbosity > 0): + # Just recreate them by running tests: + run_unittest_cli( + extra_env=dict( + RAISE_SNAPSHOT_ERRORS='0', # Recreate snapshot files without error + ), + verbose=verbosity > 1, + exit_after_run=False, + ) cli.add_command(update_test_snapshot_files) -def _run_unittest_cli(extra_env=None, verbose=True, exit_after_run=True): +@click.command() # Dummy command +def test(): """ - Call the origin unittest CLI and pass all args to it. + Run unittests """ - if extra_env is None: - extra_env = dict() - - extra_env.update( - dict( - PYTHONUNBUFFERED='1', - PYTHONWARNINGS='always', - ) - ) + run_unittest_cli() - args = sys.argv[2:] - if not args: - if verbose: - args = ('--verbose', '--locals', '--buffer') - else: - args = ('--locals', '--buffer') - verbose_check_call( - sys.executable, - '-m', - 'unittest', - *args, - timeout=15 * 60, - extra_env=extra_env, - ) - if exit_after_run: - sys.exit(0) +cli.add_command(test) @click.command() # Dummy command -def test(): +def coverage(): """ - Run unittests + Run tests and show coverage report. """ - _run_unittest_cli() + run_coverage() -cli.add_command(test) - - -def _run_tox(): - verbose_check_call(sys.executable, '-m', 'tox', *sys.argv[2:]) - sys.exit(0) +cli.add_command(coverage) @click.command() # Dummy "tox" command @@ -286,7 +237,7 @@ def tox(): """ Run tox """ - _run_tox() + run_tox() cli.add_command(tox) @@ -305,13 +256,24 @@ def version(): def main(): print_version(manageprojects) + console = Console() + rich_traceback_install( + width=console.size.width, # full terminal width + show_locals=True, + suppress=[click], + max_frames=2, + ) + if len(sys.argv) >= 2: - # Check if we just pass a command call + # Check if we can just pass a command call to origin CLI: command = sys.argv[1] - if command == 'test': - _run_unittest_cli() - elif command == 'tox': - _run_tox() + command_map = { + 'test': run_unittest_cli, + 'tox': run_tox, + 'coverage': run_coverage, + } + if real_func := command_map.get(command): + real_func(argv=sys.argv, exit_after_run=True) # Execute Click CLI: cli() diff --git a/manageprojects/tests/__init__.py b/manageprojects/tests/__init__.py index b7e2b1a..e6ca7ca 100644 --- a/manageprojects/tests/__init__.py +++ b/manageprojects/tests/__init__.py @@ -1,15 +1,31 @@ import os import unittest.util +from pathlib import Path -from manageprojects.utilities.log_utils import log_config +from bx_py_utils.test_utils.deny_requests import deny_any_real_request +from cli_base.cli_tools.verbosity import MAX_LOG_LEVEL, setup_logging +from rich import print # noqa -# Hacky way to expand the failed test output: -unittest.util._MAX_LENGTH = os.environ.get('UNITTEST_MAX_LENGTH', 300) +def pre_configure_tests() -> None: + print(f'Configure unittests via "load_tests Protocol" from {Path(__file__).relative_to(Path.cwd())}') + # Hacky way to display more "assert"-Context in failing tests: + _MIN_MAX_DIFF = unittest.util._MAX_LENGTH - unittest.util._MIN_DIFF_LEN + unittest.util._MAX_LENGTH = int(os.environ.get('UNITTEST_MAX_LENGTH', 300)) + unittest.util._MIN_DIFF_LEN = unittest.util._MAX_LENGTH - _MIN_MAX_DIFF -log_config( - format='%(levelname)s %(name)s.%(funcName)s %(lineno)d | %(message)s', - log_in_file=False, - raise_log_output=True, -) + # Deny any request via docket/urllib3 because tests they should mock all requests: + deny_any_real_request() + + # Display DEBUG logs in tests: + setup_logging(verbosity=MAX_LOG_LEVEL) + + +def load_tests(loader, tests, pattern): + """ + Use unittest "load_tests Protocol" as a hook to setup test environment before running tests. + https://docs.python.org/3/library/unittest.html#load-tests-protocol + """ + pre_configure_tests() + return loader.discover(start_dir=Path(__file__).parent, pattern=pattern) diff --git a/pyproject.toml b/pyproject.toml index e53f76a..31c8c8a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -131,9 +131,6 @@ commands_pre = pip-sync requirements.dev.txt commands = {envpython} -m coverage run --context='{envname}' - {envpython} -m coverage combine --append - {envpython} -m coverage xml - {envpython} -m coverage report """ @@ -165,6 +162,7 @@ applied_migrations = [ "8d0ebe1", # 2023-08-17T18:15:10+02:00 "be3f649", # 2023-08-22T19:36:57+02:00 "385f654", # 2023-10-08T21:09:24+02:00 + "d1ed4b1", # 2023-12-01T21:41:29+01:00 ] [manageprojects.cookiecutter_context.cookiecutter] From 879184987e4750c4edc16f5e1c777048ae6e9655 Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sat, 2 Dec 2023 00:32:56 +0100 Subject: [PATCH 3/4] Use code style tooling from cli-base-utilities --- README.md | 1 + manageprojects/test_utils/click_cli_utils.py | 25 +++++------- manageprojects/tests/test_project_setup.py | 40 ++------------------ manageprojects/utilities/code_style.py | 13 ++++++- pyproject.toml | 2 +- requirements.dev.txt | 6 +-- requirements.txt | 6 +-- 7 files changed, 33 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index c8a0729..750deac 100644 --- a/README.md +++ b/README.md @@ -322,6 +322,7 @@ See also git tags: https://github.com/jedie/manageprojects/tags [comment]: <> (✂✂✂ auto generated history start ✂✂✂) * [**dev**](https://github.com/jedie/manageprojects/compare/v0.15.4...main) + * 2023-12-02 - Use code style tooling from cli-base-utilities * 2023-12-01 - Apply https://github.com/jedie/cookiecutter_templates updates * 2023-12-01 - Use: cli_base.cli_tools.test_utils.logs.AssertLogs * [v0.15.4](https://github.com/jedie/manageprojects/compare/v0.15.3...v0.15.4) diff --git a/manageprojects/test_utils/click_cli_utils.py b/manageprojects/test_utils/click_cli_utils.py index 7ba955f..91a57cf 100644 --- a/manageprojects/test_utils/click_cli_utils.py +++ b/manageprojects/test_utils/click_cli_utils.py @@ -1,7 +1,7 @@ +import warnings + import click -from bx_py_utils.path import assert_is_file -from cli_base.cli_tools.subprocess_utils import verbose_check_output -from cli_base.cli_tools.test_utils.rich_test_utils import NoColorEnvRichClick +from cli_base.cli_tools.test_utils.rich_test_utils import NoColorEnvRichClick, NoColorRichClickCli from click.testing import CliRunner, Result @@ -9,19 +9,14 @@ def subprocess_cli(*, cli_bin, args, exit_on_error=True): - assert_is_file(cli_bin) - return verbose_check_output( - cli_bin, - *args, - cwd=cli_bin.parent, - extra_env={ - 'COLUMNS': str(TERMINAL_WIDTH), - 'NO_COLOR': '1', - 'PYTHONUNBUFFERED': '1', - 'TERM': 'dump', - }, - exit_on_error=exit_on_error, + warnings.warn( + 'Migrate to: cli_base.cli_tools.test_utils.rich_test_utils.NoColorRichClickCli context manager !', + DeprecationWarning, + stacklevel=2, ) + with NoColorRichClickCli() as cm: + stdout = cm.invoke(cli_bin=cli_bin, args=args, exit_on_error=exit_on_error) + return stdout class ClickInvokeCliException(Exception): diff --git a/manageprojects/tests/test_project_setup.py b/manageprojects/tests/test_project_setup.py index 5289a66..a9dc7be 100644 --- a/manageprojects/tests/test_project_setup.py +++ b/manageprojects/tests/test_project_setup.py @@ -2,13 +2,12 @@ from unittest import TestCase from bx_py_utils.path import assert_is_file +from cli_base.cli_tools.code_style import assert_code_style from packaging.version import Version from manageprojects import __version__ from manageprojects.cli.cli_app import PACKAGE_ROOT -from manageprojects.test_utils.click_cli_utils import subprocess_cli from manageprojects.test_utils.project_setup import check_editor_config, get_py_max_line_length -from manageprojects.utilities import code_style class ProjectSetupTestCase(TestCase): @@ -31,41 +30,8 @@ def test_version(self): self.assertIn(f'manageprojects v{__version__}', output) def test_code_style(self): - dev_cli_bin = PACKAGE_ROOT / 'dev-cli.py' - assert_is_file(dev_cli_bin) - - try: - output = subprocess_cli( - cli_bin=dev_cli_bin, - args=('check-code-style',), - exit_on_error=False, - ) - except subprocess.CalledProcessError as err: - self.assertIn('.venv/bin/darker', err.stdout) # darker was called? - else: - if 'Code style: OK' in output: - self.assertIn('.venv/bin/darker', output) # darker was called? - return # Nothing to fix -> OK - - # Try to "auto" fix code style: - - try: - output = subprocess_cli( - cli_bin=dev_cli_bin, - args=('fix-code-style',), - exit_on_error=False, - ) - except subprocess.CalledProcessError as err: - output = err.stdout - - self.assertIn('.venv/bin/darker', output) # darker was called? - - # Check again and display the output: - - try: - code_style.check(package_root=PACKAGE_ROOT) - except SystemExit as err: - self.assertEqual(err.code, 0, 'Code style error, see output above!') + return_code = assert_code_style(package_root=PACKAGE_ROOT) + self.assertEqual(return_code, 0, 'Code style error, see output above!') def test_check_editor_config(self): check_editor_config(package_root=PACKAGE_ROOT) diff --git a/manageprojects/utilities/code_style.py b/manageprojects/utilities/code_style.py index 31c79ba..0231f03 100644 --- a/manageprojects/utilities/code_style.py +++ b/manageprojects/utilities/code_style.py @@ -1,4 +1,5 @@ import sys +import warnings from pathlib import Path from cli_base.cli_tools.subprocess_utils import ToolsExecutor, verbose_check_call @@ -15,7 +16,7 @@ def _call_darker(*args, package_root: Path, color: bool = True, verbose: bool = final_args += list(args) tools_executor = ToolsExecutor(cwd=package_root) - tools_executor.verbose_check_output( + tools_executor.verbose_check_call( *final_args, exit_on_error=True, ) @@ -25,6 +26,11 @@ def fix(package_root: Path, color: bool = True, verbose: bool = False): """ Fix code style via darker """ + warnings.warn( + 'Migrate to: cli_base.cli_tools.code_style.fix !', + DeprecationWarning, + stacklevel=2, + ) _call_darker(color=color, verbose=verbose, package_root=package_root) print('Code style fixed, OK.') sys.exit(0) @@ -34,6 +40,11 @@ def check(package_root: Path, color: bool = True, verbose: bool = False): """ Check code style by calling darker + flake8 """ + warnings.warn( + 'Migrate to: cli_base.cli_tools.code_style.check !', + DeprecationWarning, + stacklevel=2, + ) _call_darker('--check', color=color, verbose=verbose, package_root=package_root) if verbose: diff --git a/pyproject.toml b/pyproject.toml index 31c8c8a..d43fa2f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "codespell", # https://github.com/codespell-project/codespell "mypy", # https://github.com/python/mypy - "cli-base-utilities>=0.5.0", # https://github.com/jedie/cli-base-utilities + "cli-base-utilities>=0.6.0", # https://github.com/jedie/cli-base-utilities "click", # https://github.com/pallets/click/ "rich-click", # https://github.com/ewels/rich-click "rich", # https://github.com/Textualize/rich diff --git a/requirements.dev.txt b/requirements.dev.txt index 81710e2..16d152c 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -216,9 +216,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.5.0 \ - --hash=sha256:366caa000bb0908914bc09e7b9cc2b6921bcf51e0aa2a91ae36cd5e092d774d8 \ - --hash=sha256:67eec2c61b00ed9f376ca364e6ef85d65db6c0908cf530d7015483ef2902f27e +cli-base-utilities==0.6.0 \ + --hash=sha256:c3e0efafca519f7f79a1aff67d099987d849f1c3d795c4e605b6b9be49537712 \ + --hash=sha256:e403c6e584508aa69cc093b7a325127f6ef9835624e4fde7f104e941314645a9 # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ diff --git a/requirements.txt b/requirements.txt index 03abd08..20e1e03 100644 --- a/requirements.txt +++ b/requirements.txt @@ -152,9 +152,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -cli-base-utilities==0.5.0 \ - --hash=sha256:366caa000bb0908914bc09e7b9cc2b6921bcf51e0aa2a91ae36cd5e092d774d8 \ - --hash=sha256:67eec2c61b00ed9f376ca364e6ef85d65db6c0908cf530d7015483ef2902f27e +cli-base-utilities==0.6.0 \ + --hash=sha256:c3e0efafca519f7f79a1aff67d099987d849f1c3d795c4e605b6b9be49537712 \ + --hash=sha256:e403c6e584508aa69cc093b7a325127f6ef9835624e4fde7f104e941314645a9 # via manageprojects (pyproject.toml) click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ From e3973ac4f5cff3bb6484496f7f72125720a3015e Mon Sep 17 00:00:00 2001 From: JensDiemer Date: Sat, 2 Dec 2023 00:34:10 +0100 Subject: [PATCH 4/4] Release as v0.16.0 --- README.md | 2 +- manageprojects/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 750deac..8385fa6 100644 --- a/README.md +++ b/README.md @@ -321,7 +321,7 @@ See also git tags: https://github.com/jedie/manageprojects/tags [comment]: <> (✂✂✂ auto generated history start ✂✂✂) -* [**dev**](https://github.com/jedie/manageprojects/compare/v0.15.4...main) +* [v0.16.0](https://github.com/jedie/manageprojects/compare/v0.15.4...v0.16.0) * 2023-12-02 - Use code style tooling from cli-base-utilities * 2023-12-01 - Apply https://github.com/jedie/cookiecutter_templates updates * 2023-12-01 - Use: cli_base.cli_tools.test_utils.logs.AssertLogs diff --git a/manageprojects/__init__.py b/manageprojects/__init__.py index 45f9dcc..0a6dcc4 100644 --- a/manageprojects/__init__.py +++ b/manageprojects/__init__.py @@ -3,5 +3,5 @@ Manage Python / Django projects """ -__version__ = '0.15.4' +__version__ = '0.16.0' __author__ = 'Jens Diemer '